// 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 terminateCapability
///    read-only
///    Capability granting the ability to terminate the isolate.
///    This capability is used by kill and setErrorsFatal. If the capability
/// is not the correct termination capability of the isolate, including
/// if the capability is null, then calls to those methods will have no effect.
///
/// @description Check that if terminateCapability is null, calls to kill()
/// have no effect.
///
/// @author a.semenov@unipro.ru

import "dart:isolate";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

test() async {
  ReceivePort receivePort = new ReceivePort();
  EchoServer server = await EchoServer.spawn(receivePort.sendPort);
  Isolate isolate = new Isolate(server.isolate.controlPort,
                                  pauseCapability:null,
                                  terminateCapability:null);
  Expect.equals("hello", await server.ping("hello"));
  isolate.kill();
  Expect.equals("alive1", await ping(isolate, "alive1"));
  isolate.kill(priority:Isolate.immediate);
  Expect.equals("alive2", await ping(isolate, "alive2"));
  isolate.kill(priority:Isolate.beforeNextEvent);
  Expect.equals("alive3", await ping(isolate, "alive3"));

  // clean up
  await server.stop();
  receivePort.close();
  asyncEnd();
}

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