DateTime-Format-Lite
view release on metacpan or search on metacpan
t/85.serialisation.t view on Meta::CPAN
# NOTE: Storable::dclone (clone via freeze/thaw)
subtest 'Storable::dclone' => sub
{
SKIP:
{
if( !eval{ require Storable; 1 } )
{
skip( 'Storable not available', 2 );
}
my $orig = _make_fmt();
my $clone = Storable::dclone( $orig );
ok( defined( $clone ), 'dclone succeeded' );
isnt( $clone, $orig, 'clone is a different reference' );
_check_state( $orig, $clone, 'dclone' );
};
};
# NOTE: Sereal round-trip (optional)
subtest 'Sereal round-trip' => sub
{
SKIP:
{
if( !eval{ require Sereal::Encoder; require Sereal::Decoder; 1 } )
{
skip( 'Sereal not available', 3 );
}
my $orig = _make_fmt();
# freeze_callbacks => 1 tells Sereal to honour FREEZE/THAW hooks, which
# avoids serialising internal objects (such as DBI handles buried inside
# DateTime::Locale::FromCLDR) by introspection.
my $encoder = Sereal::Encoder->new({ freeze_callbacks => 1 });
my $decoder = Sereal::Decoder->new({ refuse_objects => 0 });
my $frozen = $encoder->encode( $orig );
ok( defined( $frozen ), 'Sereal encode succeeded' );
my $restored = $decoder->decode( $frozen );
ok( defined( $restored ), 'Sereal decode returned object' );
isa_ok( $restored, 'DateTime::Format::Lite' );
_check_state( $orig, $restored, 'Sereal' );
};
};
# NOTE: JSON serialisation round-trip via TO_JSON
subtest 'JSON round-trip via TO_JSON' => sub
{
SKIP:
{
if( !eval{ require JSON; 1 } )
{
skip( 'JSON module not available', 3 );
}
my $orig = _make_fmt();
my $json_str = JSON::encode_json( $orig->TO_JSON );
ok( defined( $json_str ), 'JSON encode succeeded' );
my $state = JSON::decode_json( $json_str );
ok( ref( $state ) eq 'HASH', 'decoded JSON is a hashref' );
# Reconstruct from the decoded state
my $restored = DateTime::Format::Lite->new( %$state );
ok( defined( $restored ), 'reconstruct from JSON state succeeded' );
_check_state( $orig, $restored, 'JSON' );
};
};
done_testing;
__END__
( run in 0.880 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )