class TestCase::AnyObjectArray {
  use Point;
  
  static method basic : int () {
    
    # object[] - assign numeric object
    {
      # object[] can be assigned Int[] object
      my $obj_nums : object[] = [Int->new(1), Int->new(2), Int->new(3)];
      
      # Can get element
      my $obj_num0 = (Int)$obj_nums->[0];
      my $obj_num1 = (Int)$obj_nums->[1];
      my $obj_num2 = (Int)$obj_nums->[2];
      unless ((int)$obj_num0 == 1) {
        return 0;
      }
      unless ((int)$obj_num1 == 2) {
        return 0;
      }
      unless ((int)$obj_num2 == 3) {
        return 0;
      }
      
      # Array invalid range access
      eval {
        $obj_nums->[3];
      };
      unless ($@) {
        return 0;
      }
      
      # isa return real type
      unless ($obj_nums isa Int[]) {
        return 0;
      }
      
      # Int type can be assigned
      $obj_nums->[2] = Int->new(4);
      
      # If other type is assinged, runtime exception occur
      eval {
        $obj_nums->[0] = Long->new(2);
      };
      unless ($@) {
        return 0;
      }
      
      # Cast to Int[];
      my $obj_ints = (Int[])$obj_nums;
      unless ($obj_ints isa Int[]) {
        return 0;
      }
      
      # Cast to Invalid array type, runtime exception occur
      eval {
        (Long[])$obj_nums;
      };
      unless ($@) {
        return 0;
      }
      
      # Can assign undef
      {
        my $obj_elems : object[] = undef;
        unless ($obj_elems == undef) {
          return 0;
        }
      }
    }
    
    # Multi-Dimensional Array
    {
      my $objects : object[] = new Point[][3];
      $objects->(Point[][])->[0] = new Point[3];
      my $point : Point = $objects->(Point[][])->[0][0];
    }
    
    $@ = undef;
    return 1;
  }
  
}