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

// VMOptions=--enable-isolate-groups --experimental-enable-isolate-groups-jit
// 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();
