// Copyright (c) 2011-2016, 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  abstract void send(message)
 *    Sends an asynchronous message through this send port, to its corresponding
 * ReceivePort.
 *    The content of message can be: primitive values (null, num, bool, double,
 * String), instances of SendPort, and lists and maps whose elements are any
 * of these. List and maps are also allowed to be cyclic.
 *
 * @description Checks that cyclic lists are sent properly.
 *
 * @author iefremov
 */

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

void iMain(List data) {
  SendPort replyPort=data[0];
  var message=data[1];
  replyPort.send(message);
}

void main() {
  List cyclicList = [];
  cyclicList.add(cyclicList);
  (cyclicList[0] as List).add(cyclicList);

  List<Object?> cyclicList2 = [1, 2, 3, null];
  cyclicList2.add(cyclicList);
  cyclicList2.add(cyclicList2);

  var receivePort = new ReceivePort();
  asyncStart();
  Isolate.spawn(iMain, [receivePort.sendPort, cyclicList2]);

  receivePort.listen((message) {
    Expect.equals(cyclicList2[0], message[0]);
    Expect.equals(cyclicList2[1], message[1]);
    Expect.equals(cyclicList2[2], message[2]);
    Expect.equals(cyclicList2[3], message[3]);

    Expect.identical(message[4], message[4][0]);
    Expect.identical(message[4], message[4][0][0]);

    Expect.equals(cyclicList2[0], message[5][0]);
    Expect.equals(cyclicList2[1], message[5][1]);
    Expect.equals(cyclicList2[2], message[5][2]);
    Expect.equals(cyclicList2[3], message[5][3]);
    Expect.identical(message[5], message[5][5]);
    receivePort.close();
    asyncEnd();
  });
}
