// 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 test program for testing that isolates can communicate to isolates
// other than the main isolate.

library CrossIsolateMessageTest;
import 'dart:isolate';
import 'package:unittest/unittest.dart';
import "remote_unittest_helper.dart";

/*
 * Everything starts in the main-isolate (in the main-method).
 * The main isolate spawns two isolates: isolate1 (with entry point
 * 'crossIsolate1') and isolate2 (with entry point 'crossIsolate2').
 *
 * The main isolate creates two isolates, isolate1 and isolate2.
 * The second isolate is created with a send-port being listened on by
 * isolate1. A message is passed along this from isolate2 to isolate1.
 * Isolate1 then sends the result back to the main isolate for final checking.
 */

void crossIsolate1(SendPort mainIsolate) {
  ReceivePort local = new ReceivePort();
  mainIsolate.send(["ready1", local.sendPort]);
  local.first.then((msg) {
    // Message from crossIsolate2
    expect(msg[0], "fromIsolate2");
    mainIsolate.send(["fromIsolate1", msg[1] + 58]);  // 100.
  });
}

void crossIsolate2(SendPort toIsolate1) {
  toIsolate1.send(["fromIsolate2", 42]);
}

void main([args, port]) {
  if (testRemote(main, port)) return;
  test("send message cross isolates ", () {
    ReceivePort fromIsolate1 = new ReceivePort();
    Isolate.spawn(crossIsolate1, fromIsolate1.sendPort);
    var done = expectAsync0((){});
    fromIsolate1.listen((msg) {
      switch (msg[0]) {
        case "ready1":
          SendPort toIsolate1 = msg[1];
          Isolate.spawn(crossIsolate2, toIsolate1);
          break;
        case "fromIsolate1":
          expect(msg[1], 100);
          fromIsolate1.close();
          break;
        default:
          fail("unreachable! Tag: ${msg[0]}");
      }
    }, onDone: done);
  });
}
