FAQ sync
[p5sagit/p5-mst-13.2.git] / ext / Storable / t / compat06.t
1 #!./perl
2 #
3 #  Copyright (c) 1995-2000, Raphael Manfredi
4 #  
5 #  You may redistribute only under the same terms as Perl 5, as specified
6 #  in the README file that comes with the distribution.
7 #
8
9 BEGIN {
10     if ($ENV{PERL_CORE}){
11         chdir('t') if -d 't';
12         @INC = ('.', '../lib', '../ext/Storable/t');
13     } else {
14         unshift @INC, 't';
15     }
16     require Config; import Config;
17     if ($ENV{PERL_CORE} and $Config{'extensions'} !~ /\bStorable\b/) {
18         print "1..0 # Skip: Storable was not built\n";
19         exit 0;
20     }
21     require 'st-dump.pl';
22 }
23
24 sub ok;
25
26 print "1..8\n";
27
28 use Storable qw(freeze nfreeze thaw);
29
30 package TIED_HASH;
31
32 sub TIEHASH {
33         my $self = bless {}, shift;
34         return $self;
35 }
36
37 sub FETCH {
38         my $self = shift;
39         my ($key) = @_;
40         $main::hash_fetch++;
41         return $self->{$key};
42 }
43
44 sub STORE {
45         my $self = shift;
46         my ($key, $val) = @_;
47         $self->{$key} = $val;
48 }
49
50 package SIMPLE;
51
52 sub make {
53         my $self = bless [], shift;
54         my ($x) = @_;
55         $self->[0] = $x;
56         return $self;
57 }
58
59 package ROOT;
60
61 sub make {
62         my $self = bless {}, shift;
63         my $h = tie %hash, TIED_HASH;
64         $self->{h} = $h;
65         $self->{ref} = \%hash;
66         my @pool;
67         for (my $i = 0; $i < 5; $i++) {
68                 push(@pool, SIMPLE->make($i));
69         }
70         $self->{obj} = \@pool;
71         my @a = ('string', $h, $self);
72         $self->{a} = \@a;
73         $self->{num} = [1, 0, -3, -3.14159, 456, 4.5];
74         $h->{key1} = 'val1';
75         $h->{key2} = 'val2';
76         return $self;
77 };
78
79 sub num { $_[0]->{num} }
80 sub h   { $_[0]->{h} }
81 sub ref { $_[0]->{ref} }
82 sub obj { $_[0]->{obj} }
83
84 package main;
85
86 my $is_EBCDIC = (ord('A') == 193) ? 1 : 0;
87  
88 my $r = ROOT->make;
89
90 my $data = '';
91 if (!$is_EBCDIC) {                      # ASCII machine
92         while (<DATA>) {
93                 next if /^#/;
94             $data .= unpack("u", $_);
95         }
96 } else {
97         while (<DATA>) {
98                 next if /^#$/;          # skip comments
99                 next if /^#\s+/;        # skip comments
100                 next if /^[^#]/;        # skip uuencoding for ASCII machines
101                 s/^#//;                         # prepare uuencoded data for EBCDIC machines
102                 $data .= unpack("u", $_);
103         }
104 }
105
106 my $expected_length = $is_EBCDIC ? 217 : 278;
107 ok 1, length $data == $expected_length;
108   
109 my $y = thaw($data);
110 ok 2, 1;
111 ok 3, ref $y eq 'ROOT';
112
113 $Storable::canonical = 1;               # Prevent "used once" warning
114 $Storable::canonical = 1;
115 # Allow for long double string conversions.
116 $y->{num}->[3] += 0;
117 $r->{num}->[3] += 0;
118 ok 4, nfreeze($y) eq nfreeze($r);
119
120 ok 5, $y->ref->{key1} eq 'val1';
121 ok 6, $y->ref->{key2} eq 'val2';
122 ok 7, $hash_fetch == 2;
123
124 my $num = $r->num;
125 my $ok = 1;
126 for (my $i = 0; $i < @$num; $i++) {
127         do { $ok = 0; last } unless $num->[$i] == $y->num->[$i];
128 }
129 ok 8, $ok;
130
131 __END__
132 #
133 # using Storable-0.6@11, output of: print pack("u", nfreeze(ROOT->make));
134 # original size: 278 bytes
135 #
136 M`P,````%!`(````&"(%8"(!8"'U8"@@M,RXQ-#$U.5@)```!R%@*`S0N-5A8
137 M6`````-N=6T$`P````(*!'9A;#%8````!&ME>3$*!'9A;#)8````!&ME>3)B
138 M"51)141?2$%32%A8`````6@$`@````,*!G-T<FEN9U@$``````I8!```````
139 M6%A8`````6$$`@````4$`@````$(@%AB!E-)35!,15A8!`(````!"(%88@93
140 M24U03$586`0"`````0B"6&(&4TE-4$Q%6%@$`@````$(@UAB!E-)35!,15A8
141 M!`(````!"(188@9324U03$586%A8`````V]B:@0,!``````*6%A8`````W)E
142 (9F($4D]/5%@`
143 #
144 # using Storable-0.6@11, output of: print '#' . pack("u", nfreeze(ROOT->make));
145 # on OS/390 (cp 1047) original size: 217 bytes
146 #
147 #M!0,1!-G6UN,#````!00,!!$)X\G%Q&W(P>+(`P````(*!*6!D_$````$DH6H
148 #M\0H$I8&3\@````22A:CR`````YF%A@0"````!@B!"(`(?0H(8/-+\?3Q]?D)
149 #M```!R`H#]$OU`````Y6DE`0"````!001!N+)U-?3Q0(````!"(`$$@("````
150 #M`0B!!!("`@````$(@@02`@(````!"(,$$@("`````0B$`````Y:"D00`````
151 #E!`````&(!`(````#"@:BHYF)E8<$``````0$```````````!@0``