c3 tests and details
[gitmo/Class-MOP.git] / t / 031_method_modifiers.t
index bbb4e14..73c915a 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More no_plan => 18;
+use Test::More tests => 26;
 use Test::Exception;
 
 BEGIN {
@@ -15,14 +15,15 @@ BEGIN {
 {
        my $trace = '';
 
-       my $method = Class::MOP::Method->new(sub { $trace .= 'primary' });
+       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 = '';
 
-       my $wrapped = $method->wrap();
+       my $wrapped = Class::MOP::Method::Wrapped->wrap($method);
+       isa_ok($wrapped, 'Class::MOP::Method::Wrapped');
        isa_ok($wrapped, 'Class::MOP::Method');
 
        $wrapped->();
@@ -48,12 +49,13 @@ BEGIN {
 
 # test around method
 {
-       my $method = Class::MOP::Method->new(sub { 4 });
+       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 = $method->wrap;
+       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');
@@ -62,15 +64,56 @@ BEGIN {
                $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->() ],
-               [ 1, 2, 3, 4 ],
-               '... got the right results back from the around methods');
+               [ 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');
+}