/*
 * 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 toplevel or static variable with an initializer is evaluated as
 * if it was marked late. Note that this is a change from pre-NNBD semantics in
 * that:
 *  - Throwing an exception during initializer evaluation no longer sets the
 *    variable to null
 *  - Reading the variable during initializer evaluation is no longer checked
 *    for, and does not cause an error.
 *
 * @description Check that throwing an exception during initializer evaluation
 * no longer sets a toplevel or static variable no null
 * @author sgrekhov@unipro.ru
 * @issue 40390
 */
// 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() {
  _counter = 0;
}

class C {
  static final String s1 = init("No", (){C.s1;});
  static String s2 = init("woman", (){C.s2;});
}

final String g1 = init("no", (){g1;});
String g2 = init("cry", (){g2;});

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

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

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

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