preserve $! and $^E in Carp
[perl.git] / dist / Carp / t / errno.t
1 use warnings;
2 use strict;
3
4 use Test::More tests => 20;
5
6 use Carp ();
7
8 sub AA::CARP_TRACE { $! = 42; $^E = 42; "Tracy" }
9 my $aa = bless({}, "AA");
10
11 my($m, $errno, $exterr);
12
13 $! = 69; $^E = 69;
14 sub lmm { Carp::longmess("x") }
15 sub lm { lmm() }
16 $m = lm($aa);
17 $errno = 0+$!; $exterr = 0+$^E;
18 like $m, qr/Tracy/;
19 is $errno, 69;
20 is $exterr, 69;
21
22 $! = 69; $^E = 69;
23 sub sm { Carp::shortmess("x") }
24 $m = sm($aa);
25 $errno = 0+$!; $exterr = 0+$^E;
26 like $m, qr/Tracy/;
27 is $errno, 69;
28 is $exterr, 69;
29
30 $SIG{__WARN__} = sub { $m = $_[0]; $errno = 0+$!; $exterr = 0+$^E; };
31
32 $! = 69; $^E = 69;
33 $m = $errno = $exterr = undef;
34 sub cl { Carp::cluck("x") }
35 cl($aa);
36 like $m, qr/Tracy/;
37 is $errno, 69;
38 is $exterr, 69;
39
40 $! = 69; $^E = 69;
41 $m = $errno = $exterr = undef;
42 sub cp { Carp::carp("x") }
43 cp($aa);
44 like $m, qr/Tracy/;
45 is $errno, 69;
46 is $exterr, 69;
47
48 $SIG{__DIE__} = $SIG{__WARN__};
49 delete $SIG{__WARN__};
50
51 $! = 69; $^E = 69;
52 $m = $errno = $exterr = undef;
53 sub cf { Carp::confess("x") }
54 eval { cf($aa) };
55 like $@, qr/Tracy/;
56 like $m, qr/Tracy/;
57 is $errno, 69;
58 is $exterr, 69;
59
60 $! = 69; $^E = 69;
61 $m = $errno = $exterr = undef;
62 sub ck { Carp::croak("x") }
63 eval { ck($aa) };
64 like $@, qr/Tracy/;
65 like $m, qr/Tracy/;
66 is $errno, 69;
67 is $exterr, 69;
68
69 delete $SIG{__DIE__};
70
71 1;