1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#!/usr/bin/env perl
use strict;
my $has_bignum;
BEGIN {
eval q| require Math::BigInt |;
$has_bignum = $@ ? 0 : 1;
}
use Test::More $has_bignum
? (tests => 20)
: (skip_all => "Can't load Math::BigInt");
use Cpanel::JSON::XS;
use Scalar::Util ();
use Devel::Peek;
my $json = new Cpanel::JSON::XS;
$json->allow_bignum; # is implicitly allow_nonref and convert_blessed
# $json->convert_blessed->allow_blessed;
my $num = $json->decode(q|100000000000000000000000000000000000000|);
isa_ok($num, 'Math::BigInt');
is($num->bcmp('100000000000000000000000000000000000000'), 0, 'decode bigint')
or Dump ($num);
my $e = $json->encode($num);
is($e, '100000000000000000000000000000000000000', 'encode bigint')
or Dump( $e );
$num = $json->decode(q|2.0000000000000000001|);
isa_ok($num, 'Math::BigFloat');
is("$num", '2.0000000000000000001', 'decode bigfloat') or Dump $num;
$e = $json->encode($num);
is($e, '2.0000000000000000001', 'encode bigfloat') or Dump $e;
$num = $json->decode(q|[100000000000000000000000000000000000000]|)->[0];
isa_ok( $num, 'Math::BigInt' );
is(
$num->bcmp('100000000000000000000000000000000000000'),
0,
'decode bigint inside structure'
) or Dump($num);
$num = $json->decode(q|[2.0000000000000000001]|)->[0];
isa_ok( $num, 'Math::BigFloat' );
is( "$num", '2.0000000000000000001', 'decode bigfloat inside structure' )
or Dump $num;
my $bignan = Math::BigInt->new("NaN");
my $nan = $json->encode($bignan);
is( "$nan", 'null', 'nan default' );
$nan = $json->stringify_infnan(0)->encode($bignan);
is( "$nan", 'null', 'nan null' );
$nan = $json->stringify_infnan(3)->encode($bignan);
is( "$nan", 'nan', 'nan stringify' );
my $biginf = Math::BigInt->new("Inf");
#note $biginf;
my $inf = $json->stringify_infnan(0)->encode($biginf);
is( "$inf", 'null', 'inf null' );
my $exp = "$biginf" =~ /nan/i ? "nan" : "inf";
$inf = $json->stringify_infnan(3)->encode($biginf);
is( "$inf", $exp, 'inf stringify' );
$biginf = Math::BigInt->new("-Inf");
$inf = $json->stringify_infnan(0)->encode($biginf);
#note $biginf;
is( "$inf", 'null', '-inf default' );
$exp = "$biginf" =~ /nan/i ? "nan" : "-inf";
$inf = $json->stringify_infnan(3)->encode($biginf);
is( "$inf", $exp, '-inf stringify' );
# see if allow_bignum is enough, always decodes to a BigFloat
my $num = $json->decode(4.5);
isa_ok( $num, 'Math::BigFloat' );
is(
$num->bcmp('4.5'),
0,
'decode simple bigfloat'
) or Dump($num);
# But a short int will not decode to a BigInt
$num = $json->decode(q|[4]|)->[0];
ok( Scalar::Util::looks_like_number($num), 'simple IV') or Dump($num);
|