1#!perl -T
2# -*- mode: cperl ; compile-command: "cd .. ; ./Build ; prove -vb t/04-*.t" -*-
3
4BEGIN { $_ = defined && /(.*)/ && $1 for @ENV{qw/ TMPDIR TEMP TMP /} } # taint vs tempfile
5use Test::More tests => 9;
6use strict;
7use warnings;
8
9my ($done_exit, $ready_for_exit);
10BEGIN {
11  *CORE::GLOBAL::exit = sub(;$) {
12    ok($ready_for_exit, "The outer CORE::GLOBAL::exit isn't called too early");
13    $done_exit++;
14    CORE::exit(@_ ? shift : 0);
15  };
16}
17END{
18  ok($done_exit, "The final test: The outer CORE::GLOBAL::exit is eventually called");
19}
20
21BEGIN {
22  use_ok( 'Test::Trap' );
23}
24
25# test the $! handling:
26my $errnum = 11; # "Resource temporarily unavailable" locally -- sounds good :-P
27my $errstring = do { local $! = $errnum; "$!" };
28my $erros = do { local $! = $errnum; $^E };
29my ($errsym) = do { local $! = $errnum; grep { $!{$_} } keys(%!) };
30
31$! = $errnum;
32
33trap { exit };
34is( $trap->exit, 0, "Trapped the first exit");
35trap {
36  *CORE::GLOBAL::exit = sub(;$) {
37    fail("Should be overridden");
38    CORE::exit(@_ ? shift : 0);
39  };
40  trap { exit };
41  is( $trap->exit, 0, "Trapped the inner exit");
42};
43like( $trap->stderr, qr/^Subroutine (?:CORE::GLOBAL::)?exit redefined at \Q${\__FILE__} line/, 'Override warning' );
44
45my ($sym) = grep { $!{$_} } keys(%!);
46# rt.cpan.org #105125: Test::More::is() does not preserve $^E, so ...
47my $postos = $^E;
48is $!+0,    $errnum, "These traps don't change errno (remains $errnum/$errstring)";
49is $postos, $erros,  "These traps don't change extended OS error (remains $erros)";
50is $sym,    $errsym, "These traps don't change the error symbol (remains $errsym)";
51
52$ready_for_exit++;
53
54exit;
55