]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blob - t/40-localize_delete-target.t
30468a1169ee13df4d85ae45c27ea5e435791769
[perl/modules/Scope-Upper.git] / t / 40-localize_delete-target.t
1 #!perl -T
2
3 use strict;
4 use warnings;
5
6 use Test::More tests => 36;
7
8 use Scope::Upper qw/localize_delete/;
9
10 # Arrays
11
12 our @a;
13
14 {
15  local @a = (4 .. 6);
16  {
17   localize_delete '@main::a', 1, 0;
18   is_deeply \@a, [ 4, undef, 6 ], 'localize_delete "@a", 1, 0 [ok]';
19  }
20  is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 1, 0 [end]';
21 }
22
23 {
24  local @a = (4 .. 6);
25  {
26   localize_delete '@main::a', 4, 0;
27   is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (nonexistent), 0 [ok]';
28  }
29  is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (nonexistent), 0 [end]';
30 }
31
32 {
33  local @a = (4 .. 6);
34  local $a[4] = 7;
35  {
36   localize_delete '@main::a', 4, 0;
37   is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (exists), 0 [ok]';
38  }
39  is_deeply \@a, [ 4 .. 6, undef, 7 ], 'localize_delete "@a", 4 (exists), 0 [end]';
40 }
41
42 {
43  local @a = (4 .. 6);
44  {
45   localize_delete '@main::a', -2, 0;
46   is_deeply \@a, [ 4, undef, 6 ], 'localize_delete "@a", -2, 0 [ok]';
47  }
48  is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", -2, 0 [end]';
49 }
50
51 {
52  local @a = (4 .. 6);
53  local $a[4] = 7;
54  {
55   localize_delete '@main::a', -1, 0;
56   is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", -1 (exists), 0 [ok]';
57  }
58  is_deeply \@a, [ 4 .. 6, undef, 7 ], 'localize_delete "@a", -1 (exists), 0 [end]';
59 }
60
61 {
62  local @a = (4 .. 6);
63  {
64   eval { localize_delete '@main::a', -4, 0 };
65   like $@, qr/Modification of non-creatable array value attempted, subscript -4/, 'localize_delete "@a", -4 (out of bounds), 0 [ok]';
66  }
67  is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", -4 (out of bounds), 0 [end]';
68 }
69
70 {
71  local @a = (4 .. 6);
72  {
73   local @a = (5 .. 7);
74   {
75    localize_delete '@main::a', 1, 1;
76    is_deeply \@a, [ 5 .. 7 ], 'localize_delete "@a", 1, 1 [not yet]';
77   }
78   is_deeply \@a, [ 5, undef, 7 ], 'localize_delete "@a", 1, 1 [ok]';
79  }
80  is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 1, 1 [end]';
81 }
82
83 {
84  local @a = (4 .. 6);
85  {
86   local @a = (5 .. 7);
87   {
88    localize_delete '@main::a', 4, 1;
89    is_deeply \@a, [ 5 .. 7 ], 'localize_delete "@a", 4 (nonexistent), 1 [not yet]';
90   }
91   is_deeply \@a, [ 5 .. 7 ], 'localize_delete "@a", 4 (nonexistent), 1 [ok]';
92  }
93  is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (nonexistent), 1 [end]';
94 }
95
96 {
97  local @a = (4 .. 6);
98  {
99   local @a = (5 .. 7);
100   local $a[4] = 8;
101   {
102    localize_delete '@main::a', 4, 1;
103    is_deeply \@a, [ 5 .. 7, undef, 8 ], 'localize_delete "@a", 4 (exists), 1 [not yet]';
104   }
105   is_deeply \@a, [ 5 .. 7 ], 'localize_delete "@a", 4 (exists), 1 [ok]';
106  }
107  is_deeply \@a, [ 4 .. 6 ], 'localize_delete "@a", 4 (exists), 1 [end]';
108 }
109
110 # Hashes
111
112 our %h;
113
114 {
115  local %h = (a => 1, b => 2);
116  {
117   localize_delete '%main::h', 'a', 0;
118   is_deeply \%h, { b => 2 }, 'localize_delete "%h", "a", 0 [ok]';
119  }
120  is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "a", 0 [end]';
121 }
122
123 {
124  local %h = (a => 1, b => 2);
125  {
126   localize_delete '%main::h', 'c', 0;
127   is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "c", 0 [ok]';
128  }
129  is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "c", 0 [end]';
130 }
131
132 {
133  local %h = (a => 1, b => 2);
134  {
135   local %h = (a => 3, c => 4);
136   {
137    localize_delete '%main::h', 'a', 1;
138    is_deeply \%h, { a => 3, c => 4 }, 'localize_delete "%h", "a", 1 [not yet]';
139   }
140   is_deeply \%h, { c => 4 }, 'localize_delete "%h", "a", 1 [ok]';
141  }
142  is_deeply \%h, { a => 1, b => 2 }, 'localize_delete "%h", "a", 1 [end]';
143 }
144
145 # Others
146
147 our $x = 1;
148 {
149  localize_delete '$x', 2, 0;
150  is $x, undef, 'localize "$x", anything, 0 [ok]';
151 }
152 is $x, 1, 'localize "$x", anything, 0 [end]';
153
154 sub x { 1 };
155 {
156  localize_delete '&x', 2, 0;
157  ok !exists(&x), 'localize "&x", anything, 0 [ok]';
158 }
159 is x(), 1, 'localize "&x", anything, 0 [end]';
160
161 {
162  localize_delete *x, sub { }, 0;
163  is !exists(&x),  1, 'localize *x, anything, 0 [ok 1]';
164  is !defined($x), 1, 'localize *x, anything, 0 [ok 2]';
165 }
166 is x(), 1, 'localize *x, anything, 0 [end 1]';
167 is $x,  1, 'localize *x, anything, 0 [end 2]';