// Copyright (c) 2012, 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
// VMOptions=--no-enable-isolate-groups

// spawns multiple isolates and sends unresolved ports between them.
library unresolved_ports;

import 'dart:async';
import 'dart:isolate';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';

// This test does the following:
//  - main spawns two isolates: 'tim' and 'beth'
//  - 'tim' spawns an isolate: 'bob'
//  - main starts a message chain:
//       main -> beth -> tim -> bob -> main
//    by giving 'beth' a send-port to 'tim'.

bethIsolate(init) {
  ReceivePort port = initIsolate(init);
  // TODO(sigmund): use expectAsync when it is OK to use it within an isolate
  // (issue #6856)
  port.first.then((msg) => msg[1]
      .send(['${msg[0]}\nBeth says: Tim are you coming? And Bob?', msg[2]]));
}

timIsolate(init) {
  ReceivePort port = initIsolate(init);
  spawnFunction(bobIsolate).then((bob) {
    port.first.then((msg) => bob.send([
          '${msg[0]}\nTim says: Can you tell "main" that we are all coming?',
          msg[1]
        ]));
  });
}

bobIsolate(init) {
  ReceivePort port = initIsolate(init);
  port.first
      .then((msg) => msg[1].send('${msg[0]}\nBob says: we are all coming!'));
}

Future spawnFunction(function) {
  ReceivePort init = new ReceivePort();
  Isolate.spawn(function, init.sendPort);
  return init.first;
}

ReceivePort initIsolate(SendPort starter) {
  ReceivePort port = new ReceivePort();
  starter.send(port.sendPort);
  return port;
}

baseTest({bool failForNegativeTest: false}) {
  // Message chain with unresolved ports
  ReceivePort port = new ReceivePort();
  asyncStart();
  port.listen((msg) {
    Expect.equals(
        msg,
        'main says: Beth, find out if Tim is coming.'
        '\nBeth says: Tim are you coming? And Bob?'
        '\nTim says: Can you tell "main" that we are all coming?'
        '\nBob says: we are all coming!');
    Expect.isFalse(failForNegativeTest);
    port.close();
    asyncEnd();
  });

  spawnFunction(timIsolate).then((tim) {
    spawnFunction(bethIsolate).then((beth) {
      beth.send(
          ['main says: Beth, find out if Tim is coming.', tim, port.sendPort]);
    });
  });
}

void main([args, port]) => baseTest();
