]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blob - t/34-localize_elem-magic.t
2754885a41aa7b04fa6412ec646690271ad5d103
[perl/modules/Scope-Upper.git] / t / 34-localize_elem-magic.t
1 #!perl
2
3 use strict;
4 use warnings;
5
6 use Scope::Upper qw/localize_elem/;
7
8 use Test::More tests => 8;
9
10 {
11  package Scope::Upper::Test::TiedArray;
12
13  sub TIEARRAY { bless [], $_[0] }
14  sub STORE { $_[0]->[$_[1]] = $_[2] }
15  sub FETCH { $_[0]->[$_[1]] }
16  sub CLEAR { @{$_[0]} = (); }
17  sub FETCHSIZE { scalar @{$_[0]} }
18  sub EXTEND {}
19 }
20
21 our @a;
22
23 tie @a, 'Scope::Upper::Test::TiedArray';
24 {
25  local @a = (5 .. 7);
26  {
27   localize_elem '@a', 4 => 12 => 0;
28   is_deeply \@a, [ 5 .. 7, undef, 12 ], 'localize_elem @incomplete_tied_array, $nonexistent, 12 => 0 [ok]';
29  }
30  is_deeply \@a, [ 5 .. 7, undef, undef ], 'localize_elem @incomplete_tied_array, $nonexistent, 12 => 0 [end]';
31 }
32
33 our $x;
34
35 {
36  local $x;
37  local $SIG{__WARN__} = sub { };
38  {
39   {
40    localize_elem '%SIG', '__WARN__' => sub { $x = join '', @_ }, 1;
41    is $x, undef, 'localize_elem $SIG{__WARN__} [not yet]';
42   }
43   warn "1\n";
44   is $x, "1\n", 'localize_elem $SIG{__WARN__} [ok]';
45  }
46  warn "2\n";
47  is $x, "1\n", 'localize_elem $SIG{__WARN__} [done]';
48 }
49
50 sub runperl {
51  my ($val, $in, $desc) = @_;
52  system { $^X } $^X, '-e', "exit(\$ENV{SCOPE_UPPER_TEST} == $val ? 0 : 1)";
53 SKIP: {
54   skip "system() failed: $!" => 1 if $? == -1;
55   if ($in) {
56    is $?, 0, $desc;
57   } else {
58    isnt $?, 0, $desc;
59   }
60  }
61 }
62
63 eval "setpgrp 0, 0";
64
65 my $time = time;
66 {
67  local $ENV{SCOPE_UPPER_TEST};
68  {
69   {
70    localize_elem '%ENV', 'SCOPE_UPPER_TEST' => $time, 1;
71    runperl $time, 0, 'localize_elem $ENV{SCOPE_UPPER_TEST} [not yet]';
72   }
73   runperl $time, 1, 'localize_elem $ENV{SCOPE_UPPER_TEST} [ok]';
74  }
75  runperl $time, 0, 'localize_elem $ENV{SCOPE_UPPER_TEST} [done]';
76 }