X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F14-callbacks.t;h=6a1f56f1e0cc35704a06123ff1843d44a01ae5e0;hb=HEAD;hp=cc4eb4c588acafe817cdc9d71a1bd2af53475975;hpb=c1f14d9f670d6c298c7e120ea6e56cc764746537;p=perl%2Fmodules%2FVariable-Magic.git diff --git a/t/14-callbacks.t b/t/14-callbacks.t index cc4eb4c..6a1f56f 100644 --- a/t/14-callbacks.t +++ b/t/14-callbacks.t @@ -3,9 +3,9 @@ use strict; use warnings; -use Test::More tests => 12 + 9 * (5 + 6 + 5); +use Test::More tests => 26; -use Variable::Magic qw/wizard cast dispell VMG_OP_INFO_NAME VMG_OP_INFO_OBJECT/; +use Variable::Magic qw; my $wiz = eval { wizard get => sub { undef } }; is($@, '', 'wizard creation doesn\'t croak'); @@ -27,6 +27,59 @@ eval { is($@, '', 'callback returning undef doesn\'t warn/croak'); is($x, $n, 'callback returning undef fails'); +{ + my $c = 0; + sub X::wat { ++$c } + my $wiz = eval { wizard get => \'X::wat' }; + is($@, '', 'wizard with a qualified string callback doesn\'t croak'); + my $b = $n; + my $res = eval { cast $b, $wiz }; + is($@, '', 'cast a wizard with a qualified string callback doesn\'t croak'); + my $x; + eval { + local $SIG{__WARN__} = sub { die }; + $x = $b; + }; + is($@, '', 'qualified string callback doesn\'t warn/croak'); + is($c, 1, 'qualified string callback is called'); + is($x, $n, 'qualified string callback returns the right thing'); +} + +{ + my $c = 0; + sub wut { fail 'main::wut was called' } + sub Y::wut { ++$c } + my $wiz = eval { wizard get => \'wut' }; + is($@, '', 'wizard with a short string callback doesn\'t croak'); + my $b = $n; + my $res = eval { cast $b, $wiz }; + is($@, '', 'cast a wizard with a short string callback doesn\'t croak'); + my $x; + eval { + local $SIG{__WARN__} = sub { die }; + package Y; + $x = $b; + }; + is($@, '', 'short string callback doesn\'t warn/croak'); + is($c, 1, 'short string callback is called'); + is($x, $n, 'short string callback returns the right thing'); +} + +{ + my $wiz = eval { wizard get => \undef }; + is($@, '', 'wizard with a ref-to-undef callback doesn\'t croak'); + my $b = $n; + my $res = eval { cast $b, $wiz }; + is($@, '', 'cast a wizard with a ref-to-undef callback doesn\'t croak'); + my $x; + eval { + local $SIG{__WARN__} = sub { die }; + $x = $b; + }; + is($@, '', 'ref-to-undef callback doesn\'t warn/croak'); + is($x, $n, 'ref-to-undef callback returns the right thing'); +} + my @callers; $wiz = wizard get => sub { my @c; @@ -41,20 +94,20 @@ cast $b, $wiz; my $u = $b; is_deeply(\@callers, [ - [ 'main', $0, __LINE__-2 ], + ([ 'main', $0, __LINE__-2 ]) x 2, ], 'caller into callback returns the right thing'); @callers = (); $u = $b; is_deeply(\@callers, [ - [ 'main', $0, __LINE__-2 ], + ([ 'main', $0, __LINE__-2 ]) x 2, ], 'caller into callback returns the right thing (second time)'); { @callers = (); my $u = $b; is_deeply(\@callers, [ - [ 'main', $0, __LINE__-2 ], + ([ 'main', $0, __LINE__-2 ]) x 2, ], 'caller into callback into block returns the right thing'); } @@ -62,63 +115,6 @@ is_deeply(\@callers, [ eval { my $u = $b }; is($@, '', 'caller into callback doesn\'t croak'); is_deeply(\@callers, [ - ([ 'main', $0, __LINE__-3 ]) x 2, + ([ 'main', $0, __LINE__-3 ]) x 3, ], 'caller into callback into eval returns the right thing'); -sub Variable::Magic::TestPkg::foo { } - -my @tests = ( - [ 'len', '@c', undef, 'my $x = @c', [ 'padav', 'B::OP' ] ], - [ 'get', '$c', undef, '++$c', [ 'preinc', 'B::UNOP' ] ], - [ 'get', '$c', '$c = 1', '$c ** 2', [ 'pow', 'B::BINOP' ] ], - [ 'get', '$c', undef, 'my $x = $c', [ 'sassign', 'B::BINOP' ] ], - [ 'get', '$c', undef, '1 if $c', [ 'and', 'B::LOGOP' ] ], - [ 'set', '$c', undef, 'bless \$c, "main"', [ 'bless', 'B::LISTOP' ] ], - [ 'get', '$c', '$c = ""', '$c =~ /x/', [ 'match', 'B::PMOP' ] ], - [ 'get', '$c', '$c = "Variable::Magic::TestPkg"', - '$c->foo()', [ 'method_named', 'B::SVOP' ] ], - [ 'get', '$c', '$c = ""', '$c =~ y/x/y/', [ 'trans', 'B::PVOP' ] ], -); - -for (@tests) { - my ($key, $var, $init, $test, $exp) = @$_; - - for my $op_info (VMG_OP_INFO_NAME, VMG_OP_INFO_OBJECT, 3) { - our $done; - my ($c, @c); - - # We must test for the $op correctness inside the callback because, if we - # bring it out, it will go outside of the eval STRING scope, and what it - # points to will no longer exist. - eval { - $wiz = wizard $key => sub { - return if $done; - my $op = $_[-1]; - my $desc = "$key magic with op_info == $op_info"; - if ($op_info == 1) { - is $op, $exp->[0], "$desc gets the right op info"; - } elsif ($op_info == 2) { - isa_ok $op, $exp->[1], $desc; - is $op->name, $exp->[0], "$desc gets the right op info"; - } else { - is $op, undef, "$desc gets the right op info"; - } - $done = 1; - () - }, op_info => $op_info - }; - is $@, '', "$key wizard with op_info == $op_info doesn't croak"; - - eval $init if defined $init; - - eval "cast $var, \$wiz"; - is $@, '', "$key cast with op_info == $op_info doesn't croak"; - - local $done = 0; - eval $test; - is $@, '', "$key magic with op_info == $op_info doesn't croak"; - - eval "dispell $var, \$wiz"; - is $@, '', "$key dispell with op_info == $op_info doesn't croak"; - } -}