// Copyright (c) 2016, 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.

/// @assertion LinkedHashMap({bool equals(K key1, K key2), int hashCode(K key),
/// bool isValidKey(potentialKey)})
/// Creates an insertion-ordered hash-table based [Map].
/// @description Checks that [inkedHashMap] preserves insertion order if [addAll]
/// is used to add elements to the map.
/// @author sgrekhov@unipro.ru

import "../../../Utils/expect.dart";
import "dart:collection";

checkOrder(Map map, List keyOrder, List valuesOrder) {
  int idx = 0;
  for(var k in map.keys) {
    Expect.equals(keyOrder[idx++], k);
  }
  
  idx = 0;
  for(var v in map.values) {
    Expect.equals(valuesOrder[idx++], v);
  }
}

main() {
  LinkedHashMap map = new LinkedHashMap();
  map["1"] = 1;
  map["2"] = 2;
  map["3"] = 3;
  checkOrder(map, ["1", "2", "3"], [1, 2, 3]);

  map.addAll(new LinkedHashMap.fromIterables(["4", "5", "6"], [4, 5, 6]));
  checkOrder(map, ["1", "2", "3", "4", "5", "6"], [1, 2, 3, 4, 5, 6]);

  map.addAll(new LinkedHashMap.fromIterables(["1", "2", "3"], [11, 22, 33]));
  checkOrder(map, ["1", "2", "3", "4", "5", "6"], [11, 22, 33, 4, 5, 6]);

  map.addAll(new LinkedHashMap.fromIterables(["1", "2", "0"], [1, 2, 0]));
  checkOrder(map, ["1", "2", "3", "4", "5", "6", "0"], [1, 2, 33, 4, 5, 6, 0]);
}
