/*
 * 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 pause() does not stop the isolate to execute code.
 *
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "dart:math";
import "../../../Utils/expect.dart";

// indefinitely running isolate
entryPoint(List<SendPort> sendPorts) {
  sendPorts[0].send(42);
  Random random = new Random();
  int s = 0;
  while (true) {
    s = -s + random.nextInt(100);
    sendPorts[1].send(s);
  }
}

test() async {
  ReceivePort receivePort1 = new ReceivePort();
  ReceivePort receivePort2 = new ReceivePort();
  ReceivePort onExit = new ReceivePort();
  Isolate isolate =
      await Isolate.spawn(entryPoint,
          [receivePort1.sendPort, receivePort2.sendPort],
          onExit: onExit.sendPort,
          errorsAreFatal: true);
  // make sure that isolate started its work
  await receivePort1.first;
  isolate.pause();
  // check that messages are received from paused isolate
  int count = 0;
  await for (var _ in receivePort2) {
    if (count++ == 1000000) {
      break;
    }
  }
  // clean up
  isolate.kill(priority: Isolate.immediate);
  await onExit.first;
  asyncEnd();
}

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