Skip to content

Commit

Permalink
Add Test::JSON to git.
Browse files Browse the repository at this point in the history
  • Loading branch information
Curtis Poe committed Jun 29, 2009
0 parents commit 4d9553d
Show file tree
Hide file tree
Showing 11 changed files with 380 additions and 0 deletions.
19 changes: 19 additions & 0 deletions 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 <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: 22 additions & 0 deletions 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.

11 changes: 11 additions & 0 deletions 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
22 changes: 22 additions & 0 deletions META.yml
@@ -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
17 changes: 17 additions & 0 deletions 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' => {}
)
;
19 changes: 19 additions & 0 deletions 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.
173 changes: 173 additions & 0 deletions 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<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;
9 changes: 9 additions & 0 deletions 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" );
76 changes: 76 additions & 0 deletions 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
);
6 changes: 6 additions & 0 deletions 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();
6 changes: 6 additions & 0 deletions 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();

0 comments on commit 4d9553d

Please sign in to comment.