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

// @dart = 2.9

/// @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]);
}
