// 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.

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

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

void main() {
  asyncStart();
  var completer = new Completer(); // Completed by first reply from isolate.
  RawReceivePort reply = new RawReceivePort(completer.complete);
  Isolate.spawn(isomain1, reply.sendPort).then((Isolate isolate) {
    completer.future.then((_echoPort) {
      SendPort echoPort = _echoPort;
      List result = [];
      reply.handler = (v) {
        result.add(v);
        if (v == 2) {
          isolate.kill(priority: Isolate.immediate);
        }
        echoPort.send(v - 1);
      };
      late RawReceivePort exitSignal;
      exitSignal = new RawReceivePort((_) {
        Expect.listEquals([4, 3, 2], result);
        exitSignal.close();
        reply.close();
        asyncEnd();
      });
      isolate.addOnExitListener(exitSignal.sendPort);
      echoPort.send(4);
    });
  });
}
