// 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 isolate communication with
// complex messages.

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

void main([args, port]) {
  if (testRemote(main, port)) return;
  test("complex messages are serialized correctly", () {
    ReceivePort local = new ReceivePort();
    Isolate.spawn(logMessages, local.sendPort);
    var done = expectAsync0((){});
    local.listen(expectAsync1((msg) {
      switch (msg[0]) {
        case "init":
          var remote = msg[1];
          remote.send(1);
          remote.send("Hello");
          remote.send("World");
          remote.send(const [null, 1, 2, 3, 4]);
          remote.send(const [1, 2.0, true, false, 0xffffffffff]);
          remote.send(const ["Hello", "World", 0xffffffffff]);
          // Shutdown the LogRunner.
          remote.send(-1);
          break;
        case "done":
          local.close();
          expect(msg[1], 6);
          done();
      }
    }, count: 2));
  });
}


void logMessages(mainPort) {
  int count = 0;
  ReceivePort port = new ReceivePort();
  mainPort.send(["init", port.sendPort]);
  port.listen((var message) {
    if (message == -1) {
      port.close();
      mainPort.send(["done", count]);
    } else {
      switch (count) {
        case 0:
          expect(message, 1);
          break;
        case 1:
          expect(message, "Hello");
          break;
        case 2:
          expect(message, "World");
          break;
        case 3:
          expect(message.length, 5);
          expect(message[0], null);
          expect(message[1], 1);
          expect(message[2], 2);
          expect(message[3], 3);
          expect(message[4], 4);
          break;
        case 4:
          expect(message.length, 5);
          expect(message[0], 1);
          expect(message[1], 2.0);
          expect(message[2], true);
          expect(message[3], false);
          expect(message[4], 0xffffffffff);
          break;
        case 5:
          expect(message.length, 3);
          expect(message[0], "Hello");
          expect(message[1], "World");
          expect(message[2], 0xffffffffff);
          break;
      }
      count++;
    }
  });
}
