The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use strict;
BEGIN { plan tests => 40 };
use JSON;

use CGI;
use IO::File;

my ($obj, $obj2, $js);

$obj  = new MyTest;
$js = objToJson($obj);
ok(!defined $js);

{
local $JSON::ConvBlessed = 1;
local $JSON::AUTOCONVERT = 1;

my ($obj, $obj2, $js);

$obj  = new MyTest;
$obj2 = new MyTest2;

@{$obj2} = (1,2,3);

$obj->{a} = $obj2;
$obj->{b} = q|{'a' => bless( {}, 'MyTest' )}|;
$obj->{c} = new CGI;
$obj->{d} = JSON::Number(1.3);
$obj->{e} = 1.3;

$js = objToJson($obj);


like($js, qr/"a":\[1,2,3\]/);
like($js, qr/"b":"{'a' => bless\( {}, 'MyTest' \)}"/);
like($js, qr/"d":1.3/);
like($js, qr/"e":1.3/);

my $obj3 = jsonToObj($js);

is($obj3->{a}->[0], $obj->{a}->[0]);
is($obj3->{a}->[1], $obj->{a}->[1]);
is($obj3->{a}->[2], $obj->{a}->[2]);

is($obj3->{b}, $obj->{b});
is($obj3->{d}, "$obj->{d}");

$js = objToJson([$obj]);

like($js, qr/^\[{"[a-e]"/);
like($js, qr/"a":\[1,2,3\]/);
like($js, qr/"b":"{'a' => bless\( {}, 'MyTest' \)}"/);
like($js, qr/"d":1.3/);

$js = objToJson({hoge => $obj});

like($js, qr/^{"hoge":{"[a-e]"/);
like($js, qr/"a":\[1,2,3\]/);
like($js, qr/"b":"{'a' => bless\( {}, 'MyTest' \)}"/);
like($js, qr/"d":1.3/);

}



{
local $JSON::ConvBlessed = 1;
local $JSON::AUTOCONVERT = 1;


$obj  = new MyTest;
$obj2 = new MyTest2;

@{$obj2} = (1,2,3);

$obj->{a} = $obj2;
$obj->{b} = q|{'a' => bless( {}, 'MyTest' )}|;
$obj->{c} = new CGI;
$obj->{d} = JSON::Number(1.3);
$obj->{e} = 1.3;

$js = objToJson($obj);

#print $js,"\n";

like($js, qr/"a":\[1,2,3\]/);
like($js, qr/"b":"{'a' => bless\( {}, 'MyTest' \)}"/);
like($js, qr/"d":1.3/);
like($js, qr/"e":1.3/);

my $obj3 = jsonToObj($js);

is($obj3->{a}->[0], $obj->{a}->[0]);
is($obj3->{a}->[1], $obj->{a}->[1]);
is($obj3->{a}->[2], $obj->{a}->[2]);

is($obj3->{b}, $obj->{b});
is($obj3->{d}, "$obj->{d}");

}


{
local $JSON::ConvBlessed = 1;
local $JSON::AUTOCONVERT = 0;


$obj  = new MyTest;
$obj2 = new MyTest2;

@{$obj2} = (JSON::Number(1),JSON::Number(2),JSON::Number(3));

$obj->{a} = $obj2;
$obj->{b} = q|{'a' => bless( {}, 'MyTest' )}|;
$obj->{c} = new CGI;
$obj->{d} = JSON::Number(1.3);
$obj->{e} = 1.3;

$js = objToJson($obj);

#print $js,"\n";

like($js, qr/"a":\[1,2,3\]/);
like($js, qr/"b":"{'a' => bless\( {}, 'MyTest' \)}"/);
like($js, qr/"d":1.3/);
like($js, qr/"e":1.3/);

my $obj3 = jsonToObj($js);

is($obj3->{a}->[0], "$obj->{a}->[0]");
is($obj3->{a}->[1], "$obj->{a}->[1]");
is($obj3->{a}->[2], "$obj->{a}->[2]");

is($obj3->{b}, $obj->{b});
is($obj3->{d}, "$obj->{d}");

}

my $json = new JSON;

$obj  = new MyTest;
$obj2 = new MyTest2;

@{$obj2} = (1,2,3);

$obj->{a} = $obj2;
$obj->{b} = q|{'a' => bless( {}, 'MyTest' )}|;
$obj->{c} = new CGI;
$obj->{d} = JSON::Number(1.3);
$obj->{e} = 1.3;

$json->convblessed(1);
$js = $json->objToJson($obj);
like($js, qr/"a":\[1,2,3\]/);

$json->convblessed(0);
$js = $json->objToJson($obj);
ok(!defined $js);

$json = JSON->new(convblessed => 0);
$js = $json->objToJson($obj);
ok(!defined $js);

$json = JSON->new(convblessed => 1);
$js = $json->objToJson($obj);
like($js, qr/"a":\[1,2,3\]/);

########################
package MyTest;

use overload (
	'""' => sub { 'test' },
);

sub new  { bless {}, shift; }


package MyTest2;

use overload (
	'""' => sub { 'test' },
);

sub new  { bless [], shift; }

__END__