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