// Copyright (c) 2017, 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 void setErrorsFatal(
 *                                bool errorsAreFatal
 *                               )
 *    Set whether uncaught errors will terminate the isolate.
 *    If errors are fatal, any uncaught error will terminate the isolate event
 * loop and shut down the isolate.
 *
 * @description Check that after call to setErrorsFatal(true) uncaught error
 * will terminate the isolate.
 *
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

test() async {
  // setup
  ReceivePort errorPort = new ReceivePort();
  ReceivePort exitPort = new ReceivePort();
  StreamIterator errors = new StreamIterator(errorPort);
  ErrorServer server = await ErrorServer.spawn(
                                                errorsAreFatal:false,
                                                onError: errorPort.sendPort,
                                                onExit: exitPort.sendPort
                                             );
  // verify that errors are not fatal
  server.generateError();
  Expect.isTrue(await errors.moveNext());
  Expect.equals("0", errors.current[0]);
  server.generateError();
  Expect.isTrue(await errors.moveNext());
  Expect.equals("1", errors.current[0]);

  server.isolate.setErrorsFatal(true);
  // verify that next error will terminate the isolate
  server.generateError();
  Expect.isTrue(await errors.moveNext());
  Expect.equals("2", errors.current[0]);
  await exitPort.first;
  // clean up
  errorPort.close();
  asyncEnd();
}

main() {
  asyncStart();
  test();
}
