// Copyright (c) 2011-2017, 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 An unforgeable object that comes back as equal when passed through
/// other isolates.
///    Sending a capability object to another isolate, and getting it back, will
/// produce an object that is equal to the original. There is no other way to
/// create objects equal to a capability object.
///
/// @description Checks hashCode and equality operator of Capability, that is
/// sent from another isolate.
///
/// @author a.semenov@unipro.ru

import "dart:isolate";
import "dart:async";
import "../../../Utils/expect.dart";
import "../../core/Object/allTests.lib.dart" as object;

void entryPoint(SendPort sendPort) {
  Capability capability0 = new Capability();
  // first tree are equal
  sendPort.send(capability0);
  sendPort.send(capability0);
  sendPort.send(capability0);
  // next three are not equal
  for (int i = 0; i < 3; i++) {
    sendPort.send(new Capability());
  }
  // last is a control port, used to stop the isolate and close all ports
  ReceivePort controlPort = new ReceivePort();
  controlPort.listen((_) {
    controlPort.close();
  });
  sendPort.send(controlPort.sendPort);
}

Future test() async {
  ReceivePort receivePort = new ReceivePort();
  Isolate.spawn(entryPoint, receivePort.sendPort);
  List cp = await receivePort.take(7).toList();
  List<Object> capabilities = new List.from(cp);

  Object create() => capabilities[0];

  List<Object> createEqual(int number) {
    Expect.isTrue(number < 4);
    return capabilities.sublist(0, number);
  }

  List<Object> createNotEqual(int number) {
    Expect.isTrue(number < 4);
    return capabilities.sublist(3, 3 + number);
  }

  // execute tests
  object.test(create, createEqual, createNotEqual);
  // clean up
  (capabilities.last as SendPort).send("finish");
  asyncEnd();
}

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