// Copyright (c) 2016, 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 If the errorAreFatal, onExit and/or onError parameters are
/// provided, the isolate will act as if, respectively, setErrorsFatal,
/// addOnExitListener and addErrorListener were called with the corresponding
/// parameter and was processed before the isolate starts running.
///
/// @description Check that with errorAreFatal set to false the isolate is
/// only suspended on any error. The isolate is passive.
/// @author a.semenov@unipro.ru

import "dart:isolate";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

void entryPoint(List message) {
  SendPort sendPort = message[1];
  ReceivePort receivePort = new ReceivePort();
  dynamic i = 1;

  receivePort.listen(
     (data) {
        sendPort.send(data);
        // An error that should suspend the isolate
        sendPort.send(", " + i);
        sendPort.send("hello");
     }
  );
  message[0].send(receivePort.sendPort);
}

test() async {
  ReceivePort controlPort = new ReceivePort();
  ReceivePort receivePort = new ReceivePort();

  Isolate isolate = await Isolate.spawn(entryPoint,
                                  [controlPort.sendPort, receivePort.sendPort],
                                   errorsAreFatal:false);
  SendPort sendPort = await controlPort.first;

  int i = 0;
  List receivedData = [];
  sendPort.send(i++);
  await for (var data in receivePort) {
    receivedData.add(data);
    Expect.equals("ping", await ping(isolate, "ping", THREE_SECONDS));
    if (i < 5) {
      sendPort.send(i++);
    } else {
      receivePort.close();
      Expect.listEquals([0, 1, 2, 3, 4], receivedData);
      asyncEnd();
    }
  }
}

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