// 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 serialization of messages.
// VMOptions=--enable_type_checks --enable_asserts

library Message2Test;
import 'dart:isolate';
import '../../pkg/unittest/lib/unittest.dart';

// ---------------------------------------------------------------------------
// Message passing test 2.
// ---------------------------------------------------------------------------

class MessageTest {
  static void mapEqualsDeep(Map expected, Map actual) {
    expect(expected, isMap);
    expect(actual, isMap);
    expect(actual.length, expected.length);
    testForEachMap(key, value) {
      if (value is List) {
        listEqualsDeep(value, actual[key]);
      } else {
        expect(actual[key], value);
      }
    }
    expected.forEach(testForEachMap);
  }

  static void listEqualsDeep(List expected, List actual) {
    for (int i = 0; i < expected.length; i++) {
      if (expected[i] is List) {
        listEqualsDeep(expected[i], actual[i]);
      } else if (expected[i] is Map) {
        mapEqualsDeep(expected[i], actual[i]);
      } else {
        expect(actual[i], expected[i]);
      }
    }
  }
}

void pingPong(replyPort) {
  ReceivePort port = new ReceivePort();
  port.listen((message) {
    if (message == null) {
      port.close();
    } else {
      // Bounce the received object back so that the sender
      // can make sure that the object matches.
      message[1].send(message[0]);
    }
  });
  replyPort.send(port.sendPort);
}

main() {
  test("map is equal after it is sent back and forth", () {
    ReceivePort port = new ReceivePort();
    Isolate.spawn(pingPong, port.sendPort);
    port.first.then(expectAsync1((remote) {
      Map m = new Map();
      m[1] = "eins";
      m[2] = "deux";
      m[3] = "tre";
      m[4] = "four";
      ReceivePort replyPort = new ReceivePort();
      remote.send([m, replyPort.sendPort]);
      replyPort.first.then(expectAsync1((var received) {
        MessageTest.mapEqualsDeep(m, received);
        remote.send(null);
      }));
    }));
  });
}
