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