// Copyright (c) 2019, 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.

class Class {
  late int field = 10;

  Class.constructor1();
  Class.constructor2(this.field);
  Class.constructor3(int value) : this.field = value + 1;
  Class.constructor4([this.field = 42]);
}

class Subclass extends Class {
  Subclass.constructor1() : super.constructor1();
  Subclass.constructor2(int value) : super.constructor2(value);
  Subclass.constructor3(int value) : super.constructor3(value);
  Subclass.constructor4([int value = 87]) : super.constructor4(value);
}

test1() {
  var c1 = new Class.constructor1();
  expect(10, c1.field);
  c1.field = 16;
  expect(16, c1.field);

  var c2 = new Class.constructor2(42);
  expect(42, c2.field);
  c2.field = 43;
  expect(43, c2.field);

  var c3 = new Class.constructor3(87);
  expect(88, c3.field);
  c3.field = 89;
  expect(89, c3.field);

  var c4 = new Class.constructor4();
  expect(42, c4.field);
  c4.field = 43;
  expect(43, c4.field);

  var c5 = new Class.constructor4(123);
  expect(123, c5.field);
  c5.field = 124;
  expect(124, c5.field);
}

test2() {
  var c1 = new Subclass.constructor1();
  expect(10, c1.field);
  c1.field = 16;
  expect(16, c1.field);

  var c2 = new Subclass.constructor2(42);
  expect(42, c2.field);
  c2.field = 43;
  expect(43, c2.field);

  var c3 = new Subclass.constructor3(87);
  expect(88, c3.field);
  c3.field = 89;
  expect(89, c3.field);

  var c4 = new Subclass.constructor4();
  expect(87, c4.field);
  c4.field = 88;
  expect(88, c4.field);

  var c5 = new Subclass.constructor4(123);
  expect(123, c5.field);
  c5.field = 124;
  expect(124, c5.field);
}

main() {
  test1();
  test2();
}

expect(expected, actual) {
  if (expected != actual) throw 'Expected $expected, actual $actual';
}
