// Copyright (c) 2014, 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.

// @dart = 2.9

import "dart:isolate";
import "dart:async";
import "package:async_helper/async_helper.dart";

isomain1(replyPort) {
  RawReceivePort port = new RawReceivePort();
  port.handler = (v) {
    replyPort.send(v);
    port.close();
  };
  replyPort.send(port.sendPort);
}

main() {
  asyncStart();
  RawReceivePort reply = new RawReceivePort();
  Isolate isolate;
  Capability resume;
  var completer = new Completer(); // Completed by first reply from isolate.
  reply.handler = completer.complete;
  Isolate.spawn(isomain1, reply.sendPort).then((Isolate iso) {
    isolate = iso;
    return completer.future;
  }).then((echoPort) {
    // Isolate has been created, and first response has been returned.
    resume = isolate.pause();
    echoPort.send(24);
    reply.handler = (v) {
      throw "RESPONSE WHILE PAUSED?!?";
    };
    return new Future.delayed(const Duration(milliseconds: 250));
  }).then((_) {
    reply.handler = (v) {
      if (v != 24) throw "WRONG ANSWER!";
      reply.close();
      asyncEnd();
    };
    isolate.resume(resume);
  });
}
