summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/perl/dist/Storable/t/flags.t
blob: e648f7a95cc1ce30f93a42bc145c78143667ee34 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!./perl

use Test::More tests => 16;

use Storable ();

use warnings;
use strict;

package TEST;

sub make {
	my $pkg = shift;
	return bless { a => 1, b => 2 }, $pkg;
}

package TIED_HASH;

sub TIEHASH {
	my $pkg = shift;
	return bless { a => 1, b => 2 }, $pkg;
}

sub FETCH {
	my ($self, $key) = @_;
	return $self->{$key};
}

sub STORE {
	my ($self, $key, $value) = @_;
	$self->{$key} = $value;
}

sub FIRSTKEY {
	my $self = shift;
	keys %$self;
	return each %$self;
}

sub NEXTKEY {
	my $self = shift;
	return each %{$self};
}

sub EXISTS {
	my ($self, $key) = @_;
	return exists $self->{$key};
}

package main;

{
	my $obj = TEST->make;

	is_deeply($obj, { a => 1, b => 2 }, "object contains correct data");

	my $frozen = Storable::freeze($obj);
	my ($t1, $t2) = Storable::thaw($frozen);

	{
		no warnings 'once';
		local $Storable::flags = Storable::FLAGS_COMPAT();
		$t2 = Storable::thaw($frozen);
	}

	is_deeply($t1, $t2, "objects contain matching data");
	is(ref $t1, 'TEST', "default object is blessed");
	is(ref $t2, 'TEST', "compat object is blessed into correct class");

	my $t3 = Storable::thaw($frozen, Storable::FLAGS_COMPAT());
	is_deeply($t2, $t3, "objects contain matching data (explicit test)");
	is(ref $t3, 'TEST', "compat object is blessed into correct class (explicit test)");

	my $t4 = Storable::thaw($frozen, Storable::BLESS_OK());
	is_deeply($t2, $t3, "objects contain matching data (explicit test for bless)");
	is(ref $t3, 'TEST', "compat object is blessed into correct class (explicit test for bless)");

	{
		no warnings 'once';
		local $Storable::flags = Storable::FLAGS_COMPAT();
		my $t5 = Storable::thaw($frozen, 0);
		my $t6 = Storable::thaw($frozen, Storable::TIE_OK());

		is_deeply($t1, $t5, "objects contain matching data");
		is_deeply($t1, $t6, "objects contain matching data for TIE_OK");
		is(ref $t5, 'HASH', "default object is unblessed");
		is(ref $t6, 'HASH', "TIE_OK object is unblessed");
	}
}

{
	tie my %hash, 'TIED_HASH';
	ok(tied %hash, "hash is tied");
	my $obj = { bow => \%hash };

	my $frozen = Storable::freeze($obj);
	my $t1 = Storable::thaw($frozen, Storable::FLAGS_COMPAT());
	my $t2 = eval { Storable::thaw($frozen); };

	ok(!$@, "trying to thaw a tied value succeeds");
	ok(tied %{$t1->{bow}}, "compat object is tied");
	is(ref tied %{$t1->{bow}}, 'TIED_HASH', "compat object is tied into correct class");
}