Data-Smile-XS
view release on metacpan or search on metacpan
t/integration/06_options.t view on Meta::CPAN
use Test2::V0;
use Data::Smile::XS 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 $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::XS::encode_smile(
$in,
{ canonical => 1, write_header => 0, shared_names => 0, shared_values => 0 },
);
my $redecoded = Data::Smile::XS::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',
t/integration/80_sv_optimization.t view on Meta::CPAN
my $src = {
foo => '41',
bar => '41',
};
my $bin = encode_smile($src);
ok index( $bin, "\x01" ) >= 0, 'contains shared value backref token';
my $decoded = decode_smile($bin);
is $decoded, $src, 'decoded structure matches source';
$decoded->{foo} .= 'x';
is $decoded->{foo}, '41x', 'foo string mutation is local';
is $decoded->{bar}, '41', 'bar is independent after string mutation';
$decoded->{bar}++;
is $decoded->{bar}, 42, 'bar numeric increment is local';
is $decoded->{foo}, '41x', 'foo remains unchanged after bar++';
done_testing;
( run in 0.609 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )