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