// TODO(multitest): This was automatically migrated from a multitest and may
// contain strange or dead code.

// @dart = 2.9

// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// [NNBD non-migrated]: This test relies on implicit downcasts which are an
// error in NNBD, so has no version in language/.
import "package:expect/expect.dart";

// Tests classes with getters and setters that do not have the same type.

class A {
  int a() {
    return 37;
  }
}

class B extends A {
  int b() {
    return 38;
  }
}

class C {}

class T1 {
  A getterField;
  A get field {
    return getterField;
  }

  // OK, B is assignable to A
  void set field(B arg) {
    getterField = arg;
  }
}

class T2 {
  A getterField;
  C setterField;
  A get field {
    return getterField;
  }

  // Type C is not assignable to A

}

class T3 {
  B getterField;
  B get field {
    return getterField;
  }

  // OK, A is assignable to B
  void set field(A arg) {
    getterField = arg;
  }
}

main() {
  T1 instance1 = new T1();

  T3 instance3 = new T3();

  instance1.field = new B();
  A resultA = instance1.field;
  Expect.throwsTypeError(() => instance1.field = new A() as dynamic);
  B resultB = instance1.field;

  int result;
  result = instance1.field.a();
  Expect.equals(37, result);

  // Type 'A' has no method named 'b'


  instance3.field = new B();
  result = instance3.field.a();
  Expect.equals(37, result);
  result = instance3.field.b();
  Expect.equals(38, result);
}
