// 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:isolate';
import "package:expect/expect.dart";
import 'package:async_helper/async_helper.dart';

class FromMainIsolate {
  String toString() => 'from main isolate';
  int get fld => 10;
}

funcChild(args) {
  var reply = args[1];
  var obj = args[0];
  Expect.isTrue(obj is FromMainIsolate);
  Expect.equals(10, obj.fld);
  reply.send(new FromMainIsolate());
}

main() {
  var receive1 = new ReceivePort();
  var receive2 = new ReceivePort();

  // First spawn an isolate using spawnURI and have it
  // send back a "non-literal" like object.
  asyncStart();
  Isolate.spawnUri(Uri.parse('issue_21398_child_isolate.dart'), [],
      [new FromMainIsolate(), receive1.sendPort]).catchError((error) {
    Expect.isTrue(error is ArgumentError);
    asyncEnd();
  });
  asyncStart();
  Isolate
      .spawnUri(
          Uri.parse('issue_21398_child_isolate.dart'), [], receive1.sendPort)
      .then((isolate) {
    receive1.listen((msg) {
      Expect.stringEquals(msg, "Invalid Argument(s).");
      receive1.close();
      asyncEnd();
    }, onError: (e) => print('$e'));
  });

  // Now spawn an isolate using spawnFunction and send it a "non-literal"
  // like object and also have the child isolate send back a "non-literal"
  // like object.
  asyncStart();
  Isolate.spawn(funcChild, [new FromMainIsolate(), receive2.sendPort]).then(
      (isolate) {
    receive2.listen((msg) {
      Expect.isTrue(msg is FromMainIsolate);
      Expect.equals(10, msg.fld);
      receive2.close();
      asyncEnd();
    }, onError: (e) => print('$e'));
  });
}
