Blame t/03_nested_uplevels.t

Packit cde0b4
#!/usr/bin/perl
Packit cde0b4
Packit cde0b4
use strict;
Packit cde0b4
BEGIN { $^W = 1 }
Packit cde0b4
Packit cde0b4
use Test::More;
Packit cde0b4
Packit cde0b4
use Sub::Uplevel;
Packit cde0b4
Packit cde0b4
package Wrap;
Packit cde0b4
use Sub::Uplevel;
Packit cde0b4
Packit cde0b4
sub wrap {
Packit cde0b4
    my ($n, $f, $depth, $up, @case) = @_;
Packit cde0b4
    
Packit cde0b4
    if ($n > 1) {
Packit cde0b4
        $n--;
Packit cde0b4
        return wrap( $n, $f, $depth, $up, @case );
Packit cde0b4
    }
Packit cde0b4
    else {
Packit cde0b4
        return uplevel( $up , $f, $depth, $up, @case );
Packit cde0b4
    }
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
package Call;
Packit cde0b4
Packit cde0b4
sub recurse_call_check {
Packit cde0b4
    my ($depth, $up, @case) = @_;
Packit cde0b4
Packit cde0b4
    if ( $depth ) {
Packit cde0b4
        $depth--;
Packit cde0b4
        my @result;
Packit cde0b4
        push @result, recurse_call_check($depth, $up, @case, 'Call' );
Packit cde0b4
        for my $n ( 1 .. $up ) {
Packit cde0b4
            push @result, Wrap::wrap( $n, \&recurse_call_check, 
Packit cde0b4
                $depth, $n, @case, 
Packit cde0b4
                $n == 1 ? "Wrap(Call)" : "Wrap(Call) x $n" ),
Packit cde0b4
            ;
Packit cde0b4
        }
Packit cde0b4
        return @result;
Packit cde0b4
    }
Packit cde0b4
    else {
Packit cde0b4
        my (@uplevel_callstack, @real_callstack);
Packit cde0b4
        my $i = 0;
Packit cde0b4
        while ( defined( my $caller = caller($i++) ) ) {
Packit cde0b4
            push @uplevel_callstack, $caller;
Packit cde0b4
        }
Packit cde0b4
        $i = 0;
Packit cde0b4
        while ( defined( my $caller = CORE::caller($i++) ) ) {
Packit cde0b4
            push @real_callstack, $caller;
Packit cde0b4
        }
Packit cde0b4
        return [ 
Packit cde0b4
            join( q{, }, @case ),
Packit cde0b4
            join( q{, }, reverse @uplevel_callstack ),
Packit cde0b4
            join( q{, }, reverse @real_callstack ),
Packit cde0b4
        ];      
Packit cde0b4
    }
Packit cde0b4
}
Packit cde0b4
Packit cde0b4
package main;
Packit cde0b4
Packit cde0b4
my $depth = 4;
Packit cde0b4
my $up = 3;
Packit cde0b4
my $cases = 104;
Packit cde0b4
Packit cde0b4
plan tests => $cases;
Packit cde0b4
Packit cde0b4
my @results = Call::recurse_call_check( $depth, $up, 'Call' );
Packit cde0b4
Packit cde0b4
is( scalar @results, $cases, 
Packit cde0b4
    "Right number of cases"
Packit cde0b4
);
Packit cde0b4
Packit cde0b4
my $expected = shift @results;
Packit cde0b4
Packit cde0b4
for my $got ( @results ) {
Packit cde0b4
    is( $got->[1], $expected->[1], 
Packit cde0b4
        "Case: $got->[0]"
Packit cde0b4
    ) or diag( "Real callers: $got->[2]" );
Packit cde0b4
}
Packit cde0b4