// 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.
// Test overriding of fields.

// @dart = 2.9

import "package:expect/expect.dart";

class A {}

class B1 extends A {}

class B2 extends A {}

class Super {
  Super() : super();

  B1 field;
}

class Sub extends Super {
  Sub() : super();

  // Invalid override. The type of 'Sub.field' ('() → A') isn't a subtype of
  // 'Super.field' ('() → B1').
  A field; // //# 00: compile-time error
}

class SubSub extends Super {
  SubSub() : super();

  // B2 not assignable to B1
  B2 field; // //# 01: compile-time error
}

main() {
  SubSub val1 = new SubSub();
  val1.field = new B2(); //# 02: compile-time error
  Expect.equals(true, val1.field is B2); //# 02: continued

  Sub val2 = new Sub();
  val2.field = new A(); //# none: compile-time error
  Expect.equals(true, val2.field is A);
  Expect.equals(false, val2.field is B1);
  Expect.equals(false, val2.field is B2);

  Super val3 = new Super();
  val3.field = new B1();
  Expect.equals(true, val3.field is B1);
  Expect.equals(false, val3.field is B2);
}
