]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blob - t/44-localize_delete-magic.t
0b930505f4a20896fd08684df21b4267de3c7285
[perl/modules/Scope-Upper.git] / t / 44-localize_delete-magic.t
1 #!perl
2
3 use strict;
4 use warnings;
5
6 use Scope::Upper qw/localize_delete/;
7
8 use Test::More tests => 9;
9
10 our $deleted;
11
12 {
13  package Scope::Upper::Test::TiedArray;
14
15  sub TIEARRAY { bless [], $_[0] }
16  sub STORE { $_[0]->[$_[1]] = $_[2] }
17  sub FETCH { $_[0]->[$_[1]] }
18  sub CLEAR { @{$_[0]} = (); }
19  sub FETCHSIZE { scalar @{$_[0]} }
20  sub DELETE { ++$main::deleted; delete $_[0]->[$_[1]] }
21  sub EXTEND {}
22
23  our $NEGATIVE_INDICES = 0;
24 }
25
26 our @a;
27
28 tie @a, 'Scope::Upper::Test::TiedArray';
29 {
30  local @a = (5 .. 7);
31  local $a[4] = 9;
32  is $deleted, undef, 'localize_delete @tied_array, $existent => 0 [not deleted]';
33  {
34   localize_delete '@a', 4 => 0;
35   is $deleted, 1, 'localize_delete @tied_array, $existent => 0 [deleted]';
36   is_deeply \@a, [ 5 .. 7 ], 'localize_delete @tied_array, $existent => 0 [ok]';
37  }
38  is_deeply \@a, [ 5 .. 7, undef, 9 ], 'localize_elem @incomplete_tied_array, $nonexistent, 12 => 0 [end]';
39  is $deleted, 1, 'localize_delete @tied_array, $existent => 0 [not more deleted]';
40 }
41
42 {
43  local @a = (4 .. 6);
44  local $a[4] = 7;
45  {
46   localize_delete '@main::a', -1, 0;
47   is_deeply \@a, [ 4 .. 6 ], 'localize_delete @tied_array, $existent_neg => 0 [ok]';
48  }
49  is_deeply \@a, [ 4 .. 6, undef, 7 ], 'localize_delete @tied_array, $existent_neg => 0 [end]';
50 }
51
52 SKIP:
53 {
54  skip '$NEGATIVE_INDICES has no special meaning on 5.8.0 and older' => 2 if $] < 5.008_001;
55  local $Scope::Upper::Test::TiedArray::NEGATIVE_INDICES = 1;
56  local @a = (4 .. 6);
57  local $a[4] = 7;
58  {
59   localize_delete '@main::a', -1, 0;
60   is_deeply \@a, [ 4 .. 6 ], 'localize_delete @tied_array_wo_neg, $existent_neg => 0 [ok]';
61  }
62  is_deeply \@a, [ 4, 5, 7 ], 'localize_delete @tied_array_wo_neg, $existent_neg => 0 [end]';
63 }