// Copyright (c) 2011-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 Future<Isolate> spawnUri(Uri uri,
///                                     List<String> args,
///                                     message,
///                                     { bool paused: false,
///                                       SendPort onExit,
///                                       SendPort onError,
///                                       bool errorsAreFatal,
///                                       bool checked,
///                                       Map<String, String> environment,
///                                       Uri packageRoot,
///                                       Uri packageConfig,
///                                       bool automaticPackageResolution: false
///                                     }
///                                    )
///     Creates and spawns an isolate that runs the code from the library with
///  the specified URI.
///  ...
///  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)
/// and is able to send and receive events
///
/// @author a.semenov@unipro.ru

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

test() async {
  bool paused = true;
  ReceivePort receivePort = new ReceivePort();
  receivePort.listen(
      (data) {
        Expect.isFalse(paused, "Isolate should not be in paused state");
        if (data is SendPort) {
          data.send("hello");
        } else {
          Expect.equals("hello", data);
          asyncEnd();
          receivePort.close();
        }
      }
  );
  Isolate isolate = await Isolate.spawnUri(
                              new Uri.file("spawnUri_A04_t04_isolate.dart"),
                              [],
                              receivePort.sendPort,
                              paused: true);
  await new Future.delayed(ONE_SECOND);
  paused = false;
  var pc = isolate.pauseCapability;
  if (pc != null) {
    isolate.resume(pc);
  }
}

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