This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The winsock select() implementation doesn't support all empty 'fd_set's.
[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';
9607fc9c 15$ENV{PERL5LIB} = "../lib" unless $Is_VMS;
1e422769 16
17$|=1;
18
19undef $/;
20@prgs = split "\n########\n", <DATA>;
21print "1..", scalar @prgs, "\n";
22
1c25d394 23$tmpfile = tempfile();
1e422769 24
25for (@prgs){
2c375eb9 26 my $switch = "";
9607fc9c 27 if (s/^\s*(-\w+)//){
28 $switch = $1;
1e422769 29 }
30 my($prog,$expected) = split(/\nEXPECT\n/, $_);
9607fc9c 31 open TEST, ">$tmpfile";
32 print TEST "$prog\n";
d1e4d418 33 close TEST or die "Could not close: $!";
9607fc9c 34 my $results = $Is_VMS ?
16ed4686 35 `$^X "-I[-.lib]" $switch $tmpfile 2>&1` :
be708cc0
JH
36 $Is_MSWin32 ?
37 `.\\perl -I../lib $switch $tmpfile 2>&1` :
38 $Is_NetWare ?
39 `perl -I../lib $switch $tmpfile 2>&1` :
be708cc0 40 `./perl $switch $tmpfile 2>&1`;
9607fc9c 41 my $status = $?;
1e422769 42 $results =~ s/\n+$//;
9607fc9c 43 # allow expected output to be written as if $prog is on STDIN
7aa55bb4 44 $results =~ s/$::tempfile_regexp/-/ig;
9607fc9c 45 $results =~ s/\n%[A-Z]+-[SIWEF]-.*$// if $Is_VMS; # clip off DCL status msg
1e422769 46 $expected =~ s/\n+$//;
9607fc9c 47 if ($results ne $expected) {
1e422769 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
1e422769 56__END__
57@a = (1, 2, 3);
58{
59 @a = sort { last ; } @a;
60}
61EXPECT
a651a37d 62Can't "last" outside a loop block at - line 3.
1e422769 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";
5aabfad6 123print STDERR "DONE\n";
1e422769 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 {
ca0b63a5 169 goto bar if $a == 0 || $b == 0;
1e422769 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
a651a37d 179Can't "goto" out of a pseudo block at - line 2.
e336de0d 180########
be7ddd5d 181%seen = ();
e336de0d
GS
182sub sortfn {
183 (split(/./, 'x'x10000))[0];
184 my (@y) = ( 4, 6, 5);
185 @y = sort { $a <=> $b } @y;
be7ddd5d
JH
186 my $t = "sortfn ".join(', ', @y)."\n";
187 print $t if ($seen{$t}++ == 0);
e336de0d
GS
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
a651a37d 232Can't "next" outside a loop block at - line 8.
e336de0d
GS
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
a651a37d 290Can't "next" outside a loop block at - line 4.
e336de0d
GS
291########
292@a = (1, 2, 3);
293foo:
294{
295 @a = sort { exit(0) } @a;
296}
297END { print "foobar\n" }
298EXPECT
299foobar
2c375eb9
GS
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();
c99da370 311{package rmb; sub{ eval{die} } ->() }; # check __ANON__ knows package
2c375eb9
GS
312EXPECT
313In DIE
314main|-|8|(eval)
315In DIE
316main|-|9|(eval)
317main|-|9|main::__ANON__
318In DIE
319main|-|10|(eval)
320main|-|10|main::foo
16920d4e
RB
321In DIE
322rmb|-|11|(eval)
c99da370 323rmb|-|11|rmb::__ANON__
be4f712a
GS
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
0cdb2077
GS
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
ecf8e9dd
GS
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
7ff03255
SG
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.