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

  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();
  throws(() => c1.field, 'Read value from uninitialized Class.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();
  throws(() => c1.field, 'Read value from uninitialized Class.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';
}

throws(f(), String message) {
  dynamic value;
  try {
    value = f();
  } on Error catch (e) {
    print(e);
    return;
  }
  throw '$message: $value';
}
