// 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 Tests whether [other] is a SendPort 
/// pointing to the same ReceivePort as this one.
///
/// @description Checks SendPort instance sent to another isolate and received
/// back is equal to itself, because it implements Capability
///
/// @author a.semenov@unipro.ru

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

void entryPoint(List<SendPort> sendPort) {
  ReceivePort receivePort = new ReceivePort();
  receivePort.listen((data) {
      sendPort[1].send(data);
      receivePort.close();
  });
  sendPort[0].send(receivePort.sendPort);
}

Future test() async {
  List<ReceivePort> receivePort = new List.generate(2, (_)=> new ReceivePort());
  Isolate isolate = await Isolate.spawn(entryPoint,
                            [receivePort[0].sendPort, receivePort[1].sendPort]);
  SendPort sendPort = await receivePort[0].first;

  ReceivePort testPort = new ReceivePort();
  SendPort testSendPort0 = testPort.sendPort;
  sendPort.send(testSendPort0);
  SendPort testSendPort1 = await receivePort[1].first;

  Expect.isTrue(testSendPort0 == testSendPort1);

  receivePort.forEach((p) => p.close());
  testPort.close();
  asyncEnd();
}

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