File: 03_nested_uplevels.t

package info (click to toggle)
libsub-uplevel-perl 0.2800-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 260 kB
  • sloc: perl: 671; makefile: 2
file content (81 lines) | stat: -rw-r--r-- 1,681 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/perl

use strict;
BEGIN { $^W = 1 }

use Test::More;

use Sub::Uplevel;

package Wrap;
use Sub::Uplevel;

sub wrap {
    my ($n, $f, $depth, $up, @case) = @_;
    
    if ($n > 1) {
        $n--;
        return wrap( $n, $f, $depth, $up, @case );
    }
    else {
        return uplevel( $up , $f, $depth, $up, @case );
    }
}

package Call;

sub recurse_call_check {
    my ($depth, $up, @case) = @_;

    if ( $depth ) {
        $depth--;
        my @result;
        push @result, recurse_call_check($depth, $up, @case, 'Call' );
        for my $n ( 1 .. $up ) {
            push @result, Wrap::wrap( $n, \&recurse_call_check, 
                $depth, $n, @case, 
                $n == 1 ? "Wrap(Call)" : "Wrap(Call) x $n" ),
            ;
        }
        return @result;
    }
    else {
        my (@uplevel_callstack, @real_callstack);
        my $i = 0;
        while ( defined( my $caller = caller($i++) ) ) {
            push @uplevel_callstack, $caller;
        }
        $i = 0;
        while ( defined( my $caller = CORE::caller($i++) ) ) {
            push @real_callstack, $caller;
        }
        return [ 
            join( q{, }, @case ),
            join( q{, }, reverse @uplevel_callstack ),
            join( q{, }, reverse @real_callstack ),
        ];      
    }
}

package main;

my $depth = 4;
my $up = 3;
my $cases = 104;

plan tests => $cases;

my @results = Call::recurse_call_check( $depth, $up, 'Call' );

is( scalar @results, $cases, 
    "Right number of cases"
);

my $expected = shift @results;

for my $got ( @results ) {
    is( $got->[1], $expected->[1], 
        "Case: $got->[0]"
    ) or diag( "Real callers: $got->[2]" );
}