This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Sarathy's clear_pmop patch with Radu Greab's fix,
[perl5.git] / t / op / tie.t
CommitLineData
49d42823 1#!./perl
2
3# This test harness will (eventually) test the "tie" functionality
4# without the need for a *DBM* implementation.
5
55497cff 6# Currently it only tests the untie warning
49d42823 7
8chdir 't' if -d 't';
20822f61 9@INC = '../lib';
49d42823 10$ENV{PERL5LIB} = "../lib";
11
12$|=1;
13
55497cff 14# catch warnings into fatal errors
15$SIG{__WARN__} = sub { die "WARNING: @_" } ;
c03358ae 16$SIG{__DIE__} = sub { die @_ };
55497cff 17
49d42823 18undef $/;
19@prgs = split "\n########\n", <DATA>;
20print "1..", scalar @prgs, "\n";
21
22for (@prgs){
23 my($prog,$expected) = split(/\nEXPECT\n/, $_);
24 eval "$prog" ;
25 $status = $?;
26 $results = $@ ;
27 $results =~ s/\n+$//;
28 $expected =~ s/\n+$//;
c03358ae 29 if ( $status or $results and $results !~ /^(WARNING: )?$expected/){
49d42823 30 print STDERR "STATUS: $status\n";
31 print STDERR "PROG: $prog\n";
32 print STDERR "EXPECTED:\n$expected\n";
33 print STDERR "GOT:\n$results\n";
34 print "not ";
35 }
36 print "ok ", ++$i, "\n";
37}
38
39__END__
40
41# standard behaviour, without any extra references
42use Tie::Hash ;
43tie %h, Tie::StdHash;
44untie %h;
45EXPECT
46########
47
a29a5827
NIS
48# standard behaviour, without any extra references
49use Tie::Hash ;
50{package Tie::HashUntie;
51 use base 'Tie::StdHash';
52 sub UNTIE
53 {
54 warn "Untied\n";
55 }
56}
57tie %h, Tie::HashUntie;
58untie %h;
59EXPECT
60Untied
61########
62
49d42823 63# standard behaviour, with 1 extra reference
64use Tie::Hash ;
65$a = tie %h, Tie::StdHash;
66untie %h;
67EXPECT
68########
69
70# standard behaviour, with 1 extra reference via tied
71use Tie::Hash ;
72tie %h, Tie::StdHash;
73$a = tied %h;
74untie %h;
75EXPECT
76########
77
78# standard behaviour, with 1 extra reference which is destroyed
79use Tie::Hash ;
80$a = tie %h, Tie::StdHash;
81$a = 0 ;
82untie %h;
83EXPECT
84########
85
86# standard behaviour, with 1 extra reference via tied which is destroyed
87use Tie::Hash ;
88tie %h, Tie::StdHash;
89$a = tied %h;
90$a = 0 ;
91untie %h;
92EXPECT
93########
94
95# strict behaviour, without any extra references
4438c4b7 96use warnings 'untie';
49d42823 97use Tie::Hash ;
98tie %h, Tie::StdHash;
99untie %h;
100EXPECT
101########
102
103# strict behaviour, with 1 extra references generating an error
4438c4b7 104use warnings 'untie';
49d42823 105use Tie::Hash ;
106$a = tie %h, Tie::StdHash;
107untie %h;
108EXPECT
55497cff 109untie attempted while 1 inner references still exist
49d42823 110########
111
112# strict behaviour, with 1 extra references via tied generating an error
4438c4b7 113use warnings 'untie';
49d42823 114use Tie::Hash ;
115tie %h, Tie::StdHash;
116$a = tied %h;
117untie %h;
118EXPECT
55497cff 119untie attempted while 1 inner references still exist
49d42823 120########
121
122# strict behaviour, with 1 extra references which are destroyed
4438c4b7 123use warnings 'untie';
49d42823 124use Tie::Hash ;
125$a = tie %h, Tie::StdHash;
126$a = 0 ;
127untie %h;
128EXPECT
129########
130
131# strict behaviour, with extra 1 references via tied which are destroyed
4438c4b7 132use warnings 'untie';
49d42823 133use Tie::Hash ;
134tie %h, Tie::StdHash;
135$a = tied %h;
136$a = 0 ;
137untie %h;
138EXPECT
139########
140
141# strict error behaviour, with 2 extra references
4438c4b7 142use warnings 'untie';
49d42823 143use Tie::Hash ;
144$a = tie %h, Tie::StdHash;
145$b = tied %h ;
146untie %h;
147EXPECT
55497cff 148untie attempted while 2 inner references still exist
49d42823 149########
150
151# strict behaviour, check scope of strictness.
4438c4b7 152no warnings 'untie';
49d42823 153use Tie::Hash ;
154$A = tie %H, Tie::StdHash;
155$C = $B = tied %H ;
156{
4438c4b7 157 use warnings 'untie';
49d42823 158 use Tie::Hash ;
159 tie %h, Tie::StdHash;
160 untie %h;
161}
162untie %H;
163EXPECT
33c27489 164########
ae21d580
JH
165# Forbidden aggregate self-ties
166my ($a, $b) = (0, 0);
33c27489 167sub Self::TIEHASH { bless $_[1], $_[0] }
ae21d580
JH
168sub Self::DESTROY { $b = $_[0] + 1; }
169{
170 my %c = 42;
171 tie %c, 'Self', \%c;
172}
173EXPECT
174Self-ties of arrays and hashes are not supported
175########
176# Allowed scalar self-ties
177my ($a, $b) = (0, 0);
178sub Self::TIESCALAR { bless $_[1], $_[0] }
179sub Self::DESTROY { $b = $_[0] + 1; }
33c27489 180{
ae21d580
JH
181 my $c = 42;
182 $a = $c + 0;
183 tie $c, 'Self', \$c;
33c27489 184}
ae21d580 185die unless $a == 0 && $b == 43;
33c27489 186EXPECT
7bb043c3
IP
187########
188# Interaction of tie and vec
189
190my ($a, $b);
191use Tie::Scalar;
192tie $a,Tie::StdScalar or die;
193vec($b,1,1)=1;
194$a = $b;
195vec($a,1,1)=0;
196vec($b,1,1)=0;
197die unless $a eq $b;
198EXPECT