// 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 removeErrorListener(
 *                    SendPort port
 *                 )
 *    Stop listening for uncaught errors through port.
 *    The port should be a port that is listening for errors through
 * addErrorListener. This call requests that the isolate stops sending errors
 * on the port.
 *    If the same port has been passed via addErrorListener more than once,
 * only one call to removeErrorListener is needed to stop it from receiving
 * errors.
 *
 * @description Check that only one call to removeErrorListener() is necessary
 * to stop the port to receive isolate errors.
 *
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

test() async {
  ReceivePort errorPort = new ReceivePort();
  StreamIterator errors = new StreamIterator(errorPort);
  ErrorServer server = await ErrorServer.spawn(
    onError:errorPort.sendPort,
    errorsAreFatal:false
  );
  server.isolate.addErrorListener(errorPort.sendPort);
  server.isolate.addErrorListener(errorPort.sendPort);

  for (int i=0; i<3; i++) {
    server.generateError();
    Expect.isTrue(await errors.moveNext());
    Expect.equals(i.toString(), errors.current[0]);
  }

  server.isolate.removeErrorListener(errorPort.sendPort);

  server.generateError(); // these errors should not be received
  server.generateError();

  // check for unexpected events
  Expect.isFalse(await errors.moveNext().timeout(ONE_SECOND, onTimeout:()=>false));

  server.requestStop();
  errorPort.close();
  asyncEnd();
}

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