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

import 'dart:collection';
import 'dart:isolate';

import "package:expect/expect.dart";

main() {
  // First spawn an isolate using spawnURI and have it
  // send back a "literal" like list object.
  var receive1 = new ReceivePort();
  Isolate
      .spawnUri(
          Uri.parse('issue_24243_child1_isolate.dart'), [], receive1.sendPort)
      .then((isolate) {
    receive1.listen((msg) {
      var list0 = <int>[1, 2, 3];
      var list1 = <int>[4, 5, 6];
      var list2 = <int>[7, 8, 9];
      Expect.isTrue(msg is List<List<int>>);
      Expect.listEquals(msg[0], list0);
      Expect.listEquals(msg[1], list1);
      Expect.listEquals(msg[2], list2);
      Expect.throws(() => msg[0] = "throw an exception");
      receive1.close();
    }, onError: (e) => print('$e'));
  });

  // Now spawn an isolate using spawnURI and have it
  // send back a "literal" like map object.
  var receive2 = new ReceivePort();
  Isolate
      .spawnUri(
          Uri.parse('issue_24243_child2_isolate.dart'), [], receive2.sendPort)
      .then((isolate) {
    receive2.listen((msg) {
      var map0 = <int, String>{1: 'one', 2: 'two', 3: 'three'};
      var map1 = <int, String>{4: 'four', 5: 'five', 6: 'six'};
      var map2 = <int, String>{7: 'seven', 8: 'eight', 9: 'nine'};
      Expect.isTrue(msg is Map<int, Map<int, String>>);
      Expect.mapEquals(msg[0], map0);
      Expect.mapEquals(msg[1], map1);
      Expect.mapEquals(msg[2], map2);
      Expect.throws(() => msg[0] = "throw an exception");
      receive2.close();
    }, onError: (e) => print('$e'));
  });

  // Now spawn an isolate using spawnURI and have it
  // send back a "literal" like LinkedHashMap object.
  var receive3 = new ReceivePort();
  Isolate
      .spawnUri(
          Uri.parse('issue_24243_child3_isolate.dart'), [], receive3.sendPort)
      .then((isolate) {
    receive3.listen((msg) {
      var map0 = new LinkedHashMap<int, String>();
      map0[1] = 'one';
      map0[2] = 'two';
      map0[3] = 'three';
      var map1 = new LinkedHashMap<int, String>();
      map1[4] = 'four';
      map1[5] = 'five';
      map1[6] = 'size';
      var map2 = new LinkedHashMap<int, String>();
      map2[7] = 'seven';
      map2[8] = 'eight';
      map2[9] = 'nine';
      Expect.isTrue(msg is Map<int, LinkedHashMap<int, String>>);
      Expect.mapEquals(msg[0], map0);
      Expect.mapEquals(msg[1], map1);
      Expect.mapEquals(msg[2], map2);
      Expect.throws(() => msg[0] = "throw an exception");
      receive3.close();
    }, onError: (e) => print('$e'));
  });
}
