/*
 * 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 Capability pause([
 *    Capability resumeCapability
 * ])
 *    Requests the isolate to pause.
 *    When the isolate receives the pause command, it stops processing events
 * from the event loop queue. It may still add new events to the queue in
 * response to, e.g., timers or receive-port messages. When the isolate is
 * resumed, it handles the already enqueued events.
 *
 * @description Check that paused isolate enqueue timer events and handles
 * them after resume. Parameter resumeCapability is specified.
 *
 * @author a.semenov@unipro.ru
 */
import "dart:async";
import "dart:isolate";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

void entryPoint(SendPort sendPort) {
  new Future.delayed(ONE_SECOND, () { sendPort.send("timer 1"); });
  new Future.delayed(TWO_SECONDS, () { sendPort.send("timer 2"); });
  new Future.delayed(new Duration(milliseconds:100),
      () {
        sendPort.send("activated");
      }
  );
}

test() async {
  Isolate isolate;
  List receivedData = [];
  Capability resumeCapability = new Capability();
  ReceivePort receivePort = new ReceivePort();
  receivePort.listen(
    (data){
      if ("activated"==data) {
        isolate.pause(resumeCapability);
      }
      receivedData.add(data);
    }
  );
  ReceivePort onExit = new ReceivePort();
  isolate = await Isolate.spawn(
                                entryPoint,
                                receivePort.sendPort,
                                onExit:onExit.sendPort
                              );
  await new Future.delayed(THREE_SECONDS);
// clean up & check
  isolate.resume(resumeCapability);
  await onExit.first;
  receivePort.close();
  Expect.listEquals(["activated", "timer 1", "timer 2"], receivedData);
  asyncEnd();
}

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