// 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.

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 {
  late A getterField;
  A get field {
  //    ^^^^^
  // [analyzer] STATIC_WARNING.GETTER_NOT_SUBTYPE_SETTER_TYPES
  // [cfe] unspecified
    return getterField;
  }

  void set field(B arg) {
    getterField = arg;
  }
}

class T2 {
  late A getterField;
  late C setterField;
  A get field {
  //    ^^^^^
  // [analyzer] STATIC_WARNING.GETTER_NOT_SUBTYPE_SETTER_TYPES
  // [cfe] unspecified
    return getterField;
  }

  // Type C is not assignable to A
  void set field(C arg) { setterField = arg; }
}

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

  void set field(A arg) {
    getterField = arg;
    //            ^^^
    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
    // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.
  }
}

main() {
  T1 instance1 = new T1();
  T2 instance2 = new T2();
  T3 instance3 = new T3();

  instance1.field = new B();
  A resultA = instance1.field;
  Expect.throwsTypeError(() => instance1.field = new A() as dynamic);
  B resultB = instance1.field;
  //          ^^^^^^^^^^^^^^^
  // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
  //                    ^
  // [cfe] A value of type 'A' can't be assigned to a variable of type 'B'.

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

  // Type 'A' has no method named 'b'
  instance1.field.b();
  //              ^
  // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
  // [cfe] The method 'b' isn't defined for the class 'A'.

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