File Coverage

blib/lib/Test2/Tools/Exception.pm
Criterion Covered Total %
statement 45 48 93.7
branch 11 12 91.6
condition n/a
subroutine 8 8 100.0
pod 3 3 100.0
total 67 71 94.3


line stmt bran cond sub pod time code
1             package Test2::Tools::Exception;
2 155     155   1164 use strict;
  155         700  
  155         5057  
3 155     155   844 use warnings;
  155         346  
  155         6435  
4              
5             our $VERSION = '0.000156';
6              
7 155     155   936 use Carp qw/carp/;
  155         371  
  155         7642  
8 155     155   1057 use Test2::API qw/context/;
  155         398  
  155         11350  
9              
10             our @EXPORT = qw/dies lives try_ok/;
11 155     155   1140 use base 'Exporter';
  155         446  
  155         70269  
12              
13             sub dies(&) {
14 145     145 1 4103 my $code = shift;
15              
16 145 100       683 defined wantarray or carp "Useless use of dies() in void context";
17              
18 145         797 local ($@, $!, $?);
19 145         314 my $ok = eval { $code->(); 1 };
  145         489  
  3         14  
20 145         4470 my $err = $@;
21              
22 145 100       482 return undef if $ok;
23              
24 142 50       404 unless ($err) {
25 0         0 my $ctx = context();
26 0         0 $ctx->alert("Got exception as expected, but exception is falsy (undef, '', or 0)...");
27 0         0 $ctx->release;
28             }
29              
30 142         1898 return $err;
31             }
32              
33             sub lives(&) {
34 10     10 1 171 my $code = shift;
35              
36 10 100       140 defined wantarray or carp "Useless use of lives() in void context";
37              
38 10         17 my $err;
39             {
40 10         19 local ($@, $!, $?);
  10         68  
41 10 100       21 eval { $code->(); 1 } and return 1;
  10         34  
  8         122  
42 2         26 $err = $@;
43             }
44              
45             # If the eval failed we want to set $@ to the error.
46 2         5 $@ = $err;
47 2         7 return 0;
48             }
49              
50             sub try_ok(&;$) {
51 2     2 1 440 my ($code, $name) = @_;
52              
53 2         6 my $ok = &lives($code);
54 2         4 my $err = $@;
55              
56             # Context should be obtained AFTER code is run so that events inside the
57             # codeblock report inside the codeblock itself. This will also preserve $@
58             # as thrown inside the codeblock.
59 2         7 my $ctx = context();
60 2         181 chomp(my $diag = "Exception: $err");
61 2         10 $ctx->ok($ok, $name, [$diag]);
62 2         941 $ctx->release;
63              
64 2 100       78 $@ = $err unless $ok;
65 2         9 return $ok;
66             }
67              
68             1;
69              
70             __END__