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

// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
// VMOptions=--no-enable-isolate-groups
// Dart test program for testing isolate communication with
// typed objects.

library TypedMessageTest;

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

void logMessages(SendPort replyTo) {
  print("Starting log server.");
  ReceivePort port = new ReceivePort();
  replyTo.send(port.sendPort);
  port.first.then((_message) {
    List<int> message = _message;
    print("Log $message");
    Expect.equals(5, message.length);
    Expect.equals(0, message[0]);
    Expect.equals(1, message[1]);
    Expect.equals(2, message[2]);
    Expect.equals(3, message[3]);
    Expect.equals(4, message[4]);
    port.close();
    replyTo.send(1);
    print("Stopping log server.");
  });
}

main() {
  asyncStart();
  ReceivePort receivePort = new ReceivePort();
  Future<Isolate> remote = Isolate.spawn(logMessages, receivePort.sendPort);
  var msg = <int>[0, 1, 2, 3, 4];
  StreamIterator iterator = new StreamIterator(receivePort);
  iterator.moveNext().then((b) {
    SendPort sendPort = iterator.current;
    sendPort.send(msg);
    return iterator.moveNext();
  }).then((b) {
    Expect.equals(1, iterator.current);
    receivePort.close();
    asyncEnd();
  });
}
