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;
      }
    }
  }
}