xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/lib/Switch/t/given.t (revision 0:68f95e015346)
1*0Sstevel@tonic-gateBEGIN {
2*0Sstevel@tonic-gate    if ($ENV{PERL_CORE}) {
3*0Sstevel@tonic-gate        chdir('t') if -d 't';
4*0Sstevel@tonic-gate        @INC = qw(../lib);
5*0Sstevel@tonic-gate    }
6*0Sstevel@tonic-gate}
7*0Sstevel@tonic-gate
8*0Sstevel@tonic-gateuse Carp;
9*0Sstevel@tonic-gateuse Switch qw(Perl6 __ fallthrough);
10*0Sstevel@tonic-gate
11*0Sstevel@tonic-gatemy($C,$M);sub ok{$C++;$M.=$_[0]?"ok $C\n":"not ok $C (line ".(caller)[2].")\n"}
12*0Sstevel@tonic-gateEND{print"1..$C\n$M"}
13*0Sstevel@tonic-gate
14*0Sstevel@tonic-gate# NON-when THINGS;
15*0Sstevel@tonic-gate
16*0Sstevel@tonic-gate$when->{when} = { when => "when" };
17*0Sstevel@tonic-gate
18*0Sstevel@tonic-gate*when = \&when;
19*0Sstevel@tonic-gate
20*0Sstevel@tonic-gate# PREMATURE when
21*0Sstevel@tonic-gate
22*0Sstevel@tonic-gateeval { when 1 { ok(0) }; ok(0) } || ok(1);
23*0Sstevel@tonic-gate
24*0Sstevel@tonic-gate# H.O. FUNCS
25*0Sstevel@tonic-gate
26*0Sstevel@tonic-gategiven __ > 2 {
27*0Sstevel@tonic-gate
28*0Sstevel@tonic-gate	when 1	{ ok(0) } else { ok(1) }
29*0Sstevel@tonic-gate	when 2	{ ok(0) } else { ok(1) }
30*0Sstevel@tonic-gate	when 3	{ ok(1) } else { ok(0) }
31*0Sstevel@tonic-gate}
32*0Sstevel@tonic-gate
33*0Sstevel@tonic-gategiven (3) {
34*0Sstevel@tonic-gate
35*0Sstevel@tonic-gate	eval { when __ <= 1 || __ > 2	{ ok(0) } } || ok(1);
36*0Sstevel@tonic-gate	when __ <= 2 		{ ok(0) };
37*0Sstevel@tonic-gate	when __ <= 3		{ ok(1) };
38*0Sstevel@tonic-gate}
39*0Sstevel@tonic-gate
40*0Sstevel@tonic-gate# POSSIBLE ARGS: NUMERIC, STRING, ARRAY, HASH, REGEX, CODE
41*0Sstevel@tonic-gate
42*0Sstevel@tonic-gate# 1. NUMERIC SWITCH
43*0Sstevel@tonic-gate
44*0Sstevel@tonic-gatefor (1..3)
45*0Sstevel@tonic-gate{
46*0Sstevel@tonic-gate	given ($_) {
47*0Sstevel@tonic-gate		# SELF
48*0Sstevel@tonic-gate		when ($_) { ok(1) } else { ok(0) }
49*0Sstevel@tonic-gate
50*0Sstevel@tonic-gate		# NUMERIC
51*0Sstevel@tonic-gate		when 1 { ok ($_==1) } else { ok($_!=1) }
52*0Sstevel@tonic-gate		when (1)  { ok ($_==1) } else { ok($_!=1) }
53*0Sstevel@tonic-gate		when 3 { ok ($_==3) } else { ok($_!=3) }
54*0Sstevel@tonic-gate		when (4) { ok (0) } else { ok(1) }
55*0Sstevel@tonic-gate		when (2) { ok ($_==2) } else { ok($_!=2) }
56*0Sstevel@tonic-gate
57*0Sstevel@tonic-gate		# STRING
58*0Sstevel@tonic-gate		when ('a') { ok (0) } else { ok(1) }
59*0Sstevel@tonic-gate		when  'a'  { ok (0) } else { ok(1) }
60*0Sstevel@tonic-gate		when ('3') { ok ($_ == 3) } else { ok($_ != 3) }
61*0Sstevel@tonic-gate		when ('3.0') { ok (0) } else { ok(1) }
62*0Sstevel@tonic-gate
63*0Sstevel@tonic-gate		# ARRAY
64*0Sstevel@tonic-gate		when ([10,5,1]) { ok ($_==1) } else { ok($_!=1) }
65*0Sstevel@tonic-gate		when  [10,5,1]  { ok ($_==1) } else { ok($_!=1) }
66*0Sstevel@tonic-gate		when (['a','b']) { ok (0) } else { ok(1) }
67*0Sstevel@tonic-gate		when (['a','b',3]) { ok ($_==3) } else { ok ($_!=3) }
68*0Sstevel@tonic-gate		when (['a','b',2.0])  { ok ($_==2) } else { ok ($_!=2) }
69*0Sstevel@tonic-gate		when ([])  { ok (0) } else { ok(1) }
70*0Sstevel@tonic-gate
71*0Sstevel@tonic-gate		# HASH
72*0Sstevel@tonic-gate		when ({})  { ok (0) } else { ok (1) }
73*0Sstevel@tonic-gate		when {}  { ok (0) } else { ok (1) }
74*0Sstevel@tonic-gate		when {1,1}  { ok ($_==1) } else { ok($_!=1) }
75*0Sstevel@tonic-gate		when ({1=>1, 2=>0})  { ok ($_==1) } else { ok($_!=1) }
76*0Sstevel@tonic-gate
77*0Sstevel@tonic-gate		# SUB/BLOCK
78*0Sstevel@tonic-gate		when (sub {$_[0]==2})  { ok ($_==2) } else { ok($_!=2) }
79*0Sstevel@tonic-gate		when {$_[0]==2}  { ok ($_==2) } else { ok($_!=2) }
80*0Sstevel@tonic-gate		when {0}  { ok (0) } else { ok (1) }	# ; -> SUB, NOT HASH
81*0Sstevel@tonic-gate		when {1}  { ok (1) } else { ok (0) }	# ; -> SUB, NOT HASH
82*0Sstevel@tonic-gate	}
83*0Sstevel@tonic-gate}
84*0Sstevel@tonic-gate
85*0Sstevel@tonic-gate
86*0Sstevel@tonic-gate# 2. STRING SWITCH
87*0Sstevel@tonic-gate
88*0Sstevel@tonic-gatefor ('a'..'c','1')
89*0Sstevel@tonic-gate{
90*0Sstevel@tonic-gate	given ($_) {
91*0Sstevel@tonic-gate		# SELF
92*0Sstevel@tonic-gate		when ($_)  { ok(1) } else { ok(0) }
93*0Sstevel@tonic-gate
94*0Sstevel@tonic-gate		# NUMERIC
95*0Sstevel@tonic-gate		when (1)   { ok ($_ !~ /[a-c]/) } else { ok ($_ =~ /[a-c]/) }
96*0Sstevel@tonic-gate		when (1.0)  { ok ($_ !~ /[a-c]/) } else { ok ($_ =~ /[a-c]/) }
97*0Sstevel@tonic-gate
98*0Sstevel@tonic-gate		# STRING
99*0Sstevel@tonic-gate		when ('a')  { ok ($_ eq 'a') } else { ok($_ ne 'a') }
100*0Sstevel@tonic-gate		when ('b')  { ok ($_ eq 'b') } else { ok($_ ne 'b') }
101*0Sstevel@tonic-gate		when ('c')  { ok ($_ eq 'c') } else { ok($_ ne 'c') }
102*0Sstevel@tonic-gate		when ('1')  { ok ($_ eq '1') } else { ok($_ ne '1') }
103*0Sstevel@tonic-gate		when ('d')  { ok (0) } else { ok (1) }
104*0Sstevel@tonic-gate
105*0Sstevel@tonic-gate		# ARRAY
106*0Sstevel@tonic-gate		when (['a','1'])  { ok ($_ eq 'a' || $_ eq '1') }
107*0Sstevel@tonic-gate			else { ok ($_ ne 'a' && $_ ne '1') }
108*0Sstevel@tonic-gate		when (['z','2'])  { ok (0) } else { ok(1) }
109*0Sstevel@tonic-gate		when ([])  { ok (0) } else { ok(1) }
110*0Sstevel@tonic-gate
111*0Sstevel@tonic-gate		# HASH
112*0Sstevel@tonic-gate		when ({})  { ok (0) } else { ok (1) }
113*0Sstevel@tonic-gate		when ({a=>'a', 1=>1, 2=>0})  { ok ($_ eq 'a' || $_ eq '1') }
114*0Sstevel@tonic-gate			else { ok ($_ ne 'a' && $_ ne '1') }
115*0Sstevel@tonic-gate
116*0Sstevel@tonic-gate		# SUB/BLOCK
117*0Sstevel@tonic-gate		when (sub{$_[0] eq 'a' })  { ok ($_ eq 'a') }
118*0Sstevel@tonic-gate			else { ok($_ ne 'a') }
119*0Sstevel@tonic-gate		when {$_[0] eq 'a'}  { ok ($_ eq 'a') } else { ok($_ ne 'a') }
120*0Sstevel@tonic-gate		when {0}  { ok (0) } else { ok (1) }	# ; -> SUB, NOT HASH
121*0Sstevel@tonic-gate		when {1}  { ok (1) } else { ok (0) }	# ; -> SUB, NOT HASH
122*0Sstevel@tonic-gate	}
123*0Sstevel@tonic-gate}
124*0Sstevel@tonic-gate
125*0Sstevel@tonic-gate
126*0Sstevel@tonic-gate# 3. ARRAY SWITCH
127*0Sstevel@tonic-gate
128*0Sstevel@tonic-gatemy $iteration = 0;
129*0Sstevel@tonic-gatefor ([],[1,'a'],[2,'b'])
130*0Sstevel@tonic-gate{
131*0Sstevel@tonic-gate	given ($_) {
132*0Sstevel@tonic-gate	$iteration++;
133*0Sstevel@tonic-gate		# SELF
134*0Sstevel@tonic-gate		when ($_)  { ok(1) }
135*0Sstevel@tonic-gate
136*0Sstevel@tonic-gate		# NUMERIC
137*0Sstevel@tonic-gate		when (1)  { ok ($iteration==2) } else { ok ($iteration!=2) }
138*0Sstevel@tonic-gate		when (1.0)  { ok ($iteration==2) } else { ok ($iteration!=2) }
139*0Sstevel@tonic-gate
140*0Sstevel@tonic-gate		# STRING
141*0Sstevel@tonic-gate		when ('a')  { ok ($iteration==2) } else { ok ($iteration!=2) }
142*0Sstevel@tonic-gate		when ('b')  { ok ($iteration==3) } else { ok ($iteration!=3) }
143*0Sstevel@tonic-gate		when ('1')  { ok ($iteration==2) } else { ok ($iteration!=2) }
144*0Sstevel@tonic-gate
145*0Sstevel@tonic-gate		# ARRAY
146*0Sstevel@tonic-gate		when (['a',2])  { ok ($iteration>=2) } else { ok ($iteration<2) }
147*0Sstevel@tonic-gate		when ([1,'a'])  { ok ($iteration==2) } else { ok($iteration!=2) }
148*0Sstevel@tonic-gate		when ([])  { ok (0) } else { ok(1) }
149*0Sstevel@tonic-gate		when ([7..100])  { ok (0) } else { ok(1) }
150*0Sstevel@tonic-gate
151*0Sstevel@tonic-gate		# HASH
152*0Sstevel@tonic-gate		when ({})  { ok (0) } else { ok (1) }
153*0Sstevel@tonic-gate		when ({a=>'a', 1=>1, 2=>0})  { ok ($iteration==2) }
154*0Sstevel@tonic-gate			else { ok ($iteration!=2) }
155*0Sstevel@tonic-gate
156*0Sstevel@tonic-gate		# SUB/BLOCK
157*0Sstevel@tonic-gate		when {scalar grep /a/, @_}  { ok ($iteration==2) }
158*0Sstevel@tonic-gate			else { ok ($iteration!=2) }
159*0Sstevel@tonic-gate		when (sub {scalar grep /a/, @_ })  { ok ($iteration==2) }
160*0Sstevel@tonic-gate			else { ok ($iteration!=2) }
161*0Sstevel@tonic-gate		when {0}  { ok (0) } else { ok (1) }	# ; -> SUB, NOT HASH
162*0Sstevel@tonic-gate		when {1}  { ok (1) } else { ok (0) }	# ; -> SUB, NOT HASH
163*0Sstevel@tonic-gate	}
164*0Sstevel@tonic-gate}
165*0Sstevel@tonic-gate
166*0Sstevel@tonic-gate
167*0Sstevel@tonic-gate# 4. HASH SWITCH
168*0Sstevel@tonic-gate
169*0Sstevel@tonic-gate$iteration = 0;
170*0Sstevel@tonic-gatefor ({},{a=>1,b=>0})
171*0Sstevel@tonic-gate{
172*0Sstevel@tonic-gate	given ($_) {
173*0Sstevel@tonic-gate	$iteration++;
174*0Sstevel@tonic-gate
175*0Sstevel@tonic-gate		# SELF
176*0Sstevel@tonic-gate		when ($_)  { ok(1) } else { ok(0) }
177*0Sstevel@tonic-gate
178*0Sstevel@tonic-gate		# NUMERIC
179*0Sstevel@tonic-gate		when (1)  { ok (0) } else { ok (1) }
180*0Sstevel@tonic-gate		when (1.0)  { ok (0) } else { ok (1) }
181*0Sstevel@tonic-gate
182*0Sstevel@tonic-gate		# STRING
183*0Sstevel@tonic-gate		when ('a')  { ok ($iteration==2) } else { ok ($iteration!=2) }
184*0Sstevel@tonic-gate		when ('b')  { ok (0) } else { ok (1) }
185*0Sstevel@tonic-gate		when ('c')  { ok (0) } else { ok (1) }
186*0Sstevel@tonic-gate
187*0Sstevel@tonic-gate		# ARRAY
188*0Sstevel@tonic-gate		when (['a',2])  { ok ($iteration==2) }
189*0Sstevel@tonic-gate			else { ok ($iteration!=2) }
190*0Sstevel@tonic-gate		when (['b','a'])  { ok ($iteration==2) }
191*0Sstevel@tonic-gate			else { ok ($iteration!=2) }
192*0Sstevel@tonic-gate		when (['b','c'])  { ok (0) } else { ok (1) }
193*0Sstevel@tonic-gate		when ([])  { ok (0) } else { ok(1) }
194*0Sstevel@tonic-gate		when ([7..100])  { ok (0) } else { ok(1) }
195*0Sstevel@tonic-gate
196*0Sstevel@tonic-gate		# HASH
197*0Sstevel@tonic-gate		when ({})  { ok (0) } else { ok (1) }
198*0Sstevel@tonic-gate		when ({a=>'a', 1=>1, 2=>0})  { ok (0) } else { ok (1) }
199*0Sstevel@tonic-gate
200*0Sstevel@tonic-gate		# SUB/BLOCK
201*0Sstevel@tonic-gate		when {$_[0]{a}}  { ok ($iteration==2) }
202*0Sstevel@tonic-gate			else { ok ($iteration!=2) }
203*0Sstevel@tonic-gate		when (sub {$_[0]{a}})  { ok ($iteration==2) }
204*0Sstevel@tonic-gate			else { ok ($iteration!=2) }
205*0Sstevel@tonic-gate		when {0}  { ok (0) } else { ok (1) }	# ; -> SUB, NOT HASH
206*0Sstevel@tonic-gate		when {1}  { ok (1) } else { ok (0) }	# ; -> SUB, NOT HASH
207*0Sstevel@tonic-gate	}
208*0Sstevel@tonic-gate}
209*0Sstevel@tonic-gate
210*0Sstevel@tonic-gate
211*0Sstevel@tonic-gate# 5. CODE SWITCH
212*0Sstevel@tonic-gate
213*0Sstevel@tonic-gate$iteration = 0;
214*0Sstevel@tonic-gatefor ( sub {1},
215*0Sstevel@tonic-gate      sub { return 0 unless @_;
216*0Sstevel@tonic-gate	    my ($data) = @_;
217*0Sstevel@tonic-gate	    my $type = ref $data;
218*0Sstevel@tonic-gate	    return $type eq 'HASH'   && $data->{a}
219*0Sstevel@tonic-gate		|| $type eq 'Regexp' && 'a' =~ /$data/
220*0Sstevel@tonic-gate		|| $type eq ""       && $data eq '1';
221*0Sstevel@tonic-gate	  },
222*0Sstevel@tonic-gate      sub {0} )
223*0Sstevel@tonic-gate{
224*0Sstevel@tonic-gate	given ($_) {
225*0Sstevel@tonic-gate	$iteration++;
226*0Sstevel@tonic-gate		# SELF
227*0Sstevel@tonic-gate		when ($_)  { ok(1) } else { ok(0) }
228*0Sstevel@tonic-gate
229*0Sstevel@tonic-gate		# NUMERIC
230*0Sstevel@tonic-gate		when (1)  { ok ($iteration<=2) } else { ok ($iteration>2) }
231*0Sstevel@tonic-gate		when (1.0)  { ok ($iteration<=2) } else { ok ($iteration>2) }
232*0Sstevel@tonic-gate		when (1.1)  { ok ($iteration==1) } else { ok ($iteration!=1) }
233*0Sstevel@tonic-gate
234*0Sstevel@tonic-gate		# STRING
235*0Sstevel@tonic-gate		when ('a')  { ok ($iteration==1) } else { ok ($iteration!=1) }
236*0Sstevel@tonic-gate		when ('b')  { ok ($iteration==1) } else { ok ($iteration!=1) }
237*0Sstevel@tonic-gate		when ('c')  { ok ($iteration==1) } else { ok ($iteration!=1) }
238*0Sstevel@tonic-gate		when ('1')  { ok ($iteration<=2) } else { ok ($iteration>2) }
239*0Sstevel@tonic-gate
240*0Sstevel@tonic-gate		# ARRAY
241*0Sstevel@tonic-gate		when ([1, 'a'])  { ok ($iteration<=2) }
242*0Sstevel@tonic-gate			else { ok ($iteration>2) }
243*0Sstevel@tonic-gate		when (['b','a'])  { ok ($iteration==1) }
244*0Sstevel@tonic-gate			else { ok ($iteration!=1) }
245*0Sstevel@tonic-gate		when (['b','c'])  { ok ($iteration==1) }
246*0Sstevel@tonic-gate			else { ok ($iteration!=1) }
247*0Sstevel@tonic-gate		when ([])  { ok ($iteration==1) } else { ok($iteration!=1) }
248*0Sstevel@tonic-gate		when ([7..100])  { ok ($iteration==1) }
249*0Sstevel@tonic-gate			else { ok($iteration!=1) }
250*0Sstevel@tonic-gate
251*0Sstevel@tonic-gate		# HASH
252*0Sstevel@tonic-gate		when ({})  { ok ($iteration==1) } else { ok ($iteration!=1) }
253*0Sstevel@tonic-gate		when ({a=>'a', 1=>1, 2=>0})  { ok ($iteration<=2) }
254*0Sstevel@tonic-gate			else { ok ($iteration>2) }
255*0Sstevel@tonic-gate
256*0Sstevel@tonic-gate		# SUB/BLOCK
257*0Sstevel@tonic-gate		when {$_[0]->{a}}  { ok (0) } else { ok (1) }
258*0Sstevel@tonic-gate		when (sub {$_[0]{a}})  { ok (0) } else { ok (1) }
259*0Sstevel@tonic-gate		when {0}  { ok (0) } else { ok (1) }	# ; -> SUB, NOT HASH
260*0Sstevel@tonic-gate		when {1}  { ok (0) } else { ok (1) }	# ; -> SUB, NOT HASH
261*0Sstevel@tonic-gate	}
262*0Sstevel@tonic-gate}
263*0Sstevel@tonic-gate
264*0Sstevel@tonic-gate
265*0Sstevel@tonic-gate# NESTED SWITCHES
266*0Sstevel@tonic-gate
267*0Sstevel@tonic-gatefor my $count (1..3)
268*0Sstevel@tonic-gate{
269*0Sstevel@tonic-gate	given ([9,"a",11]) {
270*0Sstevel@tonic-gate		when (qr/\d/)  {
271*0Sstevel@tonic-gate				given ($count) {
272*0Sstevel@tonic-gate					when (1)      { ok($count==1) }
273*0Sstevel@tonic-gate						else { ok($count!=1) }
274*0Sstevel@tonic-gate					when ([5,6])  { ok(0) } else { ok(1) }
275*0Sstevel@tonic-gate				}
276*0Sstevel@tonic-gate			    }
277*0Sstevel@tonic-gate		ok(1) when 11;
278*0Sstevel@tonic-gate	}
279*0Sstevel@tonic-gate}
280