]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blob - t/30-localize_elem-target.t
fix unwind()
[perl/modules/Scope-Upper.git] / t / 30-localize_elem-target.t
1 #!perl -T
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 25 + 12;
7
8 use Scope::Upper qw<localize_elem UP HERE>;
9
10 # Arrays
11
12 our @a;
13
14 {
15  local @a = (4 .. 6);
16  {
17   localize_elem '@main::a', 1, 8 => HERE;
18   is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", 1, 8 => HERE [ok]';
19  }
20  is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 1, 8 => HERE [end]';
21 }
22
23 {
24  local @a = (4 .. 6);
25  {
26   localize_elem '@main::a', 4, 8 => HERE;
27   is_deeply \@a, [ 4 .. 6, undef, 8 ], 'localize_elem "@a", 4, 8 => HERE [ok]';
28  }
29  is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 8 => HERE [end]';
30 }
31
32 {
33  local @a = (4 .. 6);
34  {
35   localize_elem '@main::a', -2, 8 => HERE;
36   is_deeply \@a, [ 4, 8, 6 ], 'localize_elem "@a", -2, 8 => HERE [ok]';
37  }
38  is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -2, 8 => HERE [end]';
39 }
40
41 {
42  local @a = (4 .. 6);
43  {
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]';
46  }
47  is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", -4, 8 => HERE [end]';
48 }
49
50 {
51  local @a = (4 .. 6);
52  {
53   local @a = (5 .. 7);
54   {
55    localize_elem '@main::a', 1, 12 => UP;
56    is_deeply \@a, [ 5 .. 7 ], 'localize_elem "@a", 1, 12 => UP [not yet]';
57   }
58   is_deeply \@a, [ 5, 12, 7 ], 'localize_elem "@a", 1, 12 => UP [ok]';
59  }
60  is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 1, 12 => UP [end]';
61 }
62
63 {
64  local @a = (4 .. 6);
65  {
66   local @a = (5 .. 7);
67   {
68    localize_elem '@main::a', 4, 12 => UP;
69    is_deeply \@a, [ 5 .. 7 ], 'localize_elem "@a", 4, 12 => UP [not yet]';
70   }
71   is_deeply \@a, [ 5 .. 7, undef, 12 ], 'localize_elem "@a", 4, 12 => UP [ok]';
72  }
73  is_deeply \@a, [ 4 .. 6 ], 'localize_elem "@a", 4, 12 => UP [end]';
74 }
75
76 {
77  {
78   localize_elem '@nonexistent', 2, 7;
79   is_deeply eval('*nonexistent{ARRAY}'), [ undef, undef, 7 ],
80                              'localize_elem "@nonexistent", 2, 7 => HERE [ok]';
81  }
82  is_deeply eval('*nonexistent{ARRAY}'), [ ],
83                              'localize_elem "@nonexistent", 2, 7 => HERE [end]';
84 }
85
86 # Hashes
87
88 our %h;
89
90 {
91  local %h = (a => 1, b => 2);
92  {
93   localize_elem '%main::h', 'a', 3 => HERE;
94   is_deeply \%h, { a => 3, b => 2 }, 'localize_elem "%h", "a", 3 => HERE [ok]';
95  }
96  is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "a", 3 => HERE [end]';
97 }
98
99 {
100  local %h = (a => 1, b => 2);
101  {
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]';
104  }
105  is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "c", 3 => HERE [end]';
106 }
107
108 {
109  local %h = (a => 1, b => 2);
110  {
111   local %h = (a => 3, c => 4);
112   {
113    localize_elem '%main::h', 'a', 5 => UP;
114    is_deeply \%h, { a => 3, c => 4 }, 'localize_elem "%h", "a", 5 => UP [not yet]';
115   }
116   is_deeply \%h, { a => 5, c => 4 }, 'localize_elem "%h", "a", 5 => UP [ok]';
117  }
118  is_deeply \%h, { a => 1, b => 2 }, 'localize_elem "%h", "a", 5 => UP [end]';
119 }
120
121 {
122  {
123   localize_elem '%nonexistent', 'a', 13;
124   is_deeply eval('*nonexistent{HASH}'), { a => 13 },
125                           'localize_elem "%nonexistent", "a", 13 => HERE [ok]';
126  }
127  is_deeply eval('*nonexistent{HASH}'), { },
128                           'localize_elem "%nonexistent", "a", 13 => HERE [end]';
129 }
130
131 # Invalid
132
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/;
135
136 {
137  local *x;
138
139  eval { localize_elem '$x', 0, 1 };
140  like $@, $invalid_type, 'invalid localize_elem "$x", 0, 1';
141 }
142
143 {
144  local *x;
145
146  eval { localize_elem '&x', 0, sub { } };
147  like $@, $invalid_type, 'invalid localize_elem "&x", 0, sub { }';
148 }
149
150 {
151  local *x;
152
153  eval { localize_elem '*x', 0, \1 };
154  like $@, $invalid_type, 'invalid localize_elem "*x", 0, \1';
155 }
156
157 {
158  local *x;
159
160  eval { localize_elem *x, 0, \1 };
161  like $@, $invalid_glob, 'invalid localize_elem *x, 0, \1';
162 }
163
164 {
165  local *x;
166
167  eval { localize_elem *x, 0, [ 1 ] };
168  like $@, $invalid_glob, 'invalid localize_elem *x, 0, [ 1 ]';
169 }
170
171 {
172  local *x;
173
174  eval { localize_elem *x, 0, { a => 1 } };
175  like $@, $invalid_glob, 'invalid localize_elem *x, 0, { a => 1 }';
176 }
177
178 {
179  local *x;
180
181  eval { localize_elem *x, 0, sub { } };
182  like $@, $invalid_glob, 'invalid localize_elem *x, 0, sub { }';
183 }
184
185 {
186  local *x;
187
188  eval { localize_elem *x, 0, *x };
189  like $@, $invalid_glob, 'invalid localize_elem *x, 0, *x';
190 }
191
192 sub invalid_ref { qr/^Invalid \Q$_[0]\E reference as the localization target/ }
193
194 {
195  eval { localize_elem \1, 0, 0 => HERE };
196  like $@, invalid_ref('SCALAR'), 'invalid localize_elem \1, 0, 0 => HERE';
197 }
198
199 {
200  eval { localize_elem [ ], 0, 0 => HERE };
201  like $@, invalid_ref('ARRAY'),  'invalid localize_elem [ ], 0, 0 => HERE';
202 }
203
204 {
205  eval { localize_elem { }, 0, 0 => HERE };
206  like $@, invalid_ref('HASH'),   'invalid localize_elem { }, 0, 0 => HERE';
207 }
208
209 {
210  eval { localize_elem sub { }, 0, 0 => HERE };
211  like $@, invalid_ref('CODE'),   'invalid localize_elem sub { }, 0, 0 => HERE';
212 }