xref: /openbsd/gnu/usr.bin/perl/t/op/blocks.t (revision 898184e3)
1#!./perl
2
3BEGIN {
4    chdir 't';
5    @INC = '../lib';
6    require './test.pl';
7}
8
9plan tests => 6;
10
11my @expect = qw(
12b1
13b2
14b3
15b4
16b6
17u5
18b7
19u6
20u1
21c3
22c2
23c1
24i1
25i2
26b5
27u2
28u3
29u4
30e2
31e1
32		);
33my $expect = ":" . join(":", @expect);
34
35fresh_perl_is(<<'SCRIPT', $expect,{switches => [''], stdin => '', stderr => 1 },'Order of execution of special blocks');
36BEGIN {print ":b1"}
37END {print ":e1"}
38BEGIN {print ":b2"}
39{
40    BEGIN {BEGIN {print ":b3"}; print ":b4"}
41}
42CHECK {print ":c1"}
43INIT {print ":i1"}
44UNITCHECK {print ":u1"}
45eval 'BEGIN {print ":b5"}';
46eval 'UNITCHECK {print ":u2"}';
47eval 'UNITCHECK {print ":u3"; UNITCHECK {print ":u4"}}';
48"a" =~ /(?{UNITCHECK {print ":u5"};
49	   CHECK {print ":c2"};
50	   BEGIN {print ":b6"}})/x;
51eval {BEGIN {print ":b7"}};
52eval {UNITCHECK {print ":u6"}};
53eval {INIT {print ":i2"}};
54eval {CHECK {print ":c3"}};
55END {print ":e2"}
56SCRIPT
57
58@expect =(
59# BEGIN
60qw( main bar myfoo foo ),
61# UNITCHECK
62qw( foo myfoo bar main ),
63# CHECK
64qw( foo myfoo bar main ),
65# INIT
66qw( main bar myfoo foo ),
67# END
68qw(foo myfoo bar main  ));
69
70$expect = ":" . join(":", @expect);
71fresh_perl_is(<<'SCRIPT2', $expect,{switches => [''], stdin => '', stderr => 1 },'blocks interact with packages/scopes');
72BEGIN {$f = 'main'; print ":$f"}
73UNITCHECK {print ":$f"}
74CHECK {print ":$f"}
75INIT {print ":$f"}
76END {print ":$f"}
77package bar;
78BEGIN {$f = 'bar';print ":$f"}
79UNITCHECK {print ":$f"}
80CHECK {print ":$f"}
81INIT {print ":$f"}
82END {print ":$f"}
83package foo;
84{
85    my $f;
86    BEGIN {$f = 'myfoo'; print ":$f"}
87    UNITCHECK {print ":$f"}
88    CHECK {print ":$f"}
89    INIT {print ":$f"}
90    END {print ":$f"}
91}
92BEGIN {$f = "foo";print ":$f"}
93UNITCHECK {print ":$f"}
94CHECK {print ":$f"}
95INIT {print ":$f"}
96END {print ":$f"}
97SCRIPT2
98
99@expect = qw(begin unitcheck check init end);
100$expect = ":" . join(":", @expect);
101fresh_perl_is(<<'SCRIPT3', $expect,{switches => [''], stdin => '', stderr => 1 },'can name blocks as sub FOO');
102sub BEGIN {print ":begin"}
103sub UNITCHECK {print ":unitcheck"}
104sub CHECK {print ":check"}
105sub INIT {print ":init"}
106sub END {print ":end"}
107SCRIPT3
108
109fresh_perl_is(<<'SCRIPT70614', "still here",{switches => [''], stdin => '', stderr => 1 },'eval-UNITCHECK-eval (bug 70614)');
110eval "UNITCHECK { eval 0 }"; print "still here";
111SCRIPT70614
112
113# [perl #78634] Make sure block names can be used as constants.
114use constant INIT => 5;
115::is INIT, 5, 'constant named after a special block';
116
117# [perl #108794] context
118fresh_perl_is(<<'SCRIPT3', <<expEct,{stderr => 1 },'context');
119sub context {
120    print qw[void scalar list][wantarray + defined wantarray], "\n"
121}
122BEGIN     {context}
123UNITCHECK {context}
124CHECK     {context}
125INIT      {context}
126END       {context}
127SCRIPT3
128void
129void
130void
131void
132void
133expEct
134