Permalink
Browse files

Add Test::JSON to git.

  • Loading branch information...
Ovid committed Jun 29, 2009
0 parents commit 4d9553d8f26e5c28f542df02fbd9db1594b3db42
Showing with 380 additions and 0 deletions.
  1. +19 −0 Build.PL
  2. +22 −0 Changes
  3. +11 −0 MANIFEST
  4. +22 −0 META.yml
  5. +17 −0 Makefile.PL
  6. +19 −0 README
  7. +173 −0 lib/Test/JSON.pm
  8. +9 −0 t/00-load.t
  9. +76 −0 t/10testjson.t
  10. +6 −0 t/pod-coverage.t
  11. +6 −0 t/pod.t
@@ -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 <ovid@cpan.org>',
+ 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();
22 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.
+
@@ -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
@@ -0,0 +1,22 @@
+---
+name: Test-JSON
+version: 0.06
+author:
+ - 'Curtis "Ovid" Poe <ovid@cpan.org>'
+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
@@ -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' => {}
+ )
+;
19 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.
@@ -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<Test::JSON> makes it easy to verify that you have built valid JSON and that
+it matches your expected output.
+
+See L<http://www.json.org/> 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<Test::Differences> 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<< <ovid@cpan.org> >>
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-test-json@rt.cpan.org>, or through the web interface at
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-JSON>.
+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<JSON::Any> and L<Test::Differences>.
+
+=head1 ACKNOWLEDGEMENTS
+
+The development of this module was sponsored by Kineticode,
+L<http://www.kineticode.com/>, the leading provider of services for the
+Bricolage content management system, L<http://www.bricolage.cc/>.
+
+Thanks to Makamaka Hannyaharamitu C<makamaka@cpan.org> for a patch to make
+this work with JSON 2.0.
+
+Thanks to Stevan Little for suggesting a switch to L<JSON::Any>. 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;
@@ -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" );
@@ -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
+);
@@ -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();
@@ -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();

0 comments on commit 4d9553d

Please sign in to comment.