// Copyright (c) 2011, 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 without spawning
// isolates.

// ---------------------------------------------------------------------------
// Serialization test.
// ---------------------------------------------------------------------------
library SerializationTest;
import 'dart:isolate';

main() {
  // TODO(sigmund): fix once we can disable privacy for testing (bug #1882)
  testAllTypes(TestingOnly.copy);
  testAllTypes(TestingOnly.serialize);
}

void testAllTypes(Function f) {
  copyAndVerify(0, f);
  copyAndVerify(499, f);
  copyAndVerify(true, f);
  copyAndVerify(false, f);
  copyAndVerify("", f);
  copyAndVerify("foo", f);
  copyAndVerify([], f);
  copyAndVerify([1, 2], f);
  copyAndVerify([[]], f);
  copyAndVerify([1, []], f);
  copyAndVerify({}, f);
  copyAndVerify({ 'a': 3 }, f);
  copyAndVerify({ 'a': 3, 'b': 5, 'c': 8 }, f);
  copyAndVerify({ 'a': [1, 2] }, f);
  copyAndVerify({ 'b': { 'c' : 99 } }, f);
  copyAndVerify([ { 'a': 499 }, { 'b': 42 } ], f);

  var port = new ReceivePort();
  Expect.throws(() => f(port));
  port.close();

  var a = [ 1, 3, 5 ];
  var b = { 'b': 49 };
  var c = [ a, b, a, b, a ];
  var copied = f(c);
  verify(c, copied);
  Expect.isFalse(identical(c, copied));
  Expect.identical(copied[0], copied[2]);
  Expect.identical(copied[0], copied[4]);
  Expect.identical(copied[1], copied[3]);
}

void copyAndVerify(o, Function f) {
  var copy = f(o);
  verify(o, copy);
}

void verify(o, copy) {
  if ((o is bool) || (o is num) || (o is String)) {
    Expect.equals(o, copy);
  } else if (o is List) {
    Expect.isTrue(copy is List);
    Expect.equals(o.length, copy.length);
    for (int i = 0; i < o.length; i++) {
      verify(o[i], copy[i]);
    }
  } else if (o is Map) {
    Expect.isTrue(copy is Map);
    Expect.equals(o.length, copy.length);
    o.forEach((key, value) {
      Expect.isTrue(copy.containsKey(key));
      verify(value, copy[key]);
    });
  } else {
    Expect.fail("Unexpected object encountered");
  }
}
