class TestCase::Statement::Switch { enum { VALUE0, VALUE1, VALUE2, } static method switch : int () { # switch basec patterns { { my $success : int; switch (1) { case 1: { $success = 1; break; } case 3: { $success = 0; break; } case 10000: { $success = 0; break; } default: } unless ($success) { return 0; } } { my $success : int; switch (3) { case 1: { $success = 0; break; } case 3: { $success = 1; break; } case 10000: { $success = 0; break; } default: } unless ($success) { return 0; } } { my $success : int; switch (10000) { case 3: { $success = 0; break; } case 1: { $success = 0; break; } case 10000: { $success = 1; break; } default: } unless ($success) { return 0; } } { my $success4 : int; switch (2) { case 1: { break; } case 3: { break; } case 10000: { break; } default: { $success4 = 1; } } unless ($success4) { return 0; } } { my $success : int; switch(3) { case 3: { $success = 1; break; } case 4: { $success = 0; break; } case 5: { $success = 0; break; } default: } unless ($success) { return 0; } } { my $success : int; switch(4) { case 3: { $success = 0; break; } case 4: { $success = 1; break; } case 5: { $success = 0; break; } default: } unless ($success) { return 0; } } { my $success : int; switch(10) { case 3: { $success = 0; break; } case 4: { $success = 0; break; } case 5: { $success = 0; break; } default: { $success = 1; } } unless ($success) { return 0; } } # Only default { my $success : int; switch (1) { default: { $success = 1; } } unless ($success) { return 0; } } # No cases and default { my $success = 0; switch (1) {} $success = 1; unless ($success) { return 0; } } # No cases and default { my $success = 0; switch ((byte)1) { case 1: { $success = 1; break; } } unless ($success) { return 0; } } # break is added to the end of the block if it doesn't exist { my $success = 0; switch (1) { case 1: { $success = 1; } case 2: { $success = 2; } } unless ($success == 1) { return 0; } } { my $success = 0; switch (1) { case 1: {} case 2: { $success = 2; } } unless ($success == 0) { return 0; } } # break in default { my $success = 0; switch (1) { default: { $success = 1; break; $success = 2; } } unless ($success == 1) { return 0; } } } # Minus value { my $success : int; switch (-1) { case -1: { $success = 1; break; } case 3: { $success = 0; break; } case 10000: { $success = 0; break; } default: } unless ($success) { return 0; } } # int max { my $success : int; switch (2147483647) { case 2147483647: { $success = 1; break; } case 3: { $success = 0; break; } case 10000: { $success = 0; break; } default: } unless ($success) { return 0; } } # int min { my $success : int; switch (-2147483648) { case -2147483648: { $success = 1; break; } case 3: { $success = 0; break; } case 10000: { $success = 0; break; } default: } unless ($success) { return 0; } } # return statement in the switch statement { my $ret = TestCase::Statement::Switch->switch_return_method(); unless ($ret == 5) { return 0; } } # No default branch { my $i = 0; switch ($i) { case 1: { 1; break; } } my $p = 5; unless ($p == 5) { return 0; } } # The type of the operand of the case statement is byte type { my $char = (int)'['; my $success = 0; switch ($char) { case 3: { break; } case ']': { break; } case '[': { $success = 1; break; } } unless ($success) { return 0; } } # Nested switch statements { my $success : int; switch (3) { case 1: { $success = 0; break; } case 3: { switch (5) { case 2: { $success = 0; break; } case 5: { $success = 1; break; } case 6: { $success = 0; break; } default: { $success = 0; break; } } break; } case 10000: { $success = 0; break; } default: } unless ($success) { return 0; } } # default statement { # default statement { { my $num = 1; my $value = 3; switch ($num) { case 2 : { $value = 5; break; } default : { $value = 7; } } unless ($value == 7) { return 0; } } { my $num = 1; my $value = 3; switch ($num) { case 2 : { $value = 5; break; } case 3 : { $value = 5; break; } default : { $value = 7; } } unless ($value == 7) { return 0; } } { my $num = 1; my $value = 3; switch ($num) { case 2 : { $value = 5; break; } case 3 : { $value = 5; break; } case 4 : { $value = 5; break; } default : { $value = 7; } } unless ($value == 7) { return 0; } } } # no default statement { { my $num = 1; my $value = 3; switch ($num) { case 2 : { $value = 5; break; } } unless ($value == 3) { return 0; } } { my $num = 1; my $value = 3; switch ($num) { case 2 : { $value = 5; break; } case 3 : { $value = 5; break; } } unless ($value == 3) { return 0; } } { my $num = 1; my $value = 3; switch ($num) { case 2 : { $value = 5; break; } case 3 : { $value = 5; break; } case 4 : { $value = 5; break; } } unless ($value == 3) { return 0; } } } } # Enumeration { my $success : int; switch (1) { case &VALUE0: { $success = 0; break; } case &VALUE1: { $success = 1; break; } case &VALUE2: { $success = 0; break; } default: } unless ($success) { return 0; } } # Character literal { my $success : int; switch ('b') { case 'a': { $success = 0; break; } case 'b': { $success = 1; break; } case 'c': { $success = 0; break; } default: { warn "DDDDDD"; } } unless ($success) { return 0; } } # Multiple case values at once { my $total = 0; for (my $i = 0; $i < 2; $i++) { switch ($i) { case 0 : case 1 : { $total++; } } } unless ($total == 2) { return 0; } } return 1; } static method switch_extra : int () { { # If a case statement exists and default doesn't exist, wrong branch is executed. { my $num = 1; my $branch_first_case = 0; switch ($num) { case 2 : { 1; # If a statement exists and default doesn't exist, this branch is executed. $branch_first_case = 1; break; } } if ($branch_first_case) { return 0; } } # Add default in above case { my $num = 1; my $branch_first_case = 0; switch ($num) { case 2 : { 1; # If a statement exists and default doesn't exist, this branch is executed. $branch_first_case = 1; break; } default : {} } if ($branch_first_case) { return 0; } } # break in while satement { my $num = 0; my $result = 0; switch ($num) { case 0: { while (1) { $result = 1; break; } $result = 2; } } unless ($result == 1) { return 0; } } # break in for satement { my $num = 0; my $result = 0; switch ($num) { case 0: { for (my $i = 0; $i < 5; $i++) { $result = 1; break; } $result = 2; } } unless ($result == 1) { return 0; } } # break in if satement { my $num = 0; my $result = 0; switch ($num) { case 0: { if (1) { $result = 1; break; } $result = 2; } } unless ($result == 1) { return 0; } } } return 1; } static method switch_return_method : int () { my $i = 2; switch ($i) { case 1: { return 3; } case 2: { return 5; } } } }