The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!./perl
#
#  Copyright (c) 1995-2000, Raphael Manfredi
#  
#  You may redistribute only under the same terms as Perl 5, as specified
#  in the README file that comes with the distribution.
#

use Storable < qw(store retrieve store_fd nstore_fd fd_retrieve);

use Test::More;

plan tests => 19;

$a = 'toto';
$b = \$a;
my $c = bless \%(), 'CLASS';
$c->{+attribute} = 'attrval';
my %a = %('key', 'value', 1, 0, $a, $b, 'cvar', \$c);
my @a = @('first', undef, 3, -4, -3.14159, 456, 4.5,
	$b, \$a, $a, $c, \$c, \%a);

ok(defined store(\@a, 'store'));

my $root = retrieve('store');
ok(defined $root);

is_deeply($root, \@a);

1 while unlink 'store';

package FOO; our @ISA = qw(Storable);

sub make {
	my $self = bless \%();
	$self->{+key} = \%main::a;
	return $self;
};

package main;

my $foo = FOO->make;
ok($foo->store('store'));

ok(open(my $outfh, ">>", 'store'));
binmode $outfh;

ok(defined store_fd(\@a, \*$outfh));
ok(defined nstore_fd($foo, \*$outfh));
ok(defined nstore_fd(\%a, \*$outfh));

ok(close($outfh));

ok(open($outfh, "<", 'store'));
binmode $outfh;

my $r = fd_retrieve(\*$outfh);
ok(defined $r);
is_deeply($foo, $r);

$r = fd_retrieve(\*$outfh);
ok(defined $r);
is_deeply(\@a, $r);

$r = fd_retrieve(\*$outfh);
ok(defined $r);
is_deeply($foo, $r);

$r = fd_retrieve(\*$outfh);
ok(defined $r);
is_deeply(\%a, $r);

try { $r = fd_retrieve(\*$outfh); };
ok($^EVAL_ERROR);

close $outfh or die "Could not close: $^OS_ERROR";
END { 1 while unlink 'store' }