f8c037d4bf209b80d38c3a083047ff8eefd805de
[p5sagit/p5-mst-13.2.git] / t / op / local.t
1 #!./perl
2
3 # $RCSfile: local.t,v $$Revision: 4.1 $$Date: 92/08/07 18:28:04 $
4
5 print "1..58\n";
6
7 $ENV{PERL_DESTRUCT_LEVEL} = 0; # XXX known to leaks scalars
8
9 sub foo {
10     local($a, $b) = @_;
11     local($c, $d);
12     $c = "ok 3\n";
13     $d = "ok 4\n";
14     { local($a,$c) = ("ok 9\n", "ok 10\n"); ($x, $y) = ($a, $c); }
15     print $a, $b;
16     $c . $d;
17 }
18
19 $a = "ok 5\n";
20 $b = "ok 6\n";
21 $c = "ok 7\n";
22 $d = "ok 8\n";
23
24 print &foo("ok 1\n","ok 2\n");
25
26 print $a,$b,$c,$d,$x,$y;
27
28 # same thing, only with arrays and associative arrays
29
30 sub foo2 {
31     local($a, @b) = @_;
32     local(@c, %d);
33     @c = "ok 13\n";
34     $d{''} = "ok 14\n";
35     { local($a,@c) = ("ok 19\n", "ok 20\n"); ($x, $y) = ($a, @c); }
36     print $a, @b;
37     $c[0] . $d{''};
38 }
39
40 $a = "ok 15\n";
41 @b = "ok 16\n";
42 @c = "ok 17\n";
43 $d{''} = "ok 18\n";
44
45 print &foo2("ok 11\n","ok 12\n");
46
47 print $a,@b,@c,%d,$x,$y;
48
49 eval 'local($$e)';
50 print +($@ =~ /Can't localize through a reference/) ? "" : "not ", "ok 21\n";
51
52 eval 'local(@$e)';
53 print +($@ =~ /Can't localize through a reference/) ? "" : "not ", "ok 22\n";
54
55 eval 'local(%$e)';
56 print +($@ =~ /Can't localize through a reference/) ? "" : "not ", "ok 23\n";
57
58 # Array and hash elements
59
60 @a = ('a', 'b', 'c');
61 {
62     local($a[1]) = 'foo';
63     local($a[2]) = $a[2];
64     print +($a[1] eq 'foo') ? "" : "not ", "ok 24\n";
65     print +($a[2] eq 'c') ? "" : "not ", "ok 25\n";
66     undef @a;
67 }
68 print +($a[1] eq 'b') ? "" : "not ", "ok 26\n";
69 print +($a[2] eq 'c') ? "" : "not ", "ok 27\n";
70 print +(!defined $a[0]) ? "" : "not ", "ok 28\n";
71
72 @a = ('a', 'b', 'c');
73 {
74     local($a[1]) = "X";
75     shift @a;
76 }
77 print +($a[0].$a[1] eq "Xb") ? "" : "not ", "ok 29\n";
78
79 %h = ('a' => 1, 'b' => 2, 'c' => 3);
80 {
81     local($h{'a'}) = 'foo';
82     local($h{'b'}) = $h{'b'};
83     print +($h{'a'} eq 'foo') ? "" : "not ", "ok 30\n";
84     print +($h{'b'} == 2) ? "" : "not ", "ok 31\n";
85     local($h{'c'});
86     delete $h{'c'};
87 }
88 print +($h{'a'} == 1) ? "" : "not ", "ok 32\n";
89 print +($h{'b'} == 2) ? "" : "not ", "ok 33\n";
90 print +($h{'c'} == 3) ? "" : "not ", "ok 34\n";
91
92 # check for scope leakage
93 $a = 'outer';
94 if (1) { local $a = 'inner' }
95 print +($a eq 'outer') ? "" : "not ", "ok 35\n";
96
97 # see if localization works when scope unwinds
98 local $m = 5;
99 eval {
100     for $m (6) {
101         local $m = 7;
102         die "bye";
103     }
104 };
105 print $m == 5 ? "" : "not ", "ok 36\n";
106
107 # see if localization works on tied arrays
108 {
109     package TA;
110     sub TIEARRAY { bless [], $_[0] }
111     sub STORE { print "# STORE [@_]\n"; $_[0]->[$_[1]] = $_[2] }
112     sub FETCH { my $v = $_[0]->[$_[1]]; print "# FETCH [@_=$v]\n"; $v }
113     sub CLEAR { print "# CLEAR [@_]\n"; @{$_[0]} = (); }
114     sub FETCHSIZE { scalar(@{$_[0]}) }
115     sub SHIFT { shift (@{$_[0]}) }
116     sub EXTEND {}
117 }
118
119 tie @a, 'TA';
120 @a = ('a', 'b', 'c');
121 {
122     local($a[1]) = 'foo';
123     local($a[2]) = $a[2];
124     print +($a[1] eq 'foo') ? "" : "not ", "ok 37\n";
125     print +($a[2] eq 'c') ? "" : "not ", "ok 38\n";
126     @a = ();
127 }
128 print +($a[1] eq 'b') ? "" : "not ", "ok 39\n";
129 print +($a[2] eq 'c') ? "" : "not ", "ok 40\n";
130 print +(!defined $a[0]) ? "" : "not ", "ok 41\n";
131
132 {
133     package TH;
134     sub TIEHASH { bless {}, $_[0] }
135     sub STORE { print "# STORE [@_]\n"; $_[0]->{$_[1]} = $_[2] }
136     sub FETCH { my $v = $_[0]->{$_[1]}; print "# FETCH [@_=$v]\n"; $v }
137     sub DELETE { print "# DELETE [@_]\n"; delete $_[0]->{$_[1]}; }
138     sub CLEAR { print "# CLEAR [@_]\n"; %{$_[0]} = (); }
139 }
140
141 # see if localization works on tied hashes
142 tie %h, 'TH';
143 %h = ('a' => 1, 'b' => 2, 'c' => 3);
144
145 {
146     local($h{'a'}) = 'foo';
147     local($h{'b'}) = $h{'b'};
148     print +($h{'a'} eq 'foo') ? "" : "not ", "ok 42\n";
149     print +($h{'b'} == 2) ? "" : "not ", "ok 43\n";
150     local($h{'c'});
151     delete $h{'c'};
152 }
153 print +($h{'a'} == 1) ? "" : "not ", "ok 44\n";
154 print +($h{'b'} == 2) ? "" : "not ", "ok 45\n";
155 print +($h{'c'} == 3) ? "" : "not ", "ok 46\n";
156
157 @a = ('a', 'b', 'c');
158 {
159     local($a[1]) = "X";
160     shift @a;
161 }
162 print +($a[0].$a[1] eq "Xb") ? "" : "not ", "ok 47\n";
163
164 # now try the same for %SIG
165
166 $SIG{TERM} = 'foo';
167 $SIG{INT} = \&foo;
168 $SIG{__WARN__} = $SIG{INT};
169 {
170     local($SIG{TERM}) = $SIG{TERM};
171     local($SIG{INT}) = $SIG{INT};
172     local($SIG{__WARN__}) = $SIG{__WARN__};
173     print +($SIG{TERM}          eq 'main::foo') ? "" : "not ", "ok 48\n";
174     print +($SIG{INT}           eq \&foo) ? "" : "not ", "ok 49\n";
175     print +($SIG{__WARN__}      eq \&foo) ? "" : "not ", "ok 50\n";
176     local($SIG{INT});
177     delete $SIG{__WARN__};
178 }
179 print +($SIG{TERM}      eq 'main::foo') ? "" : "not ", "ok 51\n";
180 print +($SIG{INT}       eq \&foo) ? "" : "not ", "ok 52\n";
181 print +($SIG{__WARN__}  eq \&foo) ? "" : "not ", "ok 53\n";
182
183 # and for %ENV
184
185 $ENV{_X_} = 'a';
186 $ENV{_Y_} = 'b';
187 $ENV{_Z_} = 'c';
188 {
189     local($ENV{_X_}) = 'foo';
190     local($ENV{_Y_}) = $ENV{_Y_};
191     print +($ENV{_X_} eq 'foo') ? "" : "not ", "ok 54\n";
192     print +($ENV{_Y_} eq 'b') ? "" : "not ", "ok 55\n";
193     local($ENV{_Z_});
194     delete $ENV{_Z_};
195 }
196 print +($ENV{_X_} eq 'a') ? "" : "not ", "ok 56\n";
197 print +($ENV{_Y_} eq 'b') ? "" : "not ", "ok 57\n";
198 print +($ENV{_Z_} eq 'c') ? "" : "not ", "ok 58\n";
199