// Copyright (c) 2011-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 Future<Isolate> spawn(void entryPoint(message), message,
/// {bool paused: false, bool errorsAreFatal, SendPort onExit, SendPort onError})
///
///    The argument entryPoint specifies the entry point of the spawned isolate.
/// It must be a top-level function or a static method that takes one argument -
/// that is, one-parameter functions that can be compile-time constant function
/// values. It is not allowed to pass the value of function expressions or
/// an instance method extracted from an object.
///
///    The entry-point function is invoked with the initial message. Usually
/// the initial message contains a SendPort so that the spawner and spawnee can
/// communicate with each other.
///
/// @description Checks that sending multiple messages works fine.
/// @author iefremov


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

final int MSG_NUM = 100;

iMain(SendPort replyPort) {
  var receivePort = new ReceivePort();

  replyPort.send(receivePort.sendPort);

  receivePort.listen((message) {
    replyPort.send(message-1);
    if(message == 0) {
      receivePort.close();
    }
  });
}

main() {
  var receivePort = new ReceivePort();
  var requestPort;

  void receiveHandler(var message) {
    if (message is SendPort) {
      requestPort=message;
      asyncStart();
      requestPort.send(MSG_NUM);
    } else if (message is int) {
      if (message==0) {
        receivePort.close();
      } else {
        asyncStart();
        requestPort.send(message);
      }
    } else {
      Expect.fail("unexpected message type: ${message.runtimeType}");
    }
    asyncEnd();
  }

  asyncStart();
  Isolate.spawn(iMain, receivePort.sendPort);
  receivePort.listen(receiveHandler);
}
