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

// @dart = 2.9

/// @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(false) uncaught error
/// will not 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();
  StreamIterator errors = new StreamIterator(errorPort);
  ErrorServer server = await ErrorServer.spawn(
                                                errorsAreFatal:true,
                                                onError: errorPort.sendPort
                                             );
  server.isolate.setErrorsFatal(false);
  // verify that errors are not fatal
  for (int i=0; i<3; i++) {
    server.generateError();
    Expect.isTrue(await errors.moveNext());
    Expect.equals(i.toString(), errors.current[0]);
  }
  // clean up
  await server.stop();
  errorPort.close();
  asyncEnd();
}

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