// 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

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'));
  });
}
