6 use Test::More tests => 44 + 4;
8 use Scope::Upper qw/localize_delete UP HERE/;
17 localize_delete '@main::a', 1 => HERE;
18 is_deeply \@a, [ 4, undef, 6 ], 'localize_delete "@a", 1 => HERE [ok]';
20 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 1 => HERE [end]';
26 localize_delete '@main::a', 4 => HERE;
27 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (nonexistent) => HERE [ok]';
29 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (nonexistent) => HERE [end]';
36 localize_delete '@main::a', 4 => HERE;
37 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (exists) => HERE [ok]';
39 is_deeply \@a, [ 4 .. 6, undef, 7 ], 'localize_delete "@a", 4 (exists) => HERE [end]';
45 localize_delete '@main::a', -2 => HERE;
46 is_deeply \@a, [ 4, undef, 6 ], 'localize_delete "@a", -2 => HERE [ok]';
48 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", -2 => HERE [end]';
55 localize_delete '@main::a', -1 => HERE;
56 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", -1 (exists) => HERE [ok]';
58 is_deeply \@a, [ 4 .. 6, undef, 7 ], 'localize_delete "@a", -1 (exists) => HERE [end]';
64 eval { localize_delete '@main::a', -4 => HERE };
65 like $@, qr/Modification of non-creatable array value attempted, subscript -4/, 'localize_delete "@a", -4 (out of bounds) => HERE [ok]';
67 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", -4 (out of bounds) => HERE [end]';
75 localize_delete '@main::a', 1 => UP;
76 is_deeply \@a, [ 5 .. 7 ], 'localize_delete "@a", 1 => UP [not yet]';
78 is_deeply \@a, [ 5, undef, 7 ], 'localize_delete "@a", 1 => UP [ok]';
80 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 1 => UP [end]';
88 localize_delete '@main::a', 4 => UP;
89 is_deeply \@a, [ 5 .. 7 ], 'localize_delete "@a", 4 (nonexistent) => UP [not yet]';
91 is_deeply \@a, [ 5 .. 7 ], 'localize_delete "@a", 4 (nonexistent) => UP [ok]';
93 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (nonexistent) => UP [end]';
102 localize_delete '@main::a', 4 => UP;
103 is_deeply \@a, [ 5 .. 7, undef, 8 ], 'localize_delete "@a", 4 (exists) => UP [not yet]';
105 is_deeply \@a, [ 5 .. 7 ], 'localize_delete "@a", 4 (exists) => UP [ok]';
107 is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (exists) => UP [end]';
112 localize_delete '@nonexistent', 2;
113 is_deeply eval('*nonexistent{ARRAY}'), [ ],
114 'localize_delete "@nonexistent", anything => HERE [ok]';
116 is_deeply eval('*nonexistent{ARRAY}'), [ ],
117 'localize_delete "@nonexistent", anything => HERE [end]';
125 local %h = (a => 1, b => 2);
127 localize_delete '%main::h', 'a' => HERE;
128 is_deeply \%h, { b => 2 }, 'localize_delete "%h", "a" => HERE [ok]';
130 is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "a" => HERE [end]';
134 local %h = (a => 1, b => 2);
136 localize_delete '%main::h', 'c' => HERE;
137 is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "c" => HERE [ok]';
139 is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "c" => HERE [end]';
143 local %h = (a => 1, b => 2);
145 local %h = (a => 3, c => 4);
147 localize_delete '%main::h', 'a' => UP;
148 is_deeply \%h, { a => 3, c => 4 }, 'localize_delete "%h", "a" => UP [not yet]';
150 is_deeply \%h, { c => 4 }, 'localize_delete "%h", "a" => UP [ok]';
152 is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "a" => UP [end]';
157 localize_delete '%nonexistent', 'a';
158 is_deeply eval('*nonexistent{HASH}'), { },
159 'localize_delete "%nonexistent", anything => HERE [ok]';
161 is_deeply eval('*nonexistent{HASH}'), { },
162 'localize_delete "%nonexistent", anything => HERE [end]';
169 localize_delete '$x', 2 => HERE;
170 is $x, undef, 'localize_delete "$x", anything => HERE [ok]';
172 is $x, 1, 'localize_delete "$x", anything => HERE [end]';
176 localize_delete '$nonexistent', 2;
177 is eval('${*nonexistent{SCALAR}}'), undef,
178 'localize_delete "$nonexistent", anything => HERE [ok]';
180 is eval('${*nonexistent{SCALAR}}'), undef,
181 'localize_delete "$nonexistent", anything => HERE [end]';
186 localize_delete '&x', 2 => HERE;
187 ok !exists(&x), 'localize_delete "&x", anything => HERE [ok]';
189 is x(), 1, 'localize_delete "&x", anything => HERE [end]';
193 localize_delete '&nonexistent', 2;
194 is eval('exists &nonexistent'), !1,
195 'localize_delete "&nonexistent", anything => HERE [ok]';
197 is eval('exists &nonexistent'), !1,
198 'localize_delete "&nonexistent", anything => HERE [end]';
202 localize_delete *x, sub { } => HERE;
203 is !exists(&x), 1, 'localize_delete *x, anything => HERE [ok 1]';
204 is !defined($x), 1, 'localize_delete *x, anything => HERE [ok 2]';
206 is x(), 1, 'localize_delete *x, anything => HERE [end 1]';
207 is $x, 1, 'localize_delete *x, anything => HERE [end 2]';
211 sub invalid_ref { qr/^Invalid \Q$_[0]\E reference as the localization target/ }
214 eval { localize_delete \1, 0 => HERE };
215 like $@, invalid_ref('SCALAR'), 'invalid localize_delete \1, 0 => HERE';
219 eval { localize_delete [ ], 0 => HERE };
220 like $@, invalid_ref('ARRAY'), 'invalid localize_delete [ ], 0 => HERE';
224 eval { localize_delete { }, 0 => HERE };
225 like $@, invalid_ref('HASH'), 'invalid localize_delete { }, 0 => HERE';
229 eval { localize_delete sub { }, 0 => HERE };
230 like $@, invalid_ref('CODE'), 'invalid localize_delete sub { }, 0 => HERE';