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