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

/// @assertion A read of a field or variable which is marked as late which has
/// not yet been written to causes the initializer expression of the variable to
/// be evaluated to a value, assigned to the variable or field, and returned as
/// the value of the read.
/// ...
/// If a variable or field is read from during the process of evaluating its own
/// initializer expression, and no write to the variable has occurred, the read
/// is treated as a first read and the initializer expression is evaluated again.
///
/// @description Check that if a variable or field is read from during the
/// process of evaluating its own initializer expression, and no write to the
/// variable has occurred, the read is treated as a first read and the
/// initializer expression is evaluated again
/// @author sgrekhov@unipro.ru
/// @issue 40390

// Requirements=nnbd-weak
import "../../../Utils/expect.dart";

String _log = "";
int _counter = 0;

String init(String val, void readme()) {
  _counter++;
  _log = "init('$val'), counter: $_counter";
  if (_counter == 1) {
    readme();
    throw new Exception();
  }
  return val;
}

void clear() {
  _log = "";
  _counter = 0;
}

class C {
  static late final String? s1 = init("When", (){C.s1;});
  static late String? s2 = init("I found", (){C.s2;});
  covariant late String? v1 = init("myself", (){this.v1;});
  late final String? v2 = init("in time", (){this.v2;});
  late String? v3 = init("of trouble", (){this.v3;});
}

late final String? g1 = init("Mother Mary", (){g1;});
late String? g2 = init("comes to me", (){g2;});

main() {
  Expect.equals("", _log);
  Expect.throws(() {C.s1;});
  Expect.equals("When", C.s1);
  Expect.equals("init('When'), counter: 2", _log);
  clear();

  Expect.throws(() {C.s2;});
  Expect.equals("I found", C.s2);
  Expect.equals("init('I found'), counter: 2", _log);
  clear();

  C c = new C();
  Expect.equals("", _log);

  Expect.throws(() {c.v1;});
  Expect.equals("myself", c.v1);
  Expect.equals("init('myself'), counter: 2", _log);
  clear();

  Expect.throws(() {c.v2;});
  Expect.equals("in time", c.v2);
  Expect.equals("init('in time'), counter: 2", _log);
  clear();

  Expect.throws(() {c.v3;});
  Expect.equals("of trouble", c.v3);
  Expect.equals("init('of trouble'), counter: 2", _log);
  clear();

  Expect.throws(() {g1;});
  Expect.equals("Mother Mary", g1);
  Expect.equals("init('Mother Mary'), counter: 2", _log);
  clear();

  Expect.throws(() {g2;});
  Expect.equals("comes to me", g2);
  Expect.equals("init('comes to me'), counter: 2", _log);
}
