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