// Copyright (c) 2011, 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 final SendPort sendPort
/// Returns a SendPort that sends to this raw receive port.
///
/// @description Checks that same SendPort instance can be used by different
/// isolates.
///
/// @author a.semenov@unipro.ru

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

const int ISOLATE_COUNT = 10;
const int SEND_COUNT = 10;
const int TOTAL_COUNT = ISOLATE_COUNT * SEND_COUNT;

void entryPoint(SendPort sendPort) {
  for (int i = 0; i < SEND_COUNT; i++) {
    sendPort.send(i);
  }
}

main() {
  asyncStart();
  RawReceivePort? receivePort;

  List receivedData = [];
  void receiveHandler(event) {
    receivedData.add(event);
    if (receivedData.length == TOTAL_COUNT) {
      receivePort?.close();
      // check the data
      receivedData.sort();
      List<int> expectedData =
          new List<int>.generate(TOTAL_COUNT, (i) => i ~/ ISOLATE_COUNT);
      Expect.listEquals(expectedData, receivedData);
      asyncEnd();
    }
  }

  receivePort = new RawReceivePort(receiveHandler);

  SendPort sendPort = receivePort.sendPort;
  for (int i = 0; i < ISOLATE_COUNT; i++) {
    Isolate.spawn(entryPoint, sendPort);
  }
}
