class TestCase::Isa {
  use TestCase::Minimal;
  use TestCase::Simple;
  use Comparator;
  use Complex_2d;
  use Complex_2f;

  static method isa_any_object_type : int () {
    my $num : object;
    
    unless ($num isa object) {
      return 0;
    }
    
    return 1;
  }

  static method isa_numeric_type : int () {
    my $num : int;
    
    unless ($num isa int) {
      return 0;
    }
    
    if ($num isa long) {
      return 0;
    }
    
    return 1;
  }

  static method isa_multi_numeric_type : int () {
    my $num : Complex_2d;
    
    unless ($num isa Complex_2d) {
      return 0;
    }
    
    if ($num isa Complex_2f) {
      return 0;
    }
    
    return 1;
  }
  
  static method isa_match_class : int () {
    my $minimal = TestCase::Minimal->new;
    if ($minimal isa TestCase::Minimal) {
      my $object : object = $minimal;
      if ($object isa TestCase::Minimal) {
        return 1;
      }
    }
    
    return 0;
  }

  static method isa_match_array : int () {
    my $minimals = new TestCase::Minimal[3];
    my $nums = new int[3];
    
    if ($minimals isa TestCase::Minimal[]) {
      if ($nums isa int[]) {
        return 1;
      }
    }
    
    return 0;
  }

  static method isa_not_match_class : int () {
    my $minimal = TestCase::Minimal->new;
    if (!($minimal isa TestCase::Simple)) {
      return 1;
    }
    
    return 0;
  }

  static method isa_not_match_class_undef : int () {
    my $minimal : TestCase::Minimal = undef;
    
    if (!($minimal isa TestCase::Minimal)) {
      return 1;
    }
    
    return 0;
  }

  static method isa_match_callback : int () {
    
    my $comparator = method : int ($object1 : object, $object2 : object) {
      
    };
    if ($comparator isa Comparator) {
      my $object : object = $comparator;
      if ($object isa Comparator) {
        return 1;
      }
    }
    
    return 0;
  }

  static method isa_not_match_callback_undef : int () {
    my $comparator : Comparator;
    
    if (!($comparator isa Comparator)) {
      return 1;
    }
    
    return 0;
  }

  static method isa_not_match_callback : int () {
    my $minimal : TestCase::Minimal = TestCase::Minimal->new;
    if (!($minimal isa Comparator)) {
      return 1;
    }
    
    return 0;
  }}