class TestCase::Switch {
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;
}
}
}
# return statement in the switch statement
{
my $ret = TestCase::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 the 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;
}
}
}
}
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;
}
}
}
return 1;
}
static method switch_return_method : int () {
my $i = 2;
switch ($i) {
case 1: {
return 3;
}
case 2: {
return 5;
}
}
}
}