package TestCase::Exception {
  use TestCase::Minimal;
  use TestCase;
  
  sub exception_get_field_object_undef : int () {
    
    my $test_case : TestCase = undef;
    
    eval {
      $test_case->{x_byte};
    };
    if ($@) {
      return 1;
      
      eval {
        $test_case->{x_short};
      };
      
      if ($@) {
        return 1;

        eval {
          $test_case->{x_int};
        };
        
        if ($@) {
          eval {
            $test_case->{x_long};
          };
          
          if ($@) {
            eval {
              $test_case->{x_float};
            };
            
            if ($@) {
              eval {
                $test_case->{x_double};
              };
              
              if ($@) {
                eval {
                  $test_case->{x_test_case};
                };
                
                if ($@) {

                  return 1;
                }
              }
            }
          }
        }

      }
      
    }
    
    return 0;
  }
  
  sub exception_set_field_object_undef : int () {
    
    my $test_case : TestCase = undef;
    
    eval {
      $test_case->{x_byte} = (byte)1;
    };
    if ($@) {
      return 1;
      
      eval {
        $test_case->{x_short} = (short)1;
      };
      
      if ($@) {
        return 1;

        eval {
          $test_case->{x_int} = 1;
        };
        
        if ($@) {
          eval {
            $test_case->{x_long} = 1L;
          };
          
          if ($@) {
            eval {
              $test_case->{x_float} = 1f;
            };
            
            if ($@) {
              eval {
                $test_case->{x_double} = 1d;
              };
              
              if ($@) {
                eval {
                  $test_case->{x_test_case} = undef;
                };
                
                if ($@) {

                  return 1;
                }
              }
            }
          }
        }
      }
      
    }
    
    return 0;
  }
  sub exception_eval_call_sub : int () {
    eval {
      exception_die_return_int();
    };
    
    if ($@) {
      return 1;
    }
    
    return 0;
  }
  
  sub exception_call_stack : int () {
    exception_die_return_int();
  }
  
  sub exception_die_return_byte : byte () {
    die "Error";
  }
  
  sub exception_die_return_short : short () {
    die "Error";
  }
  
  sub exception_die_return_int : int () {
    die "Error";
  }
  
  sub exception_die_return_long : long () {
    die "Error";
  }
  
  sub exception_die_return_float : float () {
    die "Error";
  }
  
  sub exception_die_return_double : double () {
    die "Error";
  }
  
  sub exception_die_return_object : TestCase::Minimal () {
    die "Error";
  }
  
  sub exception_die_return_void : void () {
    die "Error";
  }

  sub exception_die_return_int_eval_catch : int () {
    eval {
      die "Error";
    };
    
    
    if ($@) {
      return 1;
    }
    
    return 0;
  }
  # Exception
  sub exception_zero_divide_int : int () {
    1 / 0;
  }
}