use Test::More;
use strict;
BEGIN { plan tests => 60 };
use JSON;
#########################
my ($js,$obj);
$js = q|{}|;
$obj = jsonToObj($js);
$js = objToJson($obj);
is($js,'{}');
$js = q|[]|;
$obj = jsonToObj($js);
$js = objToJson($obj);
is($js,'[]');
$js = q|{"foo":"bar"}|;
$obj = jsonToObj($js);
is($obj->{foo},'bar');
$js = objToJson($obj);
is($js,'{"foo":"bar"}');
$js = q|{"foo":""}|;
$obj = jsonToObj($js);
$js = objToJson($obj);
is($js,'{"foo":""}');
$js = q|{"foo":" "}|;
$obj = jsonToObj($js);
$js = objToJson($obj);
is($js,'{"foo":" "}');
{ local $JSON::AUTOCONVERT = 0;
$js = q|{"foo":"0"}|;
$obj = jsonToObj($js);
$js = objToJson($obj);
is($js,'{"foo":"0"}',q|{"foo":"0"} - NO AUTOCONVERT|);
}
$js = q|{"foo":"0 0"}|;
$obj = jsonToObj($js);
$js = objToJson($obj);
is($js,'{"foo":"0 0"}','{"foo":"0 0"}');
$js = q|[1,2,3]|;
$obj = jsonToObj($js);
is(join(',',@$obj),'1,2,3');
$js = objToJson($obj);
is($js,'[1,2,3]');
$js = q|{"foo":[1,2,3]}|;
$obj = jsonToObj($js);
is(join(',',@{$obj->{foo}}),'1,2,3');
$js = objToJson($obj);
is($js,'{"foo":[1,2,3]}');
$js = q|{"foo":{"bar":"hoge"}}|;
$obj = jsonToObj($js);
is($obj->{foo}->{bar},'hoge');
$js = objToJson($obj);
is($js,q|{"foo":{"bar":"hoge"}}|);
$js = q|[{"foo":[1,2,3]},-0.12,{"a":"b"}]|;
$obj = jsonToObj($js);
is(join(',',@{$obj->[0]->{foo}}),'1,2,3');
is(join(',',$obj->[1]),'-0.12');
is(join(',',$obj->[2]->{a}),'b');
$js = objToJson($obj);
is($js,q|[{"foo":[1,2,3]},-0.12,{"a":"b"}]|);
$js = q|[true,false,null]|;
$obj = jsonToObj($js);
isa_ok($obj->[0],'JSON::NotString');
isa_ok($obj->[1],'JSON::NotString');
isa_ok($obj->[2],'JSON::NotString');
ok($obj->[0],'true');
ok(!$obj->[1],'false');
ok(!$obj->[2],'null');
$js = objToJson($obj);
is($js,'[true,false,null]');
ok($obj->[0] eq 'true', 'eq true');
ok($obj->[0] ne 'false', 'ne false');
ok($obj->[1] eq 'false', 'eq false');
ok($obj->[1] ne 'true', 'ne true');
ok($obj->[2] eq 'null', 'eq null');
ok($obj->[2] ne 'true', 'ne true');
ok($obj->[2] ne 'false', 'ne false');
ok($obj->[0] eq $obj->[0]);
ok($obj->[0] ne $obj->[1]);
ok($obj->[2] eq $obj->[2]);
ok($obj->[2] ne $obj->[0]);
ok($obj->[2] ne $obj->[1]);
ok($obj->[0] == 1);
ok($obj->[0] != 0);
ok($obj->[1] == 0);
ok($obj->[1] != 1);
ok($obj->[2] != 1 and $obj->[2] != 0);
{ local $JSON::UnMapping = 1;
$js = q|[true,false,null]|;
$obj = jsonToObj($js);
is($obj->[0],1,'unmapping true');
is($obj->[1],0,'unmapping false');
ok(!defined $obj->[2],'unmapping null');
}
$js = objToJson([JSON::True, JSON::False, JSON::Null]);
is($js,'[true,false,null]', 'JSON::NotString [true,false,null]');
$obj = ["\x01"];
is($js = objToJson($obj),'["\\u0001"]');
$obj = jsonToObj($js);
is($obj->[0],"\x01");
$obj = ["\e"];
is($js = objToJson($obj),'["\\u001b"]');
$obj = jsonToObj($js);
is($obj->[0],"\e");
$js = '{"id":"}';
eval q{ jsonToObj($js) };
#jsonToObj($js);
like($@, qr/Bad string/i, 'Bad string');
{ local $JSON::ExecCoderef = 1;
$obj = { foo => sub { "bar"; } };
$js = objToJson($obj);
is($js, '{"foo":"bar"}', "coderef bar");
$obj = { foo => sub { return } };
$js = objToJson($obj);
is($js, '{"foo":null}', "coderef undef");
$obj = { foo => sub { [1, 2, {foo => "bar"}]; } };
$js = objToJson($obj);
is($js, '{"foo":[1,2,{"foo":"bar"}]}', "coderef complex");
}
{ local $JSON::ExecCoderef = 0;
local $JSON::SkipInvalid = 1;
$obj = { foo => sub { "bar"; } };
$js = objToJson($obj);
is($js, '{"foo":null}', "skipinvalid && coderef bar");
}
$obj = { foo => sub { "bar"; } };
eval q{ $js = objToJson($obj) };
like($@, qr/Invalid value/i, 'invalid value (coderef)');
$obj = { foo => *STDERR };
$js = objToJson($obj);
is($js, '{"foo":"*main::STDERR"}', "type blog");
$obj = { foo => \*STDERR };
eval q{ $js = objToJson($obj) };
like($@, qr/Invalid value/i, 'invalid value (ref of type blog)');
$obj = { foo => new JSON };
eval q{ $js = objToJson($obj) };
like($@, qr/Invalid value/i, 'invalid value (blessd object)');
$obj = { foo => \$js };
eval q{ $js = objToJson($obj) };
like($@, qr/Invalid value/i, 'invalid value (ref)');