1use strict; 2use warnings; 3use Test::More; 4BEGIN { $ENV{PERL_JSON_BACKEND} = 0; } 5use JSON::PP; 6 7BEGIN { plan skip_all => "requires Perl 5.008 or later" if $] < 5.008 } 8 9#SKIP_ALL_UNLESS_XS4_COMPAT 10 11package # 12 Dummy::True; 13*Dummy::True:: = *JSON::PP::Boolean::; 14 15package # 16 Dummy::False; 17*Dummy::False:: = *JSON::PP::Boolean::; 18 19package main; 20 21my $dummy_true = bless \(my $dt = 1), 'Dummy::True'; 22my $dummy_false = bless \(my $df = 0), 'Dummy::False'; 23 24my @tests = ([$dummy_true, $dummy_false, 'Dummy::True', 'Dummy::False']); 25 26# extra boolean classes 27if (eval "require boolean; 1") { 28 push @tests, [boolean::true(), boolean::false(), 'boolean', 'boolean', 1]; 29} 30if (eval "require JSON::PP; 1") { 31 push @tests, [JSON::PP::true(), JSON::PP::false(), 'JSON::PP::Boolean', 'JSON::PP::Boolean']; 32} 33if (eval "require Data::Bool; 1") { 34 push @tests, [Data::Bool::true(), Data::Bool::false(), 'Data::Bool::Impl', 'Data::Bool::Impl']; 35} 36if (eval "require Types::Serialiser; 1") { 37 push @tests, [Types::Serialiser::true(), Types::Serialiser::false(), 'Types::Serialiser::BooleanBase', 'Types::Serialiser::BooleanBase']; 38} 39 40plan tests => 15 * @tests; 41 42my $json = JSON::PP->new; 43for my $test (@tests) { 44 my ($true, $false, $true_class, $false_class, $incompat) = @$test; 45 46 my $ret = $json->boolean_values($false, $true); 47 is $ret => $json, "returns the same object"; 48 my ($new_false, $new_true) = $json->get_boolean_values; 49 ok defined $new_true, "new true class is defined"; 50 ok defined $new_false, "new false class is defined"; 51 ok $new_true->isa($true_class), "new true class is $true_class"; 52 ok $new_false->isa($false_class), "new false class is $false_class"; 53 SKIP: { 54 skip "$true_class is not compatible with JSON::PP::Boolean", 2 if $incompat; 55 ok $new_true->isa('JSON::PP::Boolean'), "new true class is also JSON::PP::Boolean"; 56 ok $new_false->isa('JSON::PP::Boolean'), "new false class is also JSON::PP::Boolean"; 57 } 58 59 my $should_true = $json->allow_nonref(1)->decode('true'); 60 ok $should_true->isa($true_class), "JSON true turns into a $true_class object"; 61 62 my $should_false = $json->allow_nonref(1)->decode('false'); 63 ok $should_false->isa($false_class), "JSON false turns into a $false_class object"; 64 65 SKIP: { 66 skip "$true_class is not compatible with JSON::PP::Boolean", 2 if $incompat; 67 my $should_true_json = eval { $json->allow_nonref(1)->encode($new_true); }; 68 is $should_true_json => 'true', "A $true_class object turns into JSON true"; 69 70 my $should_false_json = eval { $json->allow_nonref(1)->encode($new_false); }; 71 is $should_false_json => 'false', "A $false_class object turns into JSON false"; 72 } 73 74 $ret = $json->boolean_values(); 75 is $ret => $json, "returns the same object"; 76 ok !$json->get_boolean_values, "reset boolean values"; 77 78 $should_true = $json->allow_nonref(1)->decode('true'); 79 ok $should_true->isa('JSON::PP::Boolean'), "JSON true turns into a JSON::PP::Boolean object"; 80 81 $should_false = $json->allow_nonref(1)->decode('false'); 82 ok $should_false->isa('JSON::PP::Boolean'), "JSON false turns into a JSON::PP::Boolean object"; 83} 84