X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F20-localize-target.t;fp=t%2F20-localize-target.t;h=5d23469adb1b554973dde9cefc7612213d9e0f64;hb=cd7bfde845927d38ca43bd7430503f388260d53a;hp=0000000000000000000000000000000000000000;hpb=bb65dbcf7daba3ac5c7e0f933745762bf6ea56bf;p=perl%2Fmodules%2FScope-Upper.git diff --git a/t/20-localize-target.t b/t/20-localize-target.t new file mode 100644 index 0000000..5d23469 --- /dev/null +++ b/t/20-localize-target.t @@ -0,0 +1,253 @@ +#!perl -T + +use strict; +use warnings; + +use Test::More tests => 50; + +use Scope::Upper qw/localize/; + +# Scalars + +our $x; + +{ + local $x = 2; + { + localize *x, \1, 0; + is $x, 1, 'localize *x, \1, 0 [ok]'; + } + is $x, 2, 'localize *x, \1, 0 [end]'; +} + +sub _t { shift->{t} } + +{ + local $x; + { + localize *x, \bless({ t => 1 }, 'main'), 0; + is ref($x), 'main', 'localize *x, obj, 0 [ref]'; + is $x->_t, 1, 'localize *x, obj, 0 [meth]'; + } + is $x, undef, 'localize *x, obj, 0 [end]'; +} + +{ + local $x = 2; + { + local $x = 3; + localize *x, 1, 0; + is $x, undef, 'localize *x, 1, 0 [ok]'; + } + is $x, $] < 5.008009 ? undef : 2, 'localize *x, 1, 0 [end]'; +} +undef *x; + +{ + local $x = 7; + { + localize '$x', 2, 0; + is $x, 2, 'localize "$x", 2, 0 [ok]'; + } + is $x, 7, 'localize "$x", 2, 0 [end]'; +} + +{ + local $x = 8; + { + localize ' $x', 3, 0; + is $x, 3, 'localize " $x", 3, 0 [ok]'; + } + is $x, 8, 'localize " $x", 3, 0 [end]'; +} + +SKIP: +{ + skip 'Can\'t localize through a reference in 5.6' => 2 if $] < 5.008; + eval q{ + no strict 'refs'; + local ${''} = 9; + { + localize '$', 4, 0; + is ${''}, 4, 'localize "$", 4, 0 [ok]'; + } + is ${''}, 9, 'localize "$", 4, 0 [end]'; + }; +} + +SKIP: +{ + skip 'Can\'t localize through a reference in 5.6' => 2 if $] < 5.008; + eval q{ + no strict 'refs'; + local ${''} = 10; + { + localize '', 5, 0; + is ${''}, 5, 'localize "", 4, 0 [ok]'; + } + is ${''}, 10, 'localize "", 4, 0 [end]'; + }; +} + +{ + local $x = 2; + { + localize 'x', \1, 0; + is $x, 1, 'localize "x", \1, 0 [ok]'; + } + is $x, 2, 'localize "x", \1, 0 [end]'; +} + +{ + local $x = 4; + { + localize 'x', 3, 0; + is $x, 3, 'localize "x", 3, 0 [ok]'; + } + is $x, 4, 'localize "x", 3, 0 [end]'; +} + +{ + local $x; + { + localize 'x', bless({ t => 2 }, 'main'), 0; + is ref($x), 'main', 'localize "x", obj, 0 [ref]'; + is $x->_t, 2, 'localize "x", obj, 0 [meth]'; + } + is $x, undef, 'localize "x", obj, 0 [end]'; +} + +sub callthrough (*$) { + my ($what, $val) = @_; + if (ref $what) { + $what = $$what; + $val = eval "\\$val"; + } + local $x = 'x'; + localize $what, $val, 1; + is $x, 'x', 'localize callthrough [not yet]'; +} + +{ + package Scope::Upper::Test::Mock1; + our $x; + { + main::callthrough(*x, 4); + Test::More::is($x, 4, 'localize glob [ok - SUTM1]'); + Test::More::is($main::x, undef, 'localize glob [ok - main]'); + } +} + +{ + package Scope::Upper::Test::Mock2; + our $x; + { + main::callthrough(*main::x, 5); + Test::More::is($x, undef, 'localize qualified glob [ok - SUTM2]'); + Test::More::is($main::x, 5, 'localize qualified glob [ok - main]'); + } +} + +{ + package Scope::Upper::Test::Mock3; + our $x; + { + main::callthrough('$main::x', 6); + Test::More::is($x, undef, 'localize fully qualified name [ok - SUTM3]'); + Test::More::is($main::x, 6, 'localize fully qualified name [ok - main]'); + } +} + +{ + package Scope::Upper::Test::Mock4; + our $x; + { + main::callthrough('$x', 7); + Test::More::is($x, 7, 'localize unqualified name [ok - SUTM4]'); + Test::More::is($main::x, undef, 'localize unqualified name [ok - main]'); + } +} + +$_ = 'foo'; +{ + package Scope::Upper::Test::Mock5; + { + main::callthrough('$_', 'bar'); + Test::More::ok(/bar/, 'localize $_ [ok]'); + } +} +undef $_; + +# Arrays + +our @a; +my $xa = [ 7 .. 9 ]; + +{ + local @a = (4 .. 6); + { + localize *a, $xa, 0; + is_deeply \@a, $xa, 'localize *a, [ ], 0 [ok]'; + } + is_deeply \@a, [ 4 .. 6 ], 'localize *a, [ ], 0 [end]'; +} + +{ + local @a = (4 .. 6); + { + local @a = (5 .. 7); + { + localize *a, $xa, 1; + is_deeply \@a, [ 5 .. 7 ], 'localize *a, [ ], 1 [not yet]'; + } + is_deeply \@a, $xa, 'localize *a, [ ], 1 [ok]'; + } + is_deeply \@a, [ 4 .. 6 ], 'localize *a, [ ], 1 [end]'; +} + +# Hashes + +our %h; +my $xh = { a => 5, c => 7 }; + +{ + local %h = (a => 1, b => 2); + { + localize *h, $xh, 0; + is_deeply \%h, $xh, 'localize *h, { }, 0 [ok]'; + } + is_deeply \%h, { a => 1, b => 2 }, 'localize *h, { }, 0 [end]'; +} + +{ + local %h = (a => 1, b => 2); + { + local %h = (b => 3, c => 4); + { + localize *h, $xh, 1; + is_deeply \%h, { b => 3, c => 4 }, 'localize *h, { }, 1 [not yet]'; + } + is_deeply \%h, $xh, 'localize *h, { }, 1 [ok]'; + } + is_deeply \%h, { a => 1, b => 2 }, 'localize *h, { }, 1 [end]'; +} + +# Code + +{ + local *foo = sub { 7 }; + { + localize *foo, sub { 6 }, 1; + is foo(), 7, 'localize *foo, sub { 6 }, 1 [not yet]'; + } + is foo(), 6, 'localize *foo, sub { 6 }, 1 [ok]'; +} + +{ + local *foo = sub { 9 }; + { + localize '&foo', sub { 8 }, 1; + is foo(), 9, 'localize "&foo", sub { 8 }, 1 [not yet]'; + } + is foo(), 8, 'localize "&foo", sub { 8 }, 1 [ok]'; +}