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