5 use Test::More tests => 22;
7 BEGIN { use_ok('Sub::Uplevel'); }
8 can_ok('Sub::Uplevel', 'uplevel');
9 can_ok(__PACKAGE__, 'uplevel');
12 ok( !caller, "top-level caller() not screwed up" );
15 is( $@, "Died at $0 line 13.\n", 'die() not screwed up' );
26 is( bar(), "main - $0 - 25", 'uplevel()' );
29 # Sure, but does it fool die?
31 die "You must die! I alone am best!";
35 uplevel(1, \&try_die);
40 is( $@, "You must die! I alone am best! at $0 line 30.\n", 'die() fooled' );
45 warn "HA! You don't fool me!";
49 uplevel(1, \&try_warn);
55 local $SIG{__WARN__} = sub { $warning = join '', @_ };
59 is( $warning, "HA! You don't fool me! at $0 line 44.\n", 'warn() fooled' );
66 croak("Now we can fool croak!");
71 uplevel(1, \&try_croak);
75 # depending on perl version, we could get 'require 0' or 'eval {...}'
76 # in the stack. This test used to be 'require 0' for <= 5.006, but
77 # it broke on 5.005_05 test release, so we'll just take either
79 eval { wrap_croak() };
80 my $croak_regex = quotemeta( <<"CARP" );
81 Now we can fool croak! at $0 line 64
82 main::wrap_croak() called at $0 line 72
84 $croak_regex .= '\t(require 0|eval \{\.\.\.\})'
85 . quotemeta( " called at $0 line 72" );
86 like( $@, "/$croak_regex/", 'croak() fooled');
89 ok( !caller, "caller() not screwed up" );
92 is( $@, "Dying at $0 line 81.\n", 'die() not screwed up' );
99 carp "HA! Even carp is fooled!";
103 uplevel(1, \&try_carp);
109 local $SIG{__WARN__} = sub { $warning = join '', @_ };
113 is( $warning, <<CARP, 'carp() fooled' );
114 HA! Even carp is fooled! at $0 line 88
115 main::wrap_carp() called at $0 line 98
120 can_ok( 'main', 'fooble' );
123 sub core_caller_check {
124 return CORE::caller(0);
128 return caller(shift);
131 is_deeply( [ ( caller_check(0), 0, 4 )[0 .. 3] ],
132 ['main', $0, 122, 'main::caller_check' ],
135 is( (() = caller_check(0)), (() = core_caller_check(0)) ,
136 "caller() with args returns right number of values"
139 sub core_caller_no_args {
140 return CORE::caller();
147 is( (() = caller_no_args()), (() = core_caller_no_args()),
148 "caller() with no args returns right number of values"
155 sub check_deep_caller {
160 is_deeply([(check_deep_caller)[0..2]], ['main', $0, 134], 'shallow caller' );
162 sub deeper { deep_caller() } # caller 0
163 sub still_deeper { deeper() } # caller 1 -- should give this line, 137
164 sub ever_deeper { still_deeper() } # caller 2
166 is_deeply([(ever_deeper)[0..2]], ['main', $0, 137], 'deep caller()' );
168 # This uplevel() should not effect deep_caller's caller(1).
169 sub yet_deeper { uplevel( 1, \&ever_deeper) }
170 is_deeply([(yet_deeper)[0..2]], ['main', $0, 137], 'deep caller() + uplevel' );
172 sub target { caller }
173 sub yarrow { uplevel( 1, \&target ) }
174 sub hock { uplevel( 1, \&yarrow ) }
176 is_deeply([(hock)], ['main', $0, 150], 'nested uplevel()s' );
178 # Deep caller inside uplevel
181 sub delegate { main::caller_check(shift) }
185 sub wrap { uplevel( 1, \&Delegator::delegate, @_ ) }
189 is( (Wrapper::wrap(0))[0], 'Delegator',
190 'deep caller check of parent sees real calling package'
193 is( (Wrapper::wrap(1))[0], 'main',
194 'deep caller check of grandparent sees package above uplevel'