1 | BEGIN {
|
---|
2 | chdir 't' if -d 't';
|
---|
3 | @INC = '../lib';
|
---|
4 | require './test.pl';
|
---|
5 | }
|
---|
6 |
|
---|
7 | my $Is_VMS = $^O eq 'VMS';
|
---|
8 |
|
---|
9 | use Carp qw(carp cluck croak confess);
|
---|
10 |
|
---|
11 | plan tests => 21;
|
---|
12 |
|
---|
13 | ok 1;
|
---|
14 |
|
---|
15 | { local $SIG{__WARN__} = sub {
|
---|
16 | like $_[0], qr/ok (\d+)\n at.+\b(?i:carp\.t) line \d+$/, 'ok 2\n' };
|
---|
17 |
|
---|
18 | carp "ok 2\n";
|
---|
19 |
|
---|
20 | }
|
---|
21 |
|
---|
22 | { local $SIG{__WARN__} = sub {
|
---|
23 | like $_[0], qr/(\d+) at.+\b(?i:carp\.t) line \d+$/, 'carp 3' };
|
---|
24 |
|
---|
25 | carp 3;
|
---|
26 |
|
---|
27 | }
|
---|
28 |
|
---|
29 | sub sub_4 {
|
---|
30 |
|
---|
31 | local $SIG{__WARN__} = sub {
|
---|
32 | like $_[0], qr/^(\d+) at.+\b(?i:carp\.t) line \d+\n\tmain::sub_4\(\) called at.+\b(?i:carp\.t) line \d+$/, 'cluck 4' };
|
---|
33 |
|
---|
34 | cluck 4;
|
---|
35 |
|
---|
36 | }
|
---|
37 |
|
---|
38 | sub_4;
|
---|
39 |
|
---|
40 | { local $SIG{__DIE__} = sub {
|
---|
41 | like $_[0], qr/^(\d+) at.+\b(?i:carp\.t) line \d+\n\teval \Q{...}\E called at.+\b(?i:carp\.t) line \d+$/, 'croak 5' };
|
---|
42 |
|
---|
43 | eval { croak 5 };
|
---|
44 | }
|
---|
45 |
|
---|
46 | sub sub_6 {
|
---|
47 | local $SIG{__DIE__} = sub {
|
---|
48 | like $_[0], qr/^(\d+) at.+\b(?i:carp\.t) line \d+\n\teval \Q{...}\E called at.+\b(?i:carp\.t) line \d+\n\tmain::sub_6\(\) called at.+\b(?i:carp\.t) line \d+$/, 'confess 6' };
|
---|
49 |
|
---|
50 | eval { confess 6 };
|
---|
51 | }
|
---|
52 |
|
---|
53 | sub_6;
|
---|
54 |
|
---|
55 | ok(1);
|
---|
56 |
|
---|
57 | # test for caller_info API
|
---|
58 | my $eval = "use Carp::Heavy; return Carp::caller_info(0);";
|
---|
59 | my %info = eval($eval);
|
---|
60 | is($info{sub_name}, "eval '$eval'", 'caller_info API');
|
---|
61 |
|
---|
62 | # test for '...::CARP_NOT used only once' warning from Carp::Heavy
|
---|
63 | my $warning;
|
---|
64 | eval {
|
---|
65 | BEGIN {
|
---|
66 | $^W = 1;
|
---|
67 | local $SIG{__WARN__} =
|
---|
68 | sub { if( defined $^S ){ warn $_[0] } else { $warning = $_[0] } }
|
---|
69 | }
|
---|
70 | package Z;
|
---|
71 | BEGIN { eval { Carp::croak() } }
|
---|
72 | };
|
---|
73 | ok !$warning, q/'...::CARP_NOT used only once' warning from Carp::Heavy/;
|
---|
74 |
|
---|
75 |
|
---|
76 | # tests for global variables
|
---|
77 | sub x { carp @_ }
|
---|
78 | sub w { cluck @_ }
|
---|
79 |
|
---|
80 | # $Carp::Verbose;
|
---|
81 | { my $aref = [
|
---|
82 | qr/t at \S*(?i:carp.t) line \d+/,
|
---|
83 | qr/t at \S*(?i:carp.t) line \d+\n\s*main::x\('t'\) called at \S*(?i:carp.t) line \d+/
|
---|
84 | ];
|
---|
85 | my $i = 0;
|
---|
86 |
|
---|
87 | for my $re (@$aref) {
|
---|
88 | local $Carp::Verbose = $i++;
|
---|
89 | local $SIG{__WARN__} = sub {
|
---|
90 | like $_[0], $re, 'Verbose';
|
---|
91 | };
|
---|
92 | package Z;
|
---|
93 | main::x('t');
|
---|
94 | }
|
---|
95 | }
|
---|
96 |
|
---|
97 | # $Carp::MaxEvalLen
|
---|
98 | { my $test_num = 1;
|
---|
99 | for(0,4) {
|
---|
100 | my $txt = "Carp::cluck($test_num)";
|
---|
101 | local $Carp::MaxEvalLen = $_;
|
---|
102 | local $SIG{__WARN__} = sub {
|
---|
103 | "@_"=~/'(.+?)(?:\n|')/s;
|
---|
104 | is length($1), length($_?substr($txt,0,$_):substr($txt,0)), 'MaxEvalLen';
|
---|
105 | };
|
---|
106 | eval "$txt"; $test_num++;
|
---|
107 | }
|
---|
108 | }
|
---|
109 |
|
---|
110 | # $Carp::MaxArgLen
|
---|
111 | {
|
---|
112 | for(0,4) {
|
---|
113 | my $arg = 'testtest';
|
---|
114 | local $Carp::MaxArgLen = $_;
|
---|
115 | local $SIG{__WARN__} = sub {
|
---|
116 | "@_"=~/'(.+?)'/;
|
---|
117 | is length($1), length($_?substr($arg,0,$_):substr($arg,0)), 'MaxArgLen';
|
---|
118 | };
|
---|
119 |
|
---|
120 | package Z;
|
---|
121 | main::w($arg);
|
---|
122 | }
|
---|
123 | }
|
---|
124 |
|
---|
125 | # $Carp::MaxArgNums
|
---|
126 | { my $i = 0;
|
---|
127 | my $aref = [
|
---|
128 | qr/1234 at \S*(?i:carp.t) line \d+\n\s*main::w\(1, 2, 3, 4\) called at \S*(?i:carp.t) line \d+/,
|
---|
129 | qr/1234 at \S*(?i:carp.t) line \d+\n\s*main::w\(1, 2, \.\.\.\) called at \S*(?i:carp.t) line \d+/,
|
---|
130 | ];
|
---|
131 |
|
---|
132 | for(@$aref) {
|
---|
133 | local $Carp::MaxArgNums = $i++;
|
---|
134 | local $SIG{__WARN__} = sub {
|
---|
135 | like "@_", $_, 'MaxArgNums';
|
---|
136 | };
|
---|
137 |
|
---|
138 | package Z;
|
---|
139 | main::w(1..4);
|
---|
140 | }
|
---|
141 | }
|
---|
142 |
|
---|
143 | # $Carp::CarpLevel
|
---|
144 | { my $i = 0;
|
---|
145 | my $aref = [
|
---|
146 | qr/1 at \S*(?i:carp.t) line \d+\n\s*main::w\(1\) called at \S*(?i:carp.t) line \d+/,
|
---|
147 | qr/1 at \S*(?i:carp.t) line \d+$/,
|
---|
148 | ];
|
---|
149 |
|
---|
150 | for (@$aref) {
|
---|
151 | local $Carp::CarpLevel = $i++;
|
---|
152 | local $SIG{__WARN__} = sub {
|
---|
153 | like "@_", $_, 'CarpLevel';
|
---|
154 | };
|
---|
155 |
|
---|
156 | package Z;
|
---|
157 | main::w(1);
|
---|
158 | }
|
---|
159 | }
|
---|
160 |
|
---|
161 |
|
---|
162 | {
|
---|
163 | local $TODO = "VMS exit status semantics don't work this way" if $Is_VMS;
|
---|
164 |
|
---|
165 | # Check that croak() and confess() don't clobber $!
|
---|
166 | runperl(prog => 'use Carp; $@=q{Phooey}; $!=42; croak(q{Dead})',
|
---|
167 | stderr => 1);
|
---|
168 |
|
---|
169 | is($?>>8, 42, 'croak() doesn\'t clobber $!');
|
---|
170 |
|
---|
171 | runperl(prog => 'use Carp; $@=q{Phooey}; $!=42; confess(q{Dead})',
|
---|
172 | stderr => 1);
|
---|
173 |
|
---|
174 | is($?>>8, 42, 'confess() doesn\'t clobber $!');
|
---|
175 | }
|
---|