/*
 * 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 paused parameter is set to true, the isolate will start up
 * in a paused state, as if by an initial call of
 * isolate.pause(isolate.pauseCapability). To resume the isolate,
 * call isolate.resume(isolate.pauseCapability).
 *
 * @description Check that paused isolate (started with parameter paused
 * equal to true) is resumed by call to isolate.pause(isolate.pauseCapability)
 *
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";

void entryPoint(SendPort sendPort) {
  sendPort.send("response");
}

test() async {
  bool paused = true;
  ReceivePort receivePort = new ReceivePort();
  receivePort.listen((data) {
    Expect.isFalse(paused, "Isolate should not be in paused state");
    Expect.equals("response", data);
    asyncEnd();
    receivePort.close();
  });
  Isolate isolate =
      await Isolate.spawn(entryPoint, receivePort.sendPort, paused: true);
  await new Future.delayed(new Duration(seconds: 1));
  paused = false;
  var pc = isolate.pauseCapability;
  if (pc != null) {
    isolate.resume(pc);
  }
}

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