// 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 = 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 LinkedHashMap preserves insertion order.
/// @author msyabro

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["2"] = 5;
  checkOrder(map, ["1", "2", "3"], [1, 5, 3]);

  map.remove("2");
  map["2"] = 10;
  checkOrder(map, ["1", "3", "2"], [1, 3, 10]);

  map.remove("3");
  checkOrder(map, ["1", "2"], [1, 10]);

  map["4"] = 4;
  checkOrder(map, ["1", "2", "4"], [1, 10, 4]);
}
