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

// Tests that map literals are ordered.

class OrderedMapsTest {
  static testMain() {
    testMaps(const { "a": 1, "c": 2 }, const { "c": 2, "a": 1}, true);
    testMaps({ "a": 1, "c": 2 }, { "c": 2, "a": 1 }, false);
  }

  static void testMaps(map1, map2, bool isConst) {
    Expect.equals(true, map1 !== map2);

    var keys = map1.getKeys();
    Expect.equals(2, keys.length);
    Expect.equals("a", keys[0]);
    Expect.equals("c", keys[1]);

    keys = map2.getKeys();
    Expect.equals(2, keys.length);
    Expect.equals("c", keys[0]);
    Expect.equals("a", keys[1]);

    var values = map1.getValues();
    Expect.equals(2, values.length);
    Expect.equals(1, values[0]);
    Expect.equals(2, values[1]);

    values = map2.getValues();
    Expect.equals(2, values.length);
    Expect.equals(2, values[0]);
    Expect.equals(1, values[1]);

    if (isConst) return;

    map1["b"] = 3;
    map2["b"] = 3;

    keys = map1.getKeys();
    Expect.equals(3, keys.length);
    Expect.equals("a", keys[0]);
    Expect.equals("c", keys[1]);
    Expect.equals("b", keys[2]);

    keys = map2.getKeys();
    Expect.equals(3, keys.length);
    Expect.equals("c", keys[0]);
    Expect.equals("a", keys[1]);
    Expect.equals("b", keys[2]);

    values = map1.getValues();
    Expect.equals(3, values.length);
    Expect.equals(1, values[0]);
    Expect.equals(2, values[1]);
    Expect.equals(3, values[2]);

    values = map2.getValues();
    Expect.equals(3, values.length);
    Expect.equals(2, values[0]);
    Expect.equals(1, values[1]);
    Expect.equals(3, values[2]);

    map1["a"] = 4;
    keys = map1.getKeys();
    Expect.equals(3, keys.length);
    Expect.equals("a", keys[0]);

    values = map1.getValues();
    Expect.equals(3, values.length);
    Expect.equals(4, values[0]);
  }
}

main() {
  OrderedMapsTest.testMain();
}
