]> git.vpit.fr Git - perl/modules/Variable-Temp.git/blob - t/10-base.t
This is 0.04
[perl/modules/Variable-Temp.git] / t / 10-base.t
1 #!perl -T
2
3 use strict;
4 use warnings;
5
6 use Variable::Temp 'set_temp';
7
8 use Test::More tests => (9 + 2 * 19) * 2 + 6 * 3;
9
10 sub describe {
11  my $h = $_[0];
12  return join ', ', map "$_:$h->{$_}", sort keys %$h;
13 }
14
15 my $aelem_delete_msg = 'Localized extraneous array elements do not reset array length at scope end before perl 5.12';
16 my $aelem_delete_ok  = ("$]" >= 5.012);
17
18 # Lexicals
19
20 {
21  my $x = 1;
22  is $x, 1;
23  {
24   set_temp $x => 2;
25   is $x, 2;
26   $x = 3;
27   is $x, 3;
28  }
29  is $x, 1;
30  {
31   set_temp $x => 4;
32   is $x, 4;
33   set_temp $x => 5;
34   is $x, 5;
35  }
36  is $x, 1;
37  {
38   set_temp $x;
39   is $x, undef;
40  }
41  is $x, 1;
42 }
43
44 {
45  my @y = (1, 2);
46  is "@y", "1 2";
47  {
48   set_temp @y => [ 3 ];
49   is "@y", '3';
50   @y = (4, 5, 6);
51   is "@y", '4 5 6';
52   $y[3] = 7;
53   is "@y", '4 5 6 7';
54  }
55  is "@y", "1 2";
56  {
57   set_temp @y => [ 8, 9, 10 ];
58   is "@y", '8 9 10';
59   $y[1] = 11;
60   is "@y", '8 11 10';
61  }
62  is "@y", "1 2";
63  {
64   set_temp @y => [ 12, 13, 14 ];
65   is "@y", '12 13 14';
66   set_temp @y => [ 15, 16];
67   is "@y", '15 16';
68  }
69  is "@y", '1 2';
70  {
71   set_temp @y;
72   is "@y", '';
73  }
74  is "@y", '1 2';
75  {
76   set_temp @y => [ qw<a b c> ];
77   is "@y", 'a b c';
78   SKIP: {
79    skip $aelem_delete_msg => 3 unless $aelem_delete_ok;
80    local $y[1] = 'd';
81    is "@y", 'a d c';
82    {
83     local @y[2, 3] = qw<e f>;
84     is "@y", 'a d e f';
85    }
86    is "@y", 'a d c';
87   }
88   is "@y", 'a b c';
89  }
90  is "@y", '1 2';
91 }
92
93 {
94  my %z = (a => 1);
95  is describe(\%z), 'a:1';
96  {
97   set_temp %z => { b => 2 };
98   is describe(\%z), 'b:2';
99   %z = (c => 3);
100   is describe(\%z), 'c:3';
101   $z{d} = 4;
102   is describe(\%z), 'c:3, d:4';
103  }
104  is describe(\%z), 'a:1';
105  {
106   set_temp %z => { a => 5 };
107   is describe(\%z), 'a:5';
108   $z{a} = 6;
109   is describe(\%z), 'a:6';
110  }
111  is describe(\%z), 'a:1';
112  {
113   set_temp %z => { a => 7, d => 8 };
114   is describe(\%z), 'a:7, d:8';
115   set_temp %z => { d => 9, e => 10 };
116   is describe(\%z), 'd:9, e:10';
117  }
118  is describe(\%z), 'a:1';
119  {
120   set_temp %z;
121   is describe(\%z), '';
122  }
123  is describe(\%z), 'a:1';
124  {
125   set_temp %z => { a => 11, f => 12 };
126   is describe(\%z), 'a:11, f:12';
127   {
128    local $z{a} = 13;
129    is describe(\%z), 'a:13, f:12';
130    {
131     local @z{qw<f g>} = (14, 15);
132     is describe(\%z), 'a:13, f:14, g:15';
133    }
134    is describe(\%z), 'a:13, f:12';
135   }
136   is describe(\%z), 'a:11, f:12';
137  }
138  is describe(\%z), 'a:1';
139 }
140
141 # Globals
142
143 {
144  our $X = 1;
145  is $X, 1;
146  {
147   set_temp $X => 2;
148   is $X, 2;
149   $X = 3;
150   is $X, 3;
151  }
152  is $X, 1;
153  {
154   set_temp $X => 4;
155   is $X, 4;
156   set_temp $X => 5;
157   is $X, 5;
158  }
159  is $X, 1;
160  {
161   set_temp $X;
162   is $X, undef;
163  }
164  is $X, 1;
165  {
166   local $X = 6;
167   is $X, 6;
168  }
169  is $X, 1;
170  {
171   local $X = 7;
172   set_temp $X => 8;
173   is $X, 8;
174  }
175  is $X, 1;
176  {
177   set_temp $X => 9;
178   local $X = 10;
179   is $X, 10;
180  }
181  is $X, 1;
182 }
183
184 {
185  our @Y = (1, 2);
186  is "@Y", "1 2";
187  {
188   set_temp @Y => [ 3 ];
189   is "@Y", '3';
190   @Y = (4, 5, 6);
191   is "@Y", '4 5 6';
192   $Y[3] = 7;
193   is "@Y", '4 5 6 7';
194  }
195  is "@Y", "1 2";
196  {
197   set_temp @Y => [ 8, 9, 10 ];
198   is "@Y", '8 9 10';
199   $Y[1] = 11;
200   is "@Y", '8 11 10';
201  }
202  is "@Y", "1 2";
203  {
204   set_temp @Y => [ 12, 13, 14 ];
205   is "@Y", '12 13 14';
206   set_temp @Y => [ 15, 16];
207   is "@Y", '15 16';
208  }
209  is "@Y", '1 2';
210  {
211   set_temp @Y;
212   is "@Y", '';
213  }
214  is "@Y", '1 2';
215  {
216   set_temp @Y => [ qw<a b c> ];
217   is "@Y", 'a b c';
218   SKIP: {
219    skip $aelem_delete_msg => 3 unless $aelem_delete_ok;
220    local $Y[1] = 'd';
221    is "@Y", 'a d c';
222    {
223     local @Y[2, 3] = qw<e f>;
224     is "@Y", 'a d e f';
225    }
226    is "@Y", 'a d c';
227   }
228   is "@Y", 'a b c';
229  }
230  is "@Y", '1 2';
231  {
232   local @Y = qw<A B>;
233   is "@Y", 'A B';
234  }
235  is "@Y", '1 2';
236  {
237   local @Y = qw<C D E>;
238   set_temp @Y => [ qw<F> ];
239   is "@Y", 'F';
240  }
241  is "@Y", '1 2';
242  {
243   set_temp @Y => [ qw<G H I> ];
244   local @Y = qw<J>;
245   is "@Y", 'J';
246  }
247  is "@Y", '1 2';
248 }
249
250 {
251  our %Z = (a => 1);
252  is describe(\%Z), 'a:1';
253  {
254   set_temp %Z => { b => 2 };
255   is describe(\%Z), 'b:2';
256   %Z = (c => 3);
257   is describe(\%Z), 'c:3';
258   $Z{d} = 4;
259   is describe(\%Z), 'c:3, d:4';
260  }
261  is describe(\%Z), 'a:1';
262  {
263   set_temp %Z => { a => 5 };
264   is describe(\%Z), 'a:5';
265   $Z{a} = 6;
266   is describe(\%Z), 'a:6';
267  }
268  is describe(\%Z), 'a:1';
269  {
270   set_temp %Z => { a => 7, d => 8 };
271   is describe(\%Z), 'a:7, d:8';
272   set_temp %Z => { d => 9, e => 10 };
273   is describe(\%Z), 'd:9, e:10';
274  }
275  is describe(\%Z), 'a:1';
276  {
277   set_temp %Z;
278   is describe(\%Z), '';
279  }
280  is describe(\%Z), 'a:1';
281  {
282   set_temp %Z => { a => 11, f => 12 };
283   is describe(\%Z), 'a:11, f:12';
284   {
285    local $Z{a} = 13;
286    is describe(\%Z), 'a:13, f:12';
287    {
288     local @Z{qw<f g>} = (14, 15);
289     is describe(\%Z), 'a:13, f:14, g:15';
290    }
291    is describe(\%Z), 'a:13, f:12';
292   }
293   is describe(\%Z), 'a:11, f:12';
294  }
295  is describe(\%Z), 'a:1';
296  {
297   local %Z = (A => 1, B => 2);
298   is describe(\%Z), 'A:1, B:2';
299  }
300  is describe(\%Z), 'a:1';
301  {
302   local %Z = (A => 3, C => 4);
303   set_temp %Z => { A => 5, D => 6 };
304   is describe(\%Z), 'A:5, D:6';
305  }
306  is describe(\%Z), 'a:1';
307  {
308   set_temp %Z => { A => 7, E => 8 };
309   local %Z = (A => 9, F => 10);
310   is describe(\%Z), 'A:9, F:10';
311  }
312  is describe(\%Z), 'a:1';
313 }