X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F35-stash.t;h=6be01aa550eaf7b339b82cf1d4beeb5c0e062b1f;hb=a4e7b4c7ea392db794d6729cfeb792c445edcb06;hp=1f42afd22c8f8673d1f427bf6e4b510eb3c29774;hpb=63629d8ba1033ced266fc831fd4089a0f76c006d;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/t/35-stash.t b/t/35-stash.t index 1f42afd..6be01aa 100644 --- a/t/35-stash.t +++ b/t/35-stash.t @@ -9,7 +9,7 @@ use Variable::Magic qw/wizard cast dispell VMG_UVAR VMG_OP_INFO_NAME VMG_OP_INFO my $run; if (VMG_UVAR) { - plan tests => 23; + plan tests => 43; $run = 1; } else { plan skip_all => 'uvar magic is required to test symbol table hooks'; @@ -88,10 +88,12 @@ cast %Hlagh::, $wiz; roam(); }; + my @calls = qw/eat shoot leave roam yawn roam/; + is $@, "ok\n", 'stash: function calls compiled fine'; is_deeply \%mg, { - fetch => [ qw/eat shoot leave roam yawn roam/ ], - store => [ qw/eat shoot leave roam yawn roam/ ], + fetch => \@calls, + store => ($] < 5.011002 ? \@calls : [ map { ($_) x 2 } @calls ]), }, 'stash: function calls'; } @@ -106,6 +108,28 @@ cast %Hlagh::, $wiz; }, 'stash: valid method call'; } +{ + local %mg; + + eval q{ Hlagh->shoot() }; + + is $@, '', 'stash: second valid method call ran fine'; + is_deeply \%mg, { + fetch => [ qw/shoot/ ], + }, 'stash: second valid method call'; +} + +{ + local %mg; + + eval q{ my $meth = 'shoot'; Hlagh->$meth() }; + + is $@, '', 'stash: valid dynamic method call ran fine'; + is_deeply \%mg, { + store => [ qw/shoot/ ], + }, 'stash: valid dynamic method call'; +} + { local %mg; @@ -113,13 +137,42 @@ cast %Hlagh::, $wiz; package Hlagher; our @ISA; BEGIN { @ISA = 'Hlagh' } - Hlagher->shoot() + Hlagher->leave() ]; is $@, '', 'inherited valid method call ran fine'; is_deeply \%mg, { - fetch => [ qw/ISA shoot/ ], - }, 'stash: direct method call'; + fetch => [ qw/ISA leave/ ], + }, 'stash: inherited valid method call'; +} + +{ + local %mg; + + eval q{ Hlagher->leave() }; + + is $@, '', 'second inherited valid method call ran fine'; + is_deeply \%mg, { }, 'stash: second inherited valid method call doesn\'t call magic'; +} + +{ + local %mg; + + eval q{ Hlagher->shoot() }; + + is $@, '', 'inherited previously called valid method call ran fine'; + is_deeply \%mg, { + fetch => [ qw/shoot/ ], + }, 'stash: inherited previously called valid method call'; +} + +{ + local %mg; + + eval q{ Hlagher->shoot() }; + + is $@, '', 'second inherited previously called valid method call ran fine'; + is_deeply \%mg, { }, 'stash: second inherited previously called valid method call doesn\'t call magic'; } { @@ -134,6 +187,17 @@ cast %Hlagh::, $wiz; }, 'stash: invalid method call'; } +{ + local %mg; + + eval q{ my $meth = 'unknown_too'; Hlagh->$meth() }; + + like $@, qr/^Can't locate object method "unknown_too" via package "Hlagh"/, 'stash: invalid dynamic method call croaked'; + is_deeply \%mg, { + store => [ qw/unknown_too AUTOLOAD/ ], + }, 'stash: invalid dynamic method call'; +} + { local %mg; @@ -169,18 +233,68 @@ END { dispell %Hlagh::, $wiz; +{ + package AutoHlagh; + + use vars qw/$AUTOLOAD/; + + sub AUTOLOAD { return $AUTOLOAD } +} + +cast %AutoHlagh::, $wiz; + +{ + local %mg; + + my $res = eval q{ AutoHlagh->autoloaded() }; + + is $@, '', 'stash: autoloaded method call ran fine'; + is $res, 'AutoHlagh::autoloaded', + 'stash: autoloaded method call returned the right thing'; + is_deeply \%mg, { + fetch => [ qw/autoloaded/ ], + store => [ qw/autoloaded AUTOLOAD AUTOLOAD/ ], + }, 'stash: autoloaded method call'; +} + +{ + package AutoHlagher; + + our @ISA; + BEGIN { @ISA = ('AutoHlagh') } +} + +{ + local %mg; + + my $res = eval q{ AutoHlagher->also_autoloaded() }; + + is $@, '', 'stash: inherited autoloaded method call ran fine'; + is $res, 'AutoHlagher::also_autoloaded', + 'stash: inherited autoloaded method returned the right thing'; + is_deeply \%mg, { + fetch => [ qw/also_autoloaded AUTOLOAD/ ], + store => [ qw/AUTOLOAD/ ], + }, 'stash: inherited autoloaded method call'; +} + +dispell %AutoHlagh::, $wiz; + +my $uo = 0; $code = 'wizard ' . join (', ', map { < sub { my \$d = \$_[1]; return 0 if \$d->{guard}; local \$d->{guard} = 1; - is \$_[3], undef, 'stash: undef op'; + ++\$uo; () } CB } qw/fetch store exists delete/); +my $uo_exp = $] < 5.011002 ? 2 : 3; + $code .= ', data => sub { +{ guard => 0 } }'; $wiz = eval $code . ', op_info => ' . VMG_OP_INFO_NAME; @@ -188,27 +302,35 @@ diag $@ if $@; cast %Hlagh::, $wiz; +is $uo, 0, 'stash: no undef op before function call with op name'; eval q{ die "ok\n"; package Hlagh; meh(); }; - -is $@, "ok\n", 'stash: function call with op name compiled fine'; +is $@, "ok\n", 'stash: function call with op name compiled fine'; +is $uo, $uo_exp, 'stash: undef op after function call with op name'; dispell %Hlagh::, $wiz; +is $uo, $uo_exp, 'stash: undef op after dispell for function call with op name'; + +$uo = 0; $wiz = eval $code . ', op_info => ' . VMG_OP_INFO_OBJECT; diag $@ if $@; cast %Hlagh::, $wiz; +is $uo, 0, 'stash: no undef op before function call with op object'; eval q{ die "ok\n"; package Hlagh; wat(); }; - -is $@, "ok\n", 'stash: function call with op object compiled fine'; +is $@, "ok\n", 'stash: function call with op object compiled fine'; +is $uo, $uo_exp, + 'stash: undef op after dispell for function call with op object'; dispell %Hlagh::, $wiz; +is $uo, $uo_exp, + 'stash: undef op after dispell for function call with op object';