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

/**
 * @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
 */
// Requirements=nnbd-strong
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);
}
