1#!perl
2use strict;
3use warnings;
4use Test::More;
5use File::Spec;
6use lib File::Spec->catdir(qw(t lib));
7
8BEGIN {
9    lib->import('lib')
10        if !-d 't';
11}
12use Sereal::TestSet qw(:all);
13use Sereal::Encoder;
14
15if ( not have_encoder_and_decoder() ) {
16    plan skip_all => 'Did not find right version of decoder';
17    exit 0;
18}
19
20# Encoder reentrancy test courtesy of Zefram
21
22my $enc= Sereal::Encoder->new( { freeze_callbacks => 1 } );
23
24package Foo;
25sub FREEZE { $enc->encode( $_[0]->{a} ) }
26
27sub THAW {
28    my $class= shift;
29    return bless( { a => Sereal::Decoder->new->decode( $_[1] ) } => $class );
30}
31
32package main;
33
34my $data= bless( { a => 42 }, "Foo" );
35my $a= $enc->encode($data);
36my $output;
37my $err;
38eval {
39    $output= Sereal::Decoder->new->decode($a);
40    1;
41} or do {
42    $err= $@ || "Zombie Error";
43};
44
45ok( !$err, "Decoding did not barf" )
46    or diag("Decoding barfed with '$err'");
47
48is_deeply(
49    $output,
50    $data,
51    "Decoded result is correct"
52);
53
54done_testing();
55