// 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 void resume(
///                    Capability resumeCapability
///                    )
///    Resumes a paused isolate.
///    Sends a message to an isolate requesting that it ends a pause that was
/// requested using the resumeCapability.
///    When all active pause requests have been cancelled, the isolate will
/// continue processing events and handling normal messages.
///
/// @description Check that isolate continue processing events only after
/// all pause requests are canceled by call to resume()
///
/// @author a.semenov@unipro.ru

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

Duration _500MS = new Duration(milliseconds: 500);

Future test(List<int> resumePermutation) async {
  ReceivePort receivePort = new ReceivePort();
  EchoServer server = await EchoServer.spawn(receivePort.sendPort);

  Expect.equals("hello", await server.ping("hello"));

  List<Capability> resumeCapability = [];
  resumeCapability.add(server.isolate.pause());
  Expect.equals("timeout", await server.ping("paused0", _500MS, "timeout"));

  for (int i = 1; i < resumePermutation.length; i++) {
    resumeCapability.add(server.isolate.pause(new Capability()));
    Expect.equals("timeout", await server.ping("paused$i", _500MS, "timeout"));
  }

  int i = 0;
  while (i < resumePermutation.length - 1) {
    server.isolate.resume(resumeCapability[resumePermutation[i]]);
    Expect.equals("timeout", await server.ping("resume$i", _500MS, "timeout"));
    i++;
  }
  server.isolate.resume(resumeCapability[resumePermutation[i]]);
  Expect.equals("resume", await server.ping("resume", _500MS, "timeout"));

  Expect.equals("server", await server.ping("server"));

  await server.stop();
  receivePort.close();
}

main() {
  asyncStart();
  Future.wait([
    test([0, 1, 2, 3, 4]),
    test([4, 3, 2, 1, 0]),
    test([3, 2, 0, 1, 4]),
    test([2, 0, 3, 4, 1])
  ]).then((_) => asyncEnd());
}
