]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blob - t/20-localize-target.t
Replace raw level numbers by words, except in t/55-unwind-multi.t
[perl/modules/Scope-Upper.git] / t / 20-localize-target.t
1 #!perl -T
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 50;
7
8 use Scope::Upper qw/localize UP HERE/;
9
10 # Scalars
11
12 our $x;
13
14 {
15  local $x = 2;
16  {
17   localize *x, \1 => HERE;
18   is $x, 1, 'localize *x, \1 => HERE [ok]';
19  }
20  is $x, 2, 'localize *x, \1 => HERE [end]';
21 }
22
23 sub _t { shift->{t} }
24
25 {
26  local $x;
27  {
28   localize *x, \bless({ t => 1 }, 'main') => HERE;
29   is ref($x), 'main', 'localize *x, obj => HERE [ref]';
30   is $x->_t, 1, 'localize *x, obj => HERE [meth]';
31  }
32  is $x, undef, 'localize *x, obj => HERE [end]';
33 }
34
35 {
36  local $x = 2;
37  {
38   local $x = 3;
39   localize *x, 1 => HERE;
40   is $x, undef, 'localize *x, 1 => HERE [ok]';
41  }
42  is $x, $] < 5.008009 ? undef : 2, 'localize *x, 1 => HERE [end]';
43 }
44 undef *x;
45
46 {
47  local $x = 7;
48  {
49   localize '$x', 2 => HERE;
50   is $x, 2, 'localize "$x", 2 => HERE [ok]';
51  }
52  is $x, 7, 'localize "$x", 2 => HERE [end]';
53 }
54
55 {
56  local $x = 8;
57  {
58   localize ' $x', 3 => HERE;
59   is $x, 3, 'localize " $x", 3 => HERE [ok]';
60  }
61  is $x, 8, 'localize " $x", 3 => HERE [end]';
62 }
63
64 SKIP:
65 {
66  skip 'Can\'t localize through a reference in 5.6' => 2 if $] < 5.008;
67  eval q{
68   no strict 'refs';
69   local ${''} = 9;
70   {
71    localize '$', 4 => HERE;
72    is ${''}, 4, 'localize "$", 4 => HERE [ok]';
73   }
74   is ${''}, 9, 'localize "$", 4 => HERE [end]';
75  };
76 }
77
78 SKIP:
79 {
80  skip 'Can\'t localize through a reference in 5.6' => 2 if $] < 5.008;
81  eval q{
82   no strict 'refs';
83   local ${''} = 10;
84   {
85    localize '', 5 => HERE;
86    is ${''}, 5, 'localize "", 4 => HERE [ok]';
87   }
88   is ${''}, 10, 'localize "", 4 => HERE [end]';
89  };
90 }
91
92 {
93  local $x = 2;
94  {
95   localize 'x', \1 => HERE;
96   is $x, 1, 'localize "x", \1 => HERE [ok]';
97  }
98  is $x, 2, 'localize "x", \1 => HERE [end]';
99 }
100
101 {
102  local $x = 4;
103  {
104   localize 'x', 3 => HERE;
105   is $x, 3, 'localize "x", 3 => HERE [ok]';
106  }
107  is $x, 4, 'localize "x", 3 => HERE [end]';
108 }
109
110 {
111  local $x;
112  {
113   localize 'x', bless({ t => 2 }, 'main') => HERE;
114   is ref($x), 'main', 'localize "x", obj => HERE [ref]';
115   is $x->_t, 2, 'localize "x", obj => HERE [meth]';
116  }
117  is $x, undef, 'localize "x", obj => HERE [end]';
118 }
119
120 sub callthrough (*$) {
121  my ($what, $val) = @_;
122  if (ref $what) {
123   $what = $$what;
124   $val  = eval "\\$val";
125  }
126  local $x = 'x';
127  localize $what, $val => UP;
128  is $x, 'x', 'localize callthrough [not yet]';
129 }
130
131 {
132  package Scope::Upper::Test::Mock1;
133  our $x;
134  {
135   main::callthrough(*x, 4);
136   Test::More::is($x,       4,     'localize glob [ok - SUTM1]');
137   Test::More::is($main::x, undef, 'localize glob [ok - main]');
138  }
139 }
140
141 {
142  package Scope::Upper::Test::Mock2;
143  our $x;
144  {
145   main::callthrough(*main::x, 5);
146   Test::More::is($x,       undef, 'localize qualified glob [ok - SUTM2]');
147   Test::More::is($main::x, 5,     'localize qualified glob [ok - main]');
148  }
149 }
150
151 {
152  package Scope::Upper::Test::Mock3;
153  our $x;
154  {
155   main::callthrough('$main::x', 6);
156   Test::More::is($x,       undef, 'localize fully qualified name [ok - SUTM3]');
157   Test::More::is($main::x, 6,     'localize fully qualified name [ok - main]');
158  }
159 }
160
161 {
162  package Scope::Upper::Test::Mock4;
163  our $x;
164  {
165   main::callthrough('$x', 7);
166   Test::More::is($x,       7,     'localize unqualified name [ok - SUTM4]');
167   Test::More::is($main::x, undef, 'localize unqualified name [ok - main]');
168  }
169 }
170
171 $_ = 'foo';
172 {
173  package Scope::Upper::Test::Mock5;
174  {
175   main::callthrough('$_', 'bar');
176   Test::More::ok(/bar/, 'localize $_ [ok]');
177  }
178 }
179 undef $_;
180
181 # Arrays
182
183 our @a;
184 my $xa = [ 7 .. 9 ];
185
186 {
187  local @a = (4 .. 6);
188  {
189   localize *a, $xa => HERE;
190   is_deeply \@a, $xa, 'localize *a, [ ] => HERE [ok]';
191  }
192  is_deeply \@a, [ 4 .. 6 ], 'localize *a, [ ] => HERE [end]';
193 }
194
195 {
196  local @a = (4 .. 6);
197  {
198   local @a = (5 .. 7);
199   {
200    localize *a, $xa => UP;
201    is_deeply \@a, [ 5 .. 7 ], 'localize *a, [ ] => UP [not yet]';
202   }
203   is_deeply \@a, $xa, 'localize *a, [ ] => UP [ok]';
204  }
205  is_deeply \@a, [ 4 .. 6 ], 'localize *a, [ ] => UP [end]';
206 }
207
208 # Hashes
209
210 our %h;
211 my $xh = { a => 5, c => 7 };
212
213 {
214  local %h = (a => 1, b => 2);
215  {
216   localize *h, $xh => HERE;
217   is_deeply \%h, $xh, 'localize *h, { } => HERE [ok]';
218  }
219  is_deeply \%h, { a => 1, b => 2 }, 'localize *h, { } => HERE [end]';
220 }
221
222 {
223  local %h = (a => 1, b => 2);
224  {
225   local %h = (b => 3, c => 4);
226   {
227    localize *h, $xh => UP;
228    is_deeply \%h, { b => 3, c => 4 }, 'localize *h, { } => UP [not yet]';
229   }
230   is_deeply \%h, $xh, 'localize *h, { } => UP [ok]';
231  }
232  is_deeply \%h, { a => 1, b => 2 }, 'localize *h, { } => UP [end]';
233 }
234
235 # Code
236
237 {
238  local *foo = sub { 7 };
239  {
240   localize *foo, sub { 6 } => UP;
241   is foo(), 7, 'localize *foo, sub { 6 } => UP [not yet]';
242  }
243  is foo(), 6, 'localize *foo, sub { 6 } => UP [ok]';
244 }
245
246 {
247  local *foo = sub { 9 };
248  {
249   localize '&foo', sub { 8 } => UP;
250   is foo(), 9, 'localize "&foo", sub { 8 } => UP [not yet]';
251  }
252  is foo(), 8, 'localize "&foo", sub { 8 } => UP [ok]';
253 }