X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F031_method_modifiers.t;h=73c915a539949ad3f8541a032ca901103eac84ea;hb=361c5bc4c9e1dc0f1d8e64bb649396b124b4c55d;hp=3e8c61720511a09a7e4a24ecb289427e4a88affd;hpb=de19f1153a5df8765eae928ea430b7acab545554;p=gitmo%2FClass-MOP.git diff --git a/t/031_method_modifiers.t b/t/031_method_modifiers.t index 3e8c617..73c915a 100644 --- a/t/031_method_modifiers.t +++ b/t/031_method_modifiers.t @@ -3,7 +3,7 @@ use strict; use warnings; -use Test::More no_plan => 18; +use Test::More tests => 26; use Test::Exception; BEGIN { @@ -11,34 +11,109 @@ BEGIN { use_ok('Class::MOP::Method'); } -my $trace = ''; +# test before and afters +{ + my $trace = ''; -my $method = Class::MOP::Method->new(sub { $trace .= 'primary' }); -isa_ok($method, 'Class::MOP::Method'); + my $method = Class::MOP::Method->wrap(sub { $trace .= 'primary' }); + isa_ok($method, 'Class::MOP::Method'); -$method->(); -is($trace, 'primary', '... got the right return value from method'); -$trace = ''; + $method->(); + is($trace, 'primary', '... got the right return value from method'); + $trace = ''; -my $wrapped = $method->wrap(); -isa_ok($wrapped, 'Class::MOP::Method'); + my $wrapped = Class::MOP::Method::Wrapped->wrap($method); + isa_ok($wrapped, 'Class::MOP::Method::Wrapped'); + isa_ok($wrapped, 'Class::MOP::Method'); -$wrapped->(); -is($trace, 'primary', '... got the right return value from the wrapped method'); -$trace = ''; + $wrapped->(); + is($trace, 'primary', '... got the right return value from the wrapped method'); + $trace = ''; -lives_ok { - $wrapped->add_before_modifier(sub { $trace .= 'before -> ' }); -} '... added the before modifier okay'; + lives_ok { + $wrapped->add_before_modifier(sub { $trace .= 'before -> ' }); + } '... added the before modifier okay'; + + $wrapped->(); + is($trace, 'before -> primary', '... got the right return value from the wrapped method (w/ before)'); + $trace = ''; + + lives_ok { + $wrapped->add_after_modifier(sub { $trace .= ' -> after' }); + } '... added the after modifier okay'; + + $wrapped->(); + is($trace, 'before -> primary -> after', '... got the right return value from the wrapped method (w/ before)'); + $trace = ''; +} + +# test around method +{ + my $method = Class::MOP::Method->wrap(sub { 4 }); + isa_ok($method, 'Class::MOP::Method'); + + is($method->(), 4, '... got the right value from the wrapped method'); + + my $wrapped = Class::MOP::Method::Wrapped->wrap($method); + isa_ok($wrapped, 'Class::MOP::Method::Wrapped'); + isa_ok($wrapped, 'Class::MOP::Method'); + + is($wrapped->(), 4, '... got the right value from the wrapped method'); + + lives_ok { + $wrapped->add_around_modifier(sub { (3, $_[0]->()) }); + $wrapped->add_around_modifier(sub { (2, $_[0]->()) }); + $wrapped->add_around_modifier(sub { (1, $_[0]->()) }); + $wrapped->add_around_modifier(sub { (0, $_[0]->()) }); + } '... added the around modifier okay'; + + is_deeply( + [ $wrapped->() ], + [ 0, 1, 2, 3, 4 ], + '... got the right results back from the around methods (in list context)'); + + is(scalar $wrapped->(), 4, '... got the right results back from the around methods (in scalar context)'); +} + +{ + my @tracelog; + + my $method = Class::MOP::Method->wrap(sub { push @tracelog => 'primary' }); + isa_ok($method, 'Class::MOP::Method'); + + my $wrapped = Class::MOP::Method::Wrapped->wrap($method); + isa_ok($wrapped, 'Class::MOP::Method::Wrapped'); + isa_ok($wrapped, 'Class::MOP::Method'); + + lives_ok { + $wrapped->add_before_modifier(sub { push @tracelog => 'before 1' }); + $wrapped->add_before_modifier(sub { push @tracelog => 'before 2' }); + $wrapped->add_before_modifier(sub { push @tracelog => 'before 3' }); + } '... added the before modifier okay'; + + lives_ok { + $wrapped->add_around_modifier(sub { push @tracelog => 'around 1'; $_[0]->(); }); + $wrapped->add_around_modifier(sub { push @tracelog => 'around 2'; $_[0]->(); }); + $wrapped->add_around_modifier(sub { push @tracelog => 'around 3'; $_[0]->(); }); + } '... added the around modifier okay'; + + lives_ok { + $wrapped->add_after_modifier(sub { push @tracelog => 'after 1' }); + $wrapped->add_after_modifier(sub { push @tracelog => 'after 2' }); + $wrapped->add_after_modifier(sub { push @tracelog => 'after 3' }); + } '... added the after modifier okay'; + + $wrapped->(); + is_deeply( + \@tracelog, + [ + 'before 3', 'before 2', 'before 1', # last-in-first-out order + 'around 3', 'around 2', 'around 1', # last-in-first-out order + 'primary', + 'after 1', 'after 2', 'after 3', # first-in-first-out order + ], + '... got the right tracelog from all our before/around/after methods'); +} -$wrapped->(); -is($trace, 'before -> primary', '... got the right return value from the wrapped method (w/ before)'); -$trace = ''; -lives_ok { - $wrapped->add_after_modifier(sub { $trace .= ' -> after' }); -} '... added the after modifier okay'; -$wrapped->(); -is($trace, 'before -> primary -> after', '... got the right return value from the wrapped method (w/ before)'); -$trace = ''; \ No newline at end of file