#!/usr/bin/perl # Testing of the three wantarray-related pointcuts. # Because each advice type generates different code, # it's important to test with each different variation. use strict; BEGIN { $| = 1; $^W = 1; } use Test::More tests => 16; use Test::NoWarnings; use Test::Exception; use Aspect ':deprecated'; use vars qw{$COUNT}; ###################################################################### # Wantarray with after_returning() advice $COUNT = 0; Aspect::after_returning { $COUNT += 1 } call 'Foo::after_returning_one' & wantlist; Aspect::after_returning { $COUNT += 10 } call 'Foo::after_returning_two' & wantscalar; Aspect::after_returning { $COUNT += 100 } call 'Foo::after_returning_three' & wantvoid; SCOPE: { my @l = Foo::after_returning_one(); my $s = Foo::after_returning_one(); Foo::after_returning_one(); } is( $COUNT, 1, 'Matched wantlist' ); SCOPE: { my @l = Foo::after_returning_two(); my $s = Foo::after_returning_two(); Foo::after_returning_two(); } is( $COUNT, 11, 'Matched wantscalar' ); SCOPE: { my @l = Foo::after_returning_three(); my $s = Foo::after_returning_three(); Foo::after_returning_three(); } is( $COUNT, 111, 'Matched wantvoid' ); ###################################################################### # Wantarray with after_throwing() advice $COUNT = 0; Aspect::after_throwing { $COUNT += 1 } call 'Foo::after_throwing_one' & wantlist; Aspect::after_throwing { $COUNT += 10 } call 'Foo::after_throwing_two' & wantscalar; Aspect::after_throwing { $COUNT += 100 } call 'Foo::after_throwing_three' & wantvoid; SCOPE: { throws_ok( sub { my @l = Foo::after_throwing_one(); }, qr/one/, 'after_throwing wantarray array' ); throws_ok( sub { my $s = Foo::after_throwing_one(); }, qr/one/, 'after_throwing wantarray scalar' ); throws_ok( sub { Foo::after_throwing_one(); }, qr/one/, 'after_throwing wantarray void' ); } is( $COUNT, 1, 'Matched wantlist' ); SCOPE: { throws_ok( sub { my @l = Foo::after_throwing_two(); }, qr/two/, 'after_throwing wantscalar array' ); throws_ok( sub { my $s = Foo::after_throwing_two(); }, qr/two/, 'after_throwing wantscalar scalar' ); throws_ok( sub { Foo::after_throwing_two(); }, qr/two/, 'after_throwing wantscalar void' ); } is( $COUNT, 11, 'Matched wantscalar' ); SCOPE: { throws_ok( sub { my @l = Foo::after_throwing_three(); }, qr/three/, 'after_throwing wantvoid array' ); throws_ok( sub { my $s = Foo::after_throwing_three(); }, qr/three/, 'after_throwing wantvoid scalar' ); throws_ok( sub { Foo::after_throwing_three(); }, qr/three/, 'after_throwing wantvoid void' ); } is( $COUNT, 111, 'Matched wantvoid' ); ###################################################################### # Support Methods package Foo; sub after_returning_one { 1 } sub after_returning_two { 2 } sub after_returning_three { 3 } sub after_throwing_one { die 'one' } sub after_throwing_two { die 'two' } sub after_throwing_three { die 'three' }