Blame t/02_uplevel.t

Packit cde0b4
#!/usr/bin/perl
Packit cde0b4
Packit cde0b4
use strict;
Packit cde0b4
BEGIN { $^W = 1 }
Packit cde0b4
Packit cde0b4
use Test::More tests => 23;
Packit cde0b4
Packit cde0b4
BEGIN { use_ok('Sub::Uplevel'); }
Packit cde0b4
can_ok('Sub::Uplevel', 'uplevel');
Packit cde0b4
can_ok(__PACKAGE__, 'uplevel');
Packit cde0b4
Packit cde0b4
#line 11
Packit cde0b4
ok( !caller,                         "top-level caller() not screwed up" );
Packit cde0b4
Packit cde0b4
eval { die };
Packit cde0b4
is( $@, "Died at $0 line 13.\n",           'die() not screwed up' );
Packit cde0b4
Packit cde0b4
sub foo {
Packit cde0b4
    join " - ", caller;
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
sub bar {
Packit cde0b4
    uplevel(1, \&foo;;
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
#line 25
Packit cde0b4
is( bar(), "main - $0 - 25",    'uplevel()' );
Packit cde0b4
Packit cde0b4
Packit cde0b4
# Sure, but does it fool die?
Packit cde0b4
sub try_die {
Packit cde0b4
    die "You must die!  I alone am best!";
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
sub wrap_die {
Packit cde0b4
    uplevel(1, \&try_die);
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
# line 38
Packit cde0b4
eval { wrap_die() };
Packit cde0b4
is( $@, "You must die!  I alone am best! at $0 line 30.\n", 'die() fooled' );
Packit cde0b4
Packit cde0b4
Packit cde0b4
# how about warn?
Packit cde0b4
sub try_warn {
Packit cde0b4
    warn "HA!  You don't fool me!";
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
sub wrap_warn {
Packit cde0b4
    uplevel(1, \&try_warn);
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
Packit cde0b4
my $warning;
Packit cde0b4
{ 
Packit cde0b4
    local $SIG{__WARN__} = sub { $warning = join '', @_ };
Packit cde0b4
#line 56
Packit cde0b4
    wrap_warn();
Packit cde0b4
}
Packit cde0b4
is( $warning, "HA!  You don't fool me! at $0 line 44.\n", 'warn() fooled' );
Packit cde0b4
Packit cde0b4
Packit cde0b4
# Carp?
Packit cde0b4
use Carp;
Packit cde0b4
sub try_croak {
Packit cde0b4
# line 64
Packit cde0b4
    croak("Now we can fool croak!");
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
sub wrap_croak {
Packit cde0b4
# line 68
Packit cde0b4
    uplevel(shift, \&try_croak);
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
Packit cde0b4
# depending on perl version, we could get 'require 0' or 'eval {...}'
Packit cde0b4
# in the stack. This test used to be 'require 0' for <= 5.006, but
Packit cde0b4
# it broke on 5.005_05 test release, so we'll just take either
Packit cde0b4
# line 72
Packit cde0b4
eval { wrap_croak(1) };
Packit cde0b4
my $croak_regex = quotemeta( <<"CARP" );
Packit cde0b4
Now we can fool croak! at $0 line 64
Packit cde0b4
	main::wrap_croak(1) called at $0 line 72
Packit cde0b4
CARP
Packit cde0b4
$croak_regex =~ s/64/64\.?/; # Perl 5.15 series Carp adds period
Packit cde0b4
$croak_regex .= '\t(require 0|eval \{\.\.\.\})'
Packit cde0b4
                . quotemeta( " called at $0 line 72" );
Packit cde0b4
like( $@, "/$croak_regex/", 'croak() fooled');
Packit cde0b4
Packit cde0b4
# Try to wrap higher -- this may have been a problem that was exposed on
Packit cde0b4
# Test Exception
Packit cde0b4
# line 75
Packit cde0b4
eval { wrap_croak(2) };
Packit cde0b4
$croak_regex = quotemeta( <<"CARP" );
Packit cde0b4
Now we can fool croak! at $0 line 64
Packit cde0b4
CARP
Packit cde0b4
$croak_regex =~ s/64/64\.?/; # Perl 5.15 series Carp adds period
Packit cde0b4
like( $@, "/$croak_regex/", 'croak() fooled');
Packit cde0b4
Packit cde0b4
#line 79
Packit cde0b4
ok( !caller,                                "caller() not screwed up" );
Packit cde0b4
Packit cde0b4
eval { die "Dying" };
Packit cde0b4
is( $@, "Dying at $0 line 81.\n",           'die() not screwed up' );
Packit cde0b4
Packit cde0b4
Packit cde0b4
Packit cde0b4
# how about carp?
Packit cde0b4
sub try_carp {
Packit cde0b4
# line 88
Packit cde0b4
    carp "HA!  Even carp is fooled!";
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
sub wrap_carp {
Packit cde0b4
    uplevel(1, \&try_carp);
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
Packit cde0b4
$warning = '';
Packit cde0b4
{ 
Packit cde0b4
    local $SIG{__WARN__} = sub { $warning = join '', @_ };
Packit cde0b4
#line 98
Packit cde0b4
    wrap_carp();
Packit cde0b4
}
Packit cde0b4
my $carp_regex = quotemeta( <<"CARP" );
Packit cde0b4
HA!  Even carp is fooled! at $0 line 88
Packit cde0b4
	main::wrap_carp() called at $0 line 98
Packit cde0b4
CARP
Packit cde0b4
$carp_regex =~ s/88/88\.?/; # Perl 5.15 series Carp adds period
Packit cde0b4
like( $warning, "/$carp_regex/", 'carp() fooled' );
Packit cde0b4
Packit cde0b4
Packit cde0b4
use lib 't/lib';
Packit cde0b4
use Foo;
Packit cde0b4
can_ok( 'main', 'fooble' );
Packit cde0b4
Packit cde0b4
#line 114
Packit cde0b4
sub core_caller_check {
Packit cde0b4
    return CORE::caller(0);
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
sub caller_check {
Packit cde0b4
    return caller(shift);
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
is_deeply(   [ ( caller_check(0), 0, 4 )[0 .. 3] ], 
Packit cde0b4
             ['main', $0, 122, 'main::caller_check' ],
Packit cde0b4
    'caller check' );
Packit cde0b4
Packit cde0b4
is( (() = caller_check(0)), (() = core_caller_check(0)) ,
Packit cde0b4
    "caller() with args returns right number of values"
Packit cde0b4
);
Packit cde0b4
Packit cde0b4
sub core_caller_no_args {
Packit cde0b4
    return CORE::caller();
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
sub caller_no_args {
Packit cde0b4
    return caller();
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
is( (() = caller_no_args()), (() = core_caller_no_args()),
Packit cde0b4
    "caller() with no args returns right number of values"
Packit cde0b4
);
Packit cde0b4
Packit cde0b4
sub deep_caller {
Packit cde0b4
    return caller(1);
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
sub check_deep_caller {
Packit cde0b4
    deep_caller();
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
#line 134
Packit cde0b4
is_deeply([(check_deep_caller)[0..2]], ['main', $0, 134], 'shallow caller' );
Packit cde0b4
Packit cde0b4
sub deeper { deep_caller() }        # caller 0
Packit cde0b4
sub still_deeper { deeper() }       # caller 1 -- should give this line, 137
Packit cde0b4
sub ever_deeper  { still_deeper() } # caller 2
Packit cde0b4
Packit cde0b4
is_deeply([(ever_deeper)[0..2]], ['main', $0, 137], 'deep caller()' );
Packit cde0b4
Packit cde0b4
# This uplevel() should not effect deep_caller's caller(1).
Packit cde0b4
sub yet_deeper { uplevel( 1, \&ever_deeper) }
Packit cde0b4
is_deeply([(yet_deeper)[0..2]],  ['main', $0, 137],  'deep caller() + uplevel' );
Packit cde0b4
Packit cde0b4
sub target { caller }
Packit cde0b4
sub yarrow { uplevel( 1, \&target ) }
Packit cde0b4
sub hock   { uplevel( 1, \&yarrow ) }
Packit cde0b4
Packit cde0b4
is_deeply([(hock)], ['main', $0, 150],  'nested uplevel()s' );
Packit cde0b4
Packit cde0b4
# Deep caller inside uplevel
Packit cde0b4
package Delegator; 
Packit cde0b4
# line 159
Packit cde0b4
sub delegate { main::caller_check(shift) }
Packit cde0b4
    
Packit cde0b4
package Wrapper;
Packit cde0b4
use Sub::Uplevel;
Packit cde0b4
sub wrap { uplevel( 1, \&Delegator::delegate, @_ ) }
Packit cde0b4
Packit cde0b4
package main;
Packit cde0b4
Packit cde0b4
is( (Wrapper::wrap(0))[0], 'Delegator', 
Packit cde0b4
    'deep caller check of parent sees real calling package' 
Packit cde0b4
);
Packit cde0b4
Packit cde0b4
is( (Wrapper::wrap(1))[0], 'main', 
Packit cde0b4
    'deep caller check of grandparent sees package above uplevel' 
Packit cde0b4
);
Packit cde0b4