X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F61-uplevel-args.t;h=5ef1f8324c09785ad09a6156ef255ac5b0e63ba6;hb=514b3cc42d4717ad8c48f61664e18d2fe656857d;hp=d4ee2edde3bd5829735a1a844776689e2071d2cf;hpb=aa7f19d0069d057cf99b963b2db36e7caccb6b2b;p=perl%2Fmodules%2FScope-Upper.git diff --git a/t/61-uplevel-args.t b/t/61-uplevel-args.t index d4ee2ed..5ef1f83 100644 --- a/t/61-uplevel-args.t +++ b/t/61-uplevel-args.t @@ -3,7 +3,7 @@ use strict; use warnings; -use Test::More tests => 9 + 4 * 7 + 3 + 2 + 6; +use Test::More tests => 9 + 4 * 7 + 3 + ((5 * 4 * 4) * 3 + 1) + 2 + 6; use Scope::Upper qw; @@ -144,6 +144,94 @@ sub { is $s, 'xyz', 'aliasing, two layers 2'; }->('dummy'); +# goto + +SKIP: { + if ("$]" < 5.008) { + my $cb = sub { fail "should not be executed" }; + local $@; + eval { sub { uplevel { goto $cb } HERE }->() }; + like $@, qr/^Can't goto to an uplevel'd stack frame on perl 5\.6/, + "goto croaks"; + skip "goto to an uplevel'd stack frame does not work on perl 5\.6" + => ((5 * 4 * 4) * 3 + 1) - 1; + } + + my @args = ( + [ [ ], [ 'm' ] ], + [ [ 'a' ], [ ] ], + [ [ 'b' ], [ 'n' ] ], + [ [ 'c' ], [ 'o', 'p' ] ], + [ [ 'd', 'e' ], [ 'q' ] ], + ); + + for my $args (@args) { + my ($out, $in) = @$args; + + my @out = @$out; + my @in = @$in; + + for my $reify_out (0, 1) { + for my $reify_in (0, 1) { + my $desc; + + my $base_test = sub { + if ($reify_in) { + is_deeply \@_, $in, "$desc: \@_ inside"; + } else { + is "@_", "@in", "$desc: \@_ inside"; + } + }; + + my $goto_test = sub { goto $base_test }; + my $uplevel_test = sub { &uplevel($base_test, @_, HERE) }; + my $goto_uplevel_test = sub { &uplevel($goto_test, @_, HERE) }; + + my @tests = ( + [ 'goto' => sub { goto $base_test } ], + [ 'goto in goto' => sub { goto $goto_test } ], + [ 'uplevel in goto' => sub { goto $uplevel_test } ], + [ 'goto in uplevel in goto' => sub { goto $goto_uplevel_test } ], + ); + + for my $test (@tests) { + ($desc, my $cb) = @$test; + $desc .= ' (' . @out . ' out, ' . @in . ' in'; + $desc .= ', reify out' if $reify_out; + $desc .= ', reify in' if $reify_in; + $desc .= ')'; + + local $@; + eval { + sub { + &uplevel($cb, @in, HERE); + if ($reify_out) { + is_deeply \@_, $out, "$desc: \@_ outside"; + } else { + is "@_", "@out", "$desc: \@_ outside"; + } + }->(@out); + }; + is $@, '', "$desc: no error"; + } + } + } + } + + sub { + my $s = 'caesar'; + my $cb = sub { + $_[0] = 'brutus'; + }; + sub { + uplevel { + goto $cb; + } $_[0], HERE; + }->($s); + is $s, 'brutus', 'aliasing and goto'; + }->('dummy'); +} + # Magic {