Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Curtis Poe
committed
Jun 29, 2009
0 parents
commit 4d9553d
Showing
11 changed files
with
380 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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. | |||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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' => {} | |||
) | |||
; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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" ); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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 | |||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -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(); |