6 use Test::More tests => 25 + 12;
8 use Scope::Upper qw<localize_elem UP HERE>;
17 localize_elem '@main::a', 1, 8 => HERE;
18 is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", 1, 8 => HERE [ok]';
20 is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 1, 8 => HERE [end]';
26 localize_elem '@main::a', 4, 8 => HERE;
27 is_deeply \@a, [ 4 .. 6, undef, 8 ], 'localize_elem "@a", 4, 8 => HERE [ok]';
29 is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 8 => HERE [end]';
35 localize_elem '@main::a', -2, 8 => HERE;
36 is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", -2, 8 => HERE [ok]';
38 is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -2, 8 => HERE [end]';
44 eval { localize_elem '@main::a', -4, 8 => HERE };
45 like $@, qr/Modification of non-creatable array value attempted, subscript -4/, 'localize_elem "@a", -4, 8 => HERE [ok]';
47 is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -4, 8 => HERE [end]';
55 localize_elem '@main::a', 1, 12 => UP;
56 is_deeply \@a, [ 5 .. 7 ], 'localize_elem "@a", 1, 12 => UP [not yet]';
58 is_deeply \@a, [ 5, 12, 7 ], 'localize_elem "@a", 1, 12 => UP [ok]';
60 is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 1, 12 => UP [end]';
68 localize_elem '@main::a', 4, 12 => UP;
69 is_deeply \@a, [ 5 .. 7 ], 'localize_elem "@a", 4, 12 => UP [not yet]';
71 is_deeply \@a, [ 5 .. 7, undef, 12 ], 'localize_elem "@a", 4, 12 => UP [ok]';
73 is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 12 => UP [end]';
78 localize_elem '@nonexistent', 2, 7;
79 is_deeply eval('*nonexistent{ARRAY}'), [ undef, undef, 7 ],
80 'localize_elem "@nonexistent", 2, 7 => HERE [ok]';
82 is_deeply eval('*nonexistent{ARRAY}'), [ ],
83 'localize_elem "@nonexistent", 2, 7 => HERE [end]';
91 local %h = (a => 1, b => 2);
93 localize_elem '%main::h', 'a', 3 => HERE;
94 is_deeply \%h, { a => 3, b => 2 }, 'localize_elem "%h", "a", 3 => HERE [ok]';
96 is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "a", 3 => HERE [end]';
100 local %h = (a => 1, b => 2);
102 localize_elem '%main::h', 'c', 3 => HERE;
103 is_deeply \%h, { a => 1, b => 2, c => 3 }, 'localize_elem "%h", "c", 3 => HERE [ok]';
105 is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "c", 3 => HERE [end]';
109 local %h = (a => 1, b => 2);
111 local %h = (a => 3, c => 4);
113 localize_elem '%main::h', 'a', 5 => UP;
114 is_deeply \%h, { a => 3, c => 4 }, 'localize_elem "%h", "a", 5 => UP [not yet]';
116 is_deeply \%h, { a => 5, c => 4 }, 'localize_elem "%h", "a", 5 => UP [ok]';
118 is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "a", 5 => UP [end]';
123 localize_elem '%nonexistent', 'a', 13;
124 is_deeply eval('*nonexistent{HASH}'), { a => 13 },
125 'localize_elem "%nonexistent", "a", 13 => HERE [ok]';
127 is_deeply eval('*nonexistent{HASH}'), { },
128 'localize_elem "%nonexistent", "a", 13 => HERE [end]';
133 my $invalid_glob = qr/^Can't infer the element localization type from a glob and the value/;
134 my $invalid_type = qr/^Can't localize an element of something that isn't an array or a hash/;
139 eval { localize_elem '$x', 0, 1 };
140 like $@, $invalid_type, 'invalid localize_elem "$x", 0, 1';
146 eval { localize_elem '&x', 0, sub { } };
147 like $@, $invalid_type, 'invalid localize_elem "&x", 0, sub { }';
153 eval { localize_elem '*x', 0, \1 };
154 like $@, $invalid_type, 'invalid localize_elem "*x", 0, \1';
160 eval { localize_elem *x, 0, \1 };
161 like $@, $invalid_glob, 'invalid localize_elem *x, 0, \1';
167 eval { localize_elem *x, 0, [ 1 ] };
168 like $@, $invalid_glob, 'invalid localize_elem *x, 0, [ 1 ]';
174 eval { localize_elem *x, 0, { a => 1 } };
175 like $@, $invalid_glob, 'invalid localize_elem *x, 0, { a => 1 }';
181 eval { localize_elem *x, 0, sub { } };
182 like $@, $invalid_glob, 'invalid localize_elem *x, 0, sub { }';
188 eval { localize_elem *x, 0, *x };
189 like $@, $invalid_glob, 'invalid localize_elem *x, 0, *x';
192 sub invalid_ref { qr/^Invalid \Q$_[0]\E reference as the localization target/ }
195 eval { localize_elem \1, 0, 0 => HERE };
196 like $@, invalid_ref('SCALAR'), 'invalid localize_elem \1, 0, 0 => HERE';
200 eval { localize_elem [ ], 0, 0 => HERE };
201 like $@, invalid_ref('ARRAY'), 'invalid localize_elem [ ], 0, 0 => HERE';
205 eval { localize_elem { }, 0, 0 => HERE };
206 like $@, invalid_ref('HASH'), 'invalid localize_elem { }, 0, 0 => HERE';
210 eval { localize_elem sub { }, 0, 0 => HERE };
211 like $@, invalid_ref('CODE'), 'invalid localize_elem sub { }, 0, 0 => HERE';