The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use warnings;
use Test::More tests => 15;
use Cpanel::JSON::XS;

my $js = Cpanel::JSON::XS->new;
my @data = ('null', 'true', 'false', "1", "\"test\"");
my %map = ( 'null' => undef, true => 1, false => 0, 
            '1' => 1, '"test"' => "test" );

for my $k (@data) {
  my $data = $js->decode("{\"foo\":$k}");
  my $res = $data->{foo} || $k;
  ok exists $data->{foo}, "foo hvalue exists";
  if ($k eq 'true' and $res eq 'true') {
    # https://github.com/rurban/Cpanel-JSON-XS/issues/45#issuecomment-160602267
    # Older Test::More <5.12 cannot compare 1 to true.
    # We only care about the next test, modifiability,
    # not the representation of true and its eq overload.
    is $data->{foo}, $res, "foo hvalue $res (special case)";
  } else {
    is $data->{foo}, $map{$k}, "foo hvalue $res";
  }
  ok $data->{foo} = "bar", "foo can be set from $res to 'bar'";
}