xref: /openbsd/gnu/usr.bin/perl/t/op/runlevel.t (revision cca36db2)
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