use Test::More tests => 53;
use JSON::Syck qw(Dump);
my @arr1 = sort {$a cmp $b} qw/1 2 54 howdy/;
is(Dump(\@arr1), '["1","2","54","howdy"]', "cmp sort causes numbers to coerce into strings and thus be quoted.");
{
no warnings "numeric";
my @arr2 = sort {$a <=> $b} qw/1 2 54 howdy/;
is(Dump(\@arr2), '["howdy","1","2","54"]', "Numeric sort doesn't coerce non-numeric strings into numbers because they still contain their valid string");
}
my @arr54 = ("howdy",1,2,54);
is(Dump(\@arr54), '["howdy",1,2,54]', "Strings are quoted. Numbers are not");
is(Dump('042'), '"042"', "Ocatls don't get treated as numbers");
is(Dump('0x42'), '"0x42"', "Hex doesn't get treated as a number");
is(Dump('0.42'), '"0.42"', "Floats with leading 0 don't get excluded by octal check");
is(Dump('1_000_000'), '"1_000_000"', "numbers with underscores get quoted.");
is(Dump('1,000,000'), '"1,000,000"', "numbers with commas get quoted.");
is(Dump('1e+6'), '"1e+6"', "Scientific notation gets quoted.");
is(Dump('10e+6'), '"10e+6"', "Scientific notation gets quoted.");
is(Dump('0123'), '"0123"', "Scientific notation gets quoted.");
# for simple integers, we need to preserve their string state as perl knows it if possible.
# JSON overloaded + for string concatenation. This means you get all sorts of wierdness if we try to strip quotes on strings not IVs
# "0" is true 0 is false. 1 + 1 = 2 but "1" + "1" = "11"
for(-10..10) {
is(Dump($_), $_, '"0" != 0 in JSON. 0 is false "0" is true.');
is(Dump("$_"), "\"$_\"", 'Strigified integer is stringified in JSON');
}