File: rethrow.t

package info (click to toggle)
libdevel-confess-perl 0.009003-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 212 kB
  • ctags: 57
  • sloc: perl: 985; makefile: 2
file content (34 lines) | stat: -rw-r--r-- 1,047 bytes parent folder | download | duplicates (4)
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
use strict;
use warnings;
BEGIN {
  $ENV{DEVEL_CONFESS_OPTIONS} = '';
}
use Test::More tests => 18;
use Devel::Confess ();
use Carp;

my @dies = qw(die Carp::croak Carp::confess);

for my $options ([], ['source']) {
  for my $innerdie (@dies) {
    for my $outerdie (@dies) {
      my $package = "_Die::${innerdie}::Then::${outerdie}"
        . (@$options ? (join '::', '', 'Options', @$options) : '');
      eval sprintf <<'END_CODE', $package, $innerdie, $outerdie;
        package %s;
        sub layer1 { %s("die") }
        sub layer2 { layer1() }
        sub layer3 { eval { layer2() }; %s(our $inner_error = $@) }
        sub layer4 { layer3() }
END_CODE
      Devel::Confess->import('nowarnings', @$options);
      eval { $package->can('layer4')->(); };
      my $e = $@;
      my $inner = do { no strict 'refs'; ${$package.'::inner_error'} };
      Devel::Confess->unimport;
      is $e, $inner,
        "rethrow from $innerdie to $outerdie doesn't modify trace"
        . (@$options ? ' with ' . join(', ', @$options) : '');
    }
  }
}