This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Get t/uni/cache.t working under minitest
[perl5.git] / t / op / die.t
old mode 100755 (executable)
new mode 100644 (file)
index cf4f8b0..c98b8ff
@@ -1,43 +1,97 @@
 #!./perl
 
-print "1..10\n";
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+    require './test.pl';
+}
 
-$SIG{__DIE__} = sub { print ref($_[0]) ? ("ok ",$_[0]->[0]++,"\n") : @_ } ;
+plan tests => 19;
 
-$err = "#[\000]\nok 1\n";
 eval {
-    die $err;
+    eval {
+       die "Horribly\n";
+    };
+    die if $@;
 };
 
-print "not " unless $@ eq $err;
-print "ok 2\n";
+like($@, qr/^Horribly/, 'die with no args propagates $@');
+like($@, qr/\.{3}propagated at/, '... and appends a phrase');
+
+{
+    local $SIG{__DIE__} = sub { is( $_[0], "[\000]\n", 'Embedded null passed to signal handler' )};
+
+    $err = "[\000]\n";
+    eval {
+        die $err;
+    };
+    is( $@, $err, 'Embedded null passed back into $@' );
+}
 
-$x = [3];
-eval { die $x; };
+{
+    local $SIG{__DIE__} = sub {
+       isa_ok( $_[0], 'ARRAY', 'pass an array ref as an argument' );
+       $_[0]->[0]++;
+    };
+    $x = [3];
+    eval { die $x; };
 
-print "not " unless $x->[0] == 4;
-print "ok 4\n";
+    is( $x->[0], 4, 'actual array, not a copy, passed to signal handler' );
 
-eval {
     eval {
-       die [ 5 ];
+        eval {
+            die [ 5 ];
+        };
+        die if $@;
     };
-    die if $@;
-};
 
-eval {
+    is($@->[0], 7, 'die with no arguments propagates $@, but leaves references alone');
+
     eval {
-       die bless [ 7 ], "Error";
+       eval {
+           die bless [ 7 ], "Error";
+       };
+       isa_ok( $@, 'Error', '$@ is an Error object' );
+       die if $@;
     };
-    die if $@;
-};
 
-print "not " unless ref($@) eq "Out";
-print "ok 10\n";
+    isa_ok( $@, 'Out', 'returning a different object than what was passed in, via PROPAGATE' );
+    is($@->[0], 9, 'reference returned correctly');
+}
+
+{
+    package Error;
+
+    sub PROPAGATE {
+       bless [$_[0]->[0]], "Out";
+    }
+}
+
+
+{
+    # die/warn and utf8
+    use utf8;
+    local $SIG{__DIE__};
+    my $msg = "ce ºtii tu, bã ?\n";
+    eval { die $msg };
+    is( $@, $msg, "Literal passed to die" );
+    our $err;
+    local $SIG{__WARN__} = $SIG{__DIE__} = sub { $err = shift };
+    eval { die $msg };
+    is( $err, $msg, 'die handler with utf8' );
+    eval { warn $msg };
+    is( $err, $msg, 'warn handler with utf8' );
+    eval qq/ use strict; \$\x{3b1} /;
+    like( $@, qr/Global symbol "\$\x{3b1}"/, 'utf8 symbol names show up in $@' );
+}
 
-package Error;
+# [perl #36470] got uninit warning if $@ was undef
 
-sub PROPAGATE {
-    print "ok ",$_[0]->[0]++,"\n";
-    bless [$_[0]->[0]], "Out";
+{
+    use warnings "uninitialized";
+    my $ok = 1;
+    local $SIG{__DIE__};
+    local $SIG{__WARN__} = sub { $ok = 0 };
+    eval { undef $@; die };
+    is( $ok, 1, 'no warnings if $@ is undef' );
 }