1#!./perl 2 3## 4## Many of these tests are originally from Michael Schroeder 5## <Michael.Schroeder@informatik.uni-erlangen.de> 6## Adapted and expanded by Gurusamy Sarathy <gsar@activestate.com> 7## 8 9chdir 't' if -d 't'; 10@INC = '../lib'; 11require './test.pl'; 12$Is_VMS = $^O eq 'VMS'; 13$Is_MSWin32 = $^O eq 'MSWin32'; 14$Is_NetWare = $^O eq 'NetWare'; 15$ENV{PERL5LIB} = "../lib" unless $Is_VMS; 16 17$|=1; 18 19undef $/; 20@prgs = split "\n########\n", <DATA>; 21print "1..", scalar @prgs, "\n"; 22 23$tmpfile = tempfile(); 24 25for (@prgs){ 26 my $switch = ""; 27 if (s/^\s*(-\w+)//){ 28 $switch = $1; 29 } 30 my($prog,$expected) = split(/\nEXPECT\n/, $_); 31 open TEST, ">$tmpfile"; 32 print TEST "$prog\n"; 33 close TEST or die "Could not close: $!"; 34 my $results = $Is_VMS ? 35 `$^X "-I[-.lib]" $switch $tmpfile 2>&1` : 36 $Is_MSWin32 ? 37 `.\\perl -I../lib $switch $tmpfile 2>&1` : 38 $Is_NetWare ? 39 `perl -I../lib $switch $tmpfile 2>&1` : 40 `./perl $switch $tmpfile 2>&1`; 41 my $status = $?; 42 $results =~ s/\n+$//; 43 # allow expected output to be written as if $prog is on STDIN 44 $results =~ s/$::tempfile_regexp/-/ig; 45 $results =~ s/\n%[A-Z]+-[SIWEF]-.*$// if $Is_VMS; # clip off DCL status msg 46 $expected =~ s/\n+$//; 47 if ($results ne $expected) { 48 print STDERR "PROG: $switch\n$prog\n"; 49 print STDERR "EXPECTED:\n$expected\n"; 50 print STDERR "GOT:\n$results\n"; 51 print "not "; 52 } 53 print "ok ", ++$i, "\n"; 54} 55 56__END__ 57@a = (1, 2, 3); 58{ 59 @a = sort { last ; } @a; 60} 61EXPECT 62Can't "last" outside a loop block at - line 3. 63######## 64package TEST; 65 66sub TIESCALAR { 67 my $foo; 68 return bless \$foo; 69} 70sub FETCH { 71 eval 'die("test")'; 72 print "still in fetch\n"; 73 return ">$@<"; 74} 75package main; 76 77tie $bar, TEST; 78print "- $bar\n"; 79EXPECT 80still in fetch 81- >test at (eval 1) line 1. 82< 83######## 84package TEST; 85 86sub TIESCALAR { 87 my $foo; 88 eval('die("foo\n")'); 89 print "after eval\n"; 90 return bless \$foo; 91} 92sub FETCH { 93 return "ZZZ"; 94} 95 96package main; 97 98tie $bar, TEST; 99print "- $bar\n"; 100print "OK\n"; 101EXPECT 102after eval 103- ZZZ 104OK 105######## 106package TEST; 107 108sub TIEHANDLE { 109 my $foo; 110 return bless \$foo; 111} 112sub PRINT { 113print STDERR "PRINT CALLED\n"; 114(split(/./, 'x'x10000))[0]; 115eval('die("test\n")'); 116} 117 118package main; 119 120open FH, ">&STDOUT"; 121tie *FH, TEST; 122print FH "OK\n"; 123print STDERR "DONE\n"; 124EXPECT 125PRINT CALLED 126DONE 127######## 128sub warnhook { 129 print "WARNHOOK\n"; 130 eval('die("foooo\n")'); 131} 132$SIG{'__WARN__'} = 'warnhook'; 133warn("dfsds\n"); 134print "END\n"; 135EXPECT 136WARNHOOK 137END 138######## 139package TEST; 140 141use overload 142 "\"\"" => \&str 143; 144 145sub str { 146 eval('die("test\n")'); 147 return "STR"; 148} 149 150package main; 151 152$bar = bless {}, TEST; 153print "$bar\n"; 154print "OK\n"; 155EXPECT 156STR 157OK 158######## 159sub foo { 160 $a <=> $b unless eval('$a == 0 ? bless undef : ($a <=> $b)'); 161} 162@a = (3, 2, 0, 1); 163@a = sort foo @a; 164print join(', ', @a)."\n"; 165EXPECT 1660, 1, 2, 3 167######## 168sub foo { 169 goto bar if $a == 0 || $b == 0; 170 $a <=> $b; 171} 172@a = (3, 2, 0, 1); 173@a = sort foo @a; 174print join(', ', @a)."\n"; 175exit; 176bar: 177print "bar reached\n"; 178EXPECT 179Can't "goto" out of a pseudo block at - line 2. 180######## 181%seen = (); 182sub sortfn { 183 (split(/./, 'x'x10000))[0]; 184 my (@y) = ( 4, 6, 5); 185 @y = sort { $a <=> $b } @y; 186 my $t = "sortfn ".join(', ', @y)."\n"; 187 print $t if ($seen{$t}++ == 0); 188 return $_[0] <=> $_[1]; 189} 190@x = ( 3, 2, 1 ); 191@x = sort { &sortfn($a, $b) } @x; 192print "---- ".join(', ', @x)."\n"; 193EXPECT 194sortfn 4, 5, 6 195---- 1, 2, 3 196######## 197@a = (3, 2, 1); 198@a = sort { eval('die("no way")') , $a <=> $b} @a; 199print join(", ", @a)."\n"; 200EXPECT 2011, 2, 3 202######## 203@a = (1, 2, 3); 204foo: 205{ 206 @a = sort { last foo; } @a; 207} 208EXPECT 209Label not found for "last foo" at - line 2. 210######## 211package TEST; 212 213sub TIESCALAR { 214 my $foo; 215 return bless \$foo; 216} 217sub FETCH { 218 next; 219 return "ZZZ"; 220} 221sub STORE { 222} 223 224package main; 225 226tie $bar, TEST; 227{ 228 print "- $bar\n"; 229} 230print "OK\n"; 231EXPECT 232Can't "next" outside a loop block at - line 8. 233######## 234package TEST; 235 236sub TIESCALAR { 237 my $foo; 238 return bless \$foo; 239} 240sub FETCH { 241 goto bbb; 242 return "ZZZ"; 243} 244 245package main; 246 247tie $bar, TEST; 248print "- $bar\n"; 249exit; 250bbb: 251print "bbb\n"; 252EXPECT 253Can't find label bbb at - line 8. 254######## 255sub foo { 256 $a <=> $b unless eval('$a == 0 ? die("foo\n") : ($a <=> $b)'); 257} 258@a = (3, 2, 0, 1); 259@a = sort foo @a; 260print join(', ', @a)."\n"; 261EXPECT 2620, 1, 2, 3 263######## 264package TEST; 265sub TIESCALAR { 266 my $foo; 267 return bless \$foo; 268} 269sub FETCH { 270 return "fetch"; 271} 272sub STORE { 273(split(/./, 'x'x10000))[0]; 274} 275package main; 276tie $bar, TEST; 277$bar = "x"; 278######## 279package TEST; 280sub TIESCALAR { 281 my $foo; 282 next; 283 return bless \$foo; 284} 285package main; 286{ 287tie $bar, TEST; 288} 289EXPECT 290Can't "next" outside a loop block at - line 4. 291######## 292@a = (1, 2, 3); 293foo: 294{ 295 @a = sort { exit(0) } @a; 296} 297END { print "foobar\n" } 298EXPECT 299foobar 300######## 301$SIG{__DIE__} = sub { 302 print "In DIE\n"; 303 $i = 0; 304 while (($p,$f,$l,$s) = caller(++$i)) { 305 print "$p|$f|$l|$s\n"; 306 } 307}; 308eval { die }; 309&{sub { eval 'die' }}(); 310sub foo { eval { die } } foo(); 311{package rmb; sub{ eval{die} } ->() }; # check __ANON__ knows package 312EXPECT 313In DIE 314main|-|8|(eval) 315In DIE 316main|-|9|(eval) 317main|-|9|main::__ANON__ 318In DIE 319main|-|10|(eval) 320main|-|10|main::foo 321In DIE 322rmb|-|11|(eval) 323rmb|-|11|rmb::__ANON__ 324######## 325package TEST; 326 327sub TIEARRAY { 328 return bless [qw(foo fee fie foe)], $_[0]; 329} 330sub FETCH { 331 my ($s,$i) = @_; 332 if ($i) { 333 goto bbb; 334 } 335bbb: 336 return $s->[$i]; 337} 338 339package main; 340tie my @bar, 'TEST'; 341print join('|', @bar[0..3]), "\n"; 342EXPECT 343foo|fee|fie|foe 344######## 345package TH; 346sub TIEHASH { bless {}, TH } 347sub STORE { eval { print "@_[1,2]\n" }; die "bar\n" } 348tie %h, TH; 349eval { $h{A} = 1; print "never\n"; }; 350print $@; 351eval { $h{B} = 2; }; 352print $@; 353EXPECT 354A 1 355bar 356B 2 357bar 358######## 359sub n { 0 } 360sub f { my $x = shift; d(); } 361f(n()); 362f(); 363 364sub d { 365 my $i = 0; my @a; 366 while (do { { package DB; @a = caller($i++) } } ) { 367 @a = @DB::args; 368 for (@a) { print "$_\n"; $_ = '' } 369 } 370} 371EXPECT 3720 373######## 374sub TIEHANDLE { bless {} } 375sub PRINT { next } 376 377tie *STDERR, ''; 378{ map ++$_, 1 } 379 380EXPECT 381Can't "next" outside a loop block at - line 2. 382######## 383sub TIEHANDLE { bless {} } 384sub PRINT { print "[TIE] $_[1]" } 385 386tie *STDERR, ''; 387die "DIE\n"; 388 389EXPECT 390[TIE] DIE 391######## 392sub TIEHANDLE { bless {} } 393sub PRINT { 394 (split(/./, 'x'x10000))[0]; 395 eval('die("test\n")'); 396 warn "[TIE] $_[1]"; 397} 398open OLDERR, '>&STDERR'; 399tie *STDERR, ''; 400 401use warnings FATAL => qw(uninitialized); 402print undef; 403 404EXPECT 405[TIE] Use of uninitialized value in print at - line 11. 406