Data-Smile
view release on metacpan or search on metacpan
t/integration/06_options.t view on Meta::CPAN
use Test2::V0;
use Data::Smile::PP qw(encode_smile decode_smile dump_smile load_smile);
use File::Temp qw(tempdir);
my $huge = '1267650600228229401496703205376'; # 2**100
my $smile = "\x3A\x29\x0A\x03\x26\x8D\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
my $decoded_default = decode_smile($smile);
ok(ref($decoded_default), 'default decode uses an object for huge integer');
is($decoded_default->bstr, $huge, 'default decode uses Math::BigInt value');
my $decoded_native = decode_smile($smile, { use_bigint => 0 });
ok(!ref($decoded_native), 'decode with use_bigint=0 returns native scalar');
like("$decoded_native", qr/1\.26765060022823e\+30|1267650600228229401496703205376/, 'decode with use_bigint=0 returns numeric approximation');
my $nested_smile = "\x3A\x29\x0A\x03\xF8\x26\x8D\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF9";
my $nested_default = decode_smile( $nested_smile );
ok( ref( $nested_default->[0] ), 'default decode keeps nested huge integer as object' );
is( $nested_default->[0]->bstr, $huge, 'nested huge integer value preserved as Math::BigInt' );
my $nested_native = decode_smile( $nested_smile, { use_bigint => 0 } );
ok( !ref( $nested_native->[0] ), 'use_bigint=0 applies to nested huge integer values' );
like( "$nested_native->[0]", qr/1\.26765060022823e\+30|1267650600228229401496703205376/, 'nested huge integer falls back to native numeric approximation' );
my $encoded = encode_smile({ a => 1 }, {});
ok(length($encoded) > 4, 'encode_smile accepts empty options hashref');
my $encoded_no_header = encode_smile({ a => 1 }, { write_header => 0 });
ok(substr($encoded_no_header, 0, 3) ne "\x3A\x29\x0A", 'encode_smile can omit header');
is(decode_smile($encoded_no_header), { a => 1 }, 'decode_smile decodes headerless payload by default');
my $encoded_no_shared_values = encode_smile({ a => 'same', b => 'same' }, { shared_values => 0 });
my $decoded_no_shared_values = decode_smile($encoded_no_shared_values);
is($decoded_no_shared_values, { a => 'same', b => 'same' }, 'encode_smile supports shared_values option');
my $dir = tempdir(CLEANUP => 1);
my $file = "$dir/opts.sml";
ok(dump_smile($file, { x => 1 }, { write_header => 0 }), 'dump_smile passes encode options');
is(load_smile($file, {}), { x => 1 }, 'load_smile accepts options hashref');
like(
dies { decode_smile($smile, { not_an_option => 1 }) },
qr/Unknown option for decode_smile/,
'decode_smile rejects unknown options',
t/integration/07_canonical.t view on Meta::CPAN
zeta => 1,
alpha => 2,
beta => 3,
};
my $canonical = Data::Smile::PP::encode_smile(
$in,
{ canonical => 1, write_header => 0, shared_names => 0, shared_values => 0 },
);
my $redecoded = Data::Smile::PP::decode_smile(
$canonical,
{ require_header => 0 },
);
is(
$redecoded,
$in,
'canonical output decodes to original hash',
);
my @canonical_order = ( $canonical =~ /(alpha|beta|zeta)/g );
is(
\@canonical_order,
[ qw( alpha beta zeta ) ],
'canonical encoding emits sorted hash keys',
( run in 1.291 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )