
use strict;
use warnings;
no warnings 'once';
use Test::More;
use JSON::Tiny;

my $j = JSON::Tiny->new;

my $rv = $j->decode('{ "a":false, "b":true }');

ok(
  $rv->{'a'}->isa('JSON::Tiny::_Bool'),
  'Decoding a "false" Boolean yields JSON::Tiny::_Bool object.'
);

ok(
  $rv->{'b'}->isa('JSON::Tiny::_Bool'),
  'Decoding a "true" Boolean yields JSON::Tiny::_Bool object.'
);

is( ref($rv->{'a'}), 'JSON::Tiny::_Bool', 'ref detects JSON::Tiny::_Bool' );
is(
  ref($rv->{'b'}), 'JSON::Tiny::_Bool',
  'ref detects JSON::Tiny::_Bool type (true)'
);


{
  local $JSON::Tiny::FALSE = 0;
  local $JSON::Tiny::TRUE  = 1;

  $rv = $j->decode('{"a":false, "b":true}');

  is( $rv->{'a'}, 0, 'Overridden Boolean false yields 0' );
  is( $rv->{'b'}, 1, 'Overridden Boolean true yields 1' );

  is(
    ref($rv->{'a'}), '',
    'Overriding Boolean false assumes correct type.'
  );

  is(
    ref($rv->{'b'}), '',
    'Overriding Boolean true assumes correct type.'
  );
}

$rv = $j->decode('{"a":false, "b":true}');

is( ref($rv->{'b'}), 'JSON::Tiny::_Bool',
  'JSON::Tiny::_Bool is back after localized change to $JSON::Tiny::FALSE ' .
  'falls from scope.'
);
is( ref($rv->{'a'}), 'JSON::Tiny::_Bool',
  'JSON::Tiny::_Bool is back after localized change to $JSON::Tiny::TRUE ' .
  'falls from scope.'
);

$rv = $j->encode({ a=>\0, b=>\1 });
like( $rv, qr/"b":true/,  'Reference to \\1 yields true.'  );
like( $rv, qr/"a":false/, 'Reference to \\0 yields false.' );

done_testing();
