From 4d9553d8f26e5c28f542df02fbd9db1594b3db42 Mon Sep 17 00:00:00 2001 From: Curtis Poe Date: Mon, 29 Jun 2009 19:20:50 +0100 Subject: [PATCH] Add Test::JSON to git. --- Build.PL | 19 ++++++ Changes | 22 ++++++ MANIFEST | 11 +++ META.yml | 22 ++++++ Makefile.PL | 17 +++++ README | 19 ++++++ lib/Test/JSON.pm | 173 +++++++++++++++++++++++++++++++++++++++++++++++ t/00-load.t | 9 +++ t/10testjson.t | 76 +++++++++++++++++++++ t/pod-coverage.t | 6 ++ t/pod.t | 6 ++ 11 files changed, 380 insertions(+) create mode 100644 Build.PL create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 META.yml create mode 100644 Makefile.PL create mode 100644 README create mode 100644 lib/Test/JSON.pm create mode 100644 t/00-load.t create mode 100644 t/10testjson.t create mode 100644 t/pod-coverage.t create mode 100644 t/pod.t diff --git a/Build.PL b/Build.PL new file mode 100644 index 0000000..221cbc3 --- /dev/null +++ b/Build.PL @@ -0,0 +1,19 @@ +use strict; +use Module::Build; + +my $builder = Module::Build->new( + module_name => 'Test::JSON', + license => 'perl', + dist_author => 'Curtis "Ovid" Poe ', + dist_version_from => 'lib/Test/JSON.pm', + requires => { + 'JSON::Any' => 1.14, + 'Test::Differences' => 0.47, + 'Test::Simple' => 0.62, + 'Test::Tester' => 0.103, + }, + add_to_cleanup => ['Test-JSON-*'], + create_makefile_pl => 'traditional', +); + +$builder->create_build_script(); diff --git a/Changes b/Changes new file mode 100644 index 0000000..a24b407 --- /dev/null +++ b/Changes @@ -0,0 +1,22 @@ +Revision history for Test-JSON + +0.06 2007-12-29 + Minor documentation updates. + +0.05 2007-12-29 + Converted to JSON::Any. + +0.04 2007-12-29 + Took out all support for versions of JSON prior to 2.0 due to + installation bugs. + +0.03 2007-12-29 + Updated to work with JSON 2.0 or earlier. Thanks to Makamaka + Hannyaharamitu for a preliminary patch. + +0.02 2005-11-15 + Updated the level setting in is_json() to reflect the correct level. + +0.01 2005-11-12 + Easy JSON testing. + diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..31e9ebf --- /dev/null +++ b/MANIFEST @@ -0,0 +1,11 @@ +Build.PL +Changes +lib/Test/JSON.pm +MANIFEST +META.yml # Will be created by "make dist" +README +t/00-load.t +t/10testjson.t +t/pod-coverage.t +t/pod.t +Makefile.PL diff --git a/META.yml b/META.yml new file mode 100644 index 0000000..e3b4572 --- /dev/null +++ b/META.yml @@ -0,0 +1,22 @@ +--- +name: Test-JSON +version: 0.06 +author: + - 'Curtis "Ovid" Poe ' +abstract: Test JSON data +license: perl +resources: + license: http://dev.perl.org/licenses/ +requires: + JSON::Any: 1.14 + Test::Differences: 0.47 + Test::Simple: 0.62 + Test::Tester: 0.103 +provides: + Test::JSON: + file: lib/Test/JSON.pm + version: 0.06 +generated_by: Module::Build version 0.2808 +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.2.html + version: 1.2 diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..e87ea0b --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,17 @@ +# Note: this file was auto-generated by Module::Build::Compat version 0.03 +use ExtUtils::MakeMaker; +WriteMakefile +( + 'NAME' => 'Test::JSON', + 'VERSION_FROM' => 'lib/Test/JSON.pm', + 'PREREQ_PM' => { + 'JSON::Any' => '1.14', + 'Test::Differences' => '0.47', + 'Test::Simple' => '0.62', + 'Test::Tester' => '0.103' + }, + 'INSTALLDIRS' => 'site', + 'EXE_FILES' => [], + 'PL_FILES' => {} + ) +; diff --git a/README b/README new file mode 100644 index 0000000..aa7095b --- /dev/null +++ b/README @@ -0,0 +1,19 @@ +Test-JSON + +This module allows for easy testing of JSON data. + +INSTALLATION + +To install this module, run the following commands: + + perl Build.PL + ./Build + ./Build test + ./Build install + +COPYRIGHT AND LICENCE + +Copyright (C) 2005 Curtis "Ovid" Poe + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. diff --git a/lib/Test/JSON.pm b/lib/Test/JSON.pm new file mode 100644 index 0000000..a90db99 --- /dev/null +++ b/lib/Test/JSON.pm @@ -0,0 +1,173 @@ +package Test::JSON; + +use strict; +use Carp; +use Test::Builder; +use Test::Differences; +use JSON::Any; + +=head1 NAME + +Test::JSON - Test JSON data + +=head1 VERSION + +Version 0.06 + +=cut + +our $VERSION = '0.06'; + +my $TEST = Test::Builder->new; +my $JSON = JSON::Any->new; + +sub import { + my $self = shift; + my $caller = caller; + + my @subs = qw/is_json is_valid_json/; + foreach my $sub (@subs) { + no strict 'refs'; + *{"${caller}::$sub"} = \&{$sub}; + } + + $TEST->exported_to($caller); + $TEST->plan(@_); +} + +=head1 SYNOPSIS + + use Test::JSON; + + is_valid_json $json, '... json is well formed'; + is_json $json, $expected_json, '... and it matches what we expected'; + +=head1 EXPORT + +=over 4 + +=item * is_valid_json + +=item * is_json + +=back + +=head1 DESCRIPTION + +JavaScript Object Notation (JSON) is a lightweight data interchange format. +L makes it easy to verify that you have built valid JSON and that +it matches your expected output. + +See L for more information. + +=head1 TESTS + +=head2 is_valid_json + + is_valid_json $json, '... json is well formed'; + +Test passes if the string passed is valid JSON. + +=head2 is_json + + is_json $json, $expected_json, '... and it matches what we expected'; + +Test passes if the two JSON strings are valid JSON and evaluate to the same +data structure. + +L is used to provide easy diagnostics of why the JSON +structures did not match. For example: + + Failed test '... and identical JSON should match' + in t/10testjson.t at line 14. + +----+---------------------------+---------------------------+ + | Elt|Got |Expected | + +----+---------------------------+---------------------------+ + | 0|{ |{ | + | 1| bool => '1', | bool => '1', | + | 2| description => bless( { | description => bless( { | + | 3| value => undef | value => undef | + | 4| }, 'JSON::NotString' ), | }, 'JSON::NotString' ), | + | 5| id => '1', | id => '1', | + * 6| name => 'foo' | name => 'fo' * + | 7|} |} | + +----+---------------------------+---------------------------+ + +=cut + +sub is_valid_json ($;$) { + my ( $input, $test_name ) = @_; + croak "usage: is_valid_json(input,test_name)" + unless defined $input; + eval { $JSON->decode($input) }; + if ( my $error = $@ ) { + $TEST->ok( 0, $test_name ); + $TEST->diag("Input was not valid JSON:\n\n\t$error"); + return; + } + else { + $TEST->ok( 1, $test_name ); + return 1; + } +} + +sub is_json ($$;$) { + my ( $input, $expected, $test_name ) = @_; + croak "usage: is_json(input,expected,test_name)" + unless defined $input && defined $expected; + + my %json_for; + foreach my $item ( [ input => $input ], [ expected => $expected ] ) { + my $json = eval { $JSON->decode( $item->[1] ) }; + if ( my $error = $@ ) { + $TEST->ok( 0, $test_name ); + $TEST->diag("$item->[0] was not valid JSON: $error"); + return; + } + else { + $json_for{ $item->[0] } = $json; + } + } + local $Test::Builder::Level = $Test::Builder::Level + 1; + eq_or_diff( $json_for{input}, $json_for{expected}, $test_name ); +} + +=head1 AUTHOR + +Curtis "Ovid" Poe, C<< >> + +=head1 BUGS + +Please report any bugs or feature requests to +C, or through the web interface at +L. +I will be notified, and then you'll automatically be notified of progress on +your bug as I make changes. + +=head1 SEE ALSO + +This test module uses L and L. + +=head1 ACKNOWLEDGEMENTS + +The development of this module was sponsored by Kineticode, +L, the leading provider of services for the +Bricolage content management system, L. + +Thanks to Makamaka Hannyaharamitu C for a patch to make +this work with JSON 2.0. + +Thanks to Stevan Little for suggesting a switch to L. This makes +it easier for this module to work with whatever JSON module you have +installed. + +=head1 COPYRIGHT & LICENSE + +Copyright 2005-2007 Curtis "Ovid" Poe, all rights reserved. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=cut + +1; diff --git a/t/00-load.t b/t/00-load.t new file mode 100644 index 0000000..48400eb --- /dev/null +++ b/t/00-load.t @@ -0,0 +1,9 @@ +#!perl -T + +use Test::More tests => 1; + +BEGIN { + use_ok( 'Test::JSON' ); +} + +diag( "Testing Test::JSON $Test::JSON::VERSION, Perl $], $^X" ); diff --git a/t/10testjson.t b/t/10testjson.t new file mode 100644 index 0000000..bbe3474 --- /dev/null +++ b/t/10testjson.t @@ -0,0 +1,76 @@ +#!perl + +use Test::Tester; +use Test::JSON; +use Test::More tests => 36; + +my $json = '{"bool":1,"name":"foo","id":1,"description":null}'; +my $good = '{"bool":1,"name":"foo","id":1,"description":null}'; + +my $desc = 'identical JSON should match'; +check_test( + sub { is_json $json, $good, $desc }, + { + ok => 1, + name => $desc, + }, + $desc +); + +$good = '{"bool":1,"id":1,"name":"foo","description":null}'; + +$desc = 'attribute order should not matter'; +check_test( + sub { is_json $json, $good, $desc }, + { + ok => 1, + name => $desc, + }, + $desc +); + +# "null" is misspelled +my $invalid = '{"bool":1,"name":"fo","id":1,"description":nul}'; +$desc = 'Invalid json should fail'; +check_test( + sub { is_json $json, $invalid, $desc }, + { + ok => 0, + name => $desc, + }, + $desc +); + +# "fo" should be "foo" +my $not_the_same = '{"bool":1,"name":"fo","id":1,"description":null}'; +$desc = 'Different JSON should fail'; +check_test( + sub { is_json $json, $not_the_same, $desc }, + { + ok => 0, + name => $desc, + }, + $desc +); + +$json = '{"bool":1,"name":"fo","id":1,"description":null}'; +$desc = 'Valid JSON should succeed'; +check_test( + sub { is_valid_json $json, $desc }, + { + ok => 1, + name => $desc, + }, + $desc +); + +$invalid = '{"bool":1,"name":"fo","id":1,"description":nul}'; +$desc = 'Invalid JSON should fail'; +check_test( + sub { is_valid_json $invalid, $desc }, + { + ok => 0, + name => $desc, + }, + $desc +); diff --git a/t/pod-coverage.t b/t/pod-coverage.t new file mode 100644 index 0000000..703f91d --- /dev/null +++ b/t/pod-coverage.t @@ -0,0 +1,6 @@ +#!perl -T + +use Test::More; +eval "use Test::Pod::Coverage 1.04"; +plan skip_all => "Test::Pod::Coverage 1.04 required for testing POD coverage" if $@; +all_pod_coverage_ok(); diff --git a/t/pod.t b/t/pod.t new file mode 100644 index 0000000..976d7cd --- /dev/null +++ b/t/pod.t @@ -0,0 +1,6 @@ +#!perl -T + +use Test::More; +eval "use Test::Pod 1.14"; +plan skip_all => "Test::Pod 1.14 required for testing POD" if $@; +all_pod_files_ok();