// Copyright (c) 2014, 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.

// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
// VMOptions=--no-enable-isolate-groups

import "dart:isolate";
import "dart:async";
import "package:expect/expect.dart";
import "package:async_helper/async_helper.dart";

isomain1(replyPort) {
  RawReceivePort port = new RawReceivePort();
  port.handler = (v) {
    replyPort.send(v);
    if (v == 0) port.close();
  };
  replyPort.send(port.sendPort);
}

void main() {
  asyncStart();
  var completer = new Completer(); // Completed by first reply from isolate.
  RawReceivePort reply = new RawReceivePort(completer.complete);
  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
    List result = [];
    completer.future.then((echoPort) {
      reply.handler = (v) {
        result.add(v);
        if (v == 0) {
          Expect.listEquals(["alive", "control"],
              result.where((x) => x is String).toList(), "control events");
          Expect.listEquals([3, 2, 1, 0],
              result.where((x) => x is int).toList(), "data events");
          Expect.isTrue(
              result.indexOf("alive") < result.indexOf(2), "alive index < 2");
          Expect.isTrue(result.indexOf("control") < result.indexOf(1),
              "control index < 1");
          reply.close();
          asyncEnd();
        }
      };
      var pingPort = new RawReceivePort();
      int pingCount = 0;
      pingPort.handler = (response) {
        result.add(response);
        pingCount++;
        if (pingCount == 2) pingPort.close();
      };
      ping(message, priority) {
        isolate.ping(pingPort.sendPort, response: message, priority: priority);
      }

      echoPort.send(3);
      ping("alive", Isolate.immediate);
      echoPort.send(2);
      ping("control", Isolate.beforeNextEvent);
      echoPort.send(1);
      echoPort.send(0);
    });
  });
}
