/*
 * 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
 * ])
 * ...
 *   If resumeCapability is provided, it is used to identity the pause, and
 * must be used again to end the pause using resume. Otherwise a new resume
 * capability is created and returned.
 *
 * @description Check that pause(null) creates and returns new resume
 * capability.
 *
 * @author a.semenov@unipro.ru
 */
import "dart:isolate";
import "IsolateUtil.dart";
import "../../../Utils/expect.dart";

test() async {
  ErrorServer server = await ErrorServer.spawn();
  Capability resumeCapability = server.isolate.pause(null);
  Expect.isNotNull(resumeCapability);
  server.isolate.resume(resumeCapability);
  await server.stop();
  asyncEnd();
}

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