]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blob - t/29-localize-target.t
Skip two croaking tests on 5.6
[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 SKIP:
65 {
66  skip 'Can\'t localize through a reference in 5.6' => 2 if $] < 5.008;
67  no strict 'refs';
68  local ${''} = 9;
69  {
70   localize '$', 4, 0;
71   is ${''}, 4, 'localize "$", 4, 0 [ok]';
72  }
73  is ${''}, 9, 'localize "$", 4, 0 [end]';
74 }
75
76 SKIP:
77 {
78  skip 'Can\'t localize through a reference in 5.6' => 2 if $] < 5.008;
79  no strict 'refs';
80  local ${''} = 10;
81  {
82   localize '', 5, 0;
83   is ${''}, 5, 'localize "", 4, 0 [ok]';
84  }
85  is ${''}, 10, 'localize "", 4, 0 [end]';
86 }
87
88 {
89  local $x = 2;
90  {
91   localize 'x', \1, 0;
92   is $x, 1, 'localize "x", \1, 0 [ok]';
93  }
94  is $x, 2, 'localize "x", \1, 0 [end]';
95 }
96
97 {
98  local $x = 4;
99  {
100   localize 'x', 3, 0;
101   is $x, 3, 'localize "x", 3, 0 [ok]';
102  }
103  is $x, 4, 'localize "x", 3, 0 [end]';
104 }
105
106 {
107  local $x;
108  {
109   localize 'x', bless({ t => 2 }, 'main'), 0;
110   is ref($x), 'main', 'localize "x", obj, 0 [ref]';
111   is $x->_t, 2, 'localize "x", obj, 0 [meth]';
112  }
113  is $x, undef, 'localize "x", obj, 0 [end]';
114 }
115
116 sub callthrough (*$) {
117  my ($what, $val) = @_;
118  if (ref $what) {
119   $what = $$what;
120   $val  = eval "\\$val";
121  }
122  local $x = 'x';
123  localize $what, $val, 1;
124  is $x, 'x', 'localize callthrough [not yet]';
125 }
126
127 {
128  package Scope::Upper::Test::Mock1;
129  our $x;
130  {
131   main::callthrough(*x, 4);
132   Test::More::is($x,       4,     'localize glob [ok - SUTM1]');
133   Test::More::is($main::x, undef, 'localize glob [ok - main]');
134  }
135 }
136
137 {
138  package Scope::Upper::Test::Mock2;
139  our $x;
140  {
141   main::callthrough(*main::x, 5);
142   Test::More::is($x,       undef, 'localize qualified glob [ok - SUTM2]');
143   Test::More::is($main::x, 5,     'localize qualified glob [ok - main]');
144  }
145 }
146
147 {
148  package Scope::Upper::Test::Mock3;
149  our $x;
150  {
151   main::callthrough('$main::x', 6);
152   Test::More::is($x,       undef, 'localize fully qualified name [ok - SUTM3]');
153   Test::More::is($main::x, 6,     'localize fully qualified name [ok - main]');
154  }
155 }
156
157 {
158  package Scope::Upper::Test::Mock4;
159  our $x;
160  {
161   main::callthrough('$x', 7);
162   Test::More::is($x,       7,     'localize unqualified name [ok - SUTM4]');
163   Test::More::is($main::x, undef, 'localize unqualified name [ok - main]');
164  }
165 }
166
167 $_ = 'foo';
168 {
169  package Scope::Upper::Test::Mock5;
170  {
171   main::callthrough('$_', 'bar');
172   Test::More::ok(/bar/, 'localize $_ [ok]');
173  }
174 }
175 undef $_;
176
177 # Arrays
178
179 our @a;
180 my $xa = [ 7 .. 9 ];
181
182 {
183  local @a = (4 .. 6);
184  {
185   localize *a, $xa, 0;
186   is_deeply \@a, $xa, 'localize *a, [ ], 0 [ok]';
187  }
188  is_deeply \@a, [ 4 .. 6 ], 'localize *a, [ ], 0 [end]';
189 }
190
191 {
192  local @a = (4 .. 6);
193  {
194   local @a = (5 .. 7);
195   {
196    localize *a, $xa, 1;
197    is_deeply \@a, [ 5 .. 7 ], 'localize *a, [ ], 1 [not yet]';
198   }
199   is_deeply \@a, $xa, 'localize *a, [ ], 1 [ok]';
200  }
201  is_deeply \@a, [ 4 .. 6 ], 'localize *a, [ ], 1 [end]';
202 }
203
204 # Hashes
205
206 our %h;
207 my $xh = { a => 5, c => 7 };
208
209 {
210  local %h = (a => 1, b => 2);
211  {
212   localize *h, $xh, 0;
213   is_deeply \%h, $xh, 'localize *h, { }, 0 [ok]';
214  }
215  is_deeply \%h, { a => 1, b => 2 }, 'localize *h, { }, 0 [end]';
216 }
217
218 {
219  local %h = (a => 1, b => 2);
220  {
221   local %h = (b => 3, c => 4);
222   {
223    localize *h, $xh, 1;
224    is_deeply \%h, { b => 3, c => 4 }, 'localize *h, { }, 1 [not yet]';
225   }
226   is_deeply \%h, $xh, 'localize *h, { }, 1 [ok]';
227  }
228  is_deeply \%h, { a => 1, b => 2 }, 'localize *h, { }, 1 [end]';
229 }
230
231 # Code
232
233 {
234  local *foo = sub { 7 };
235  {
236   localize *foo, sub { 6 }, 1;
237   is foo(), 7, 'localize *foo, sub { 6 }, 1 [not yet]';
238  }
239  is foo(), 6, 'localize *foo, sub { 6 }, 1 [ok]';
240 }
241
242 {
243  local *foo = sub { 9 };
244  {
245   localize '&foo', sub { 8 }, 1;
246   is foo(), 9, 'localize "&foo", sub { 8 }, 1 [not yet]';
247  }
248  is foo(), 8, 'localize "&foo", sub { 8 }, 1 [ok]';
249 }