// 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)})
/// ...
/// If [equals] is provided, it is used to compare the keys in the table with new
/// keys. If [equals] is omitted, the key's own [Object.operator==] is used
/// instead. Similar, if [hashCode] is provided, it is used to produce a hash
/// alue for keys in order to place them in the hash table. If it is omitted, the
/// key's own [Object.hashCode] is used.
/// @description Checks that if both [equals] and [hashCode] are provided, they
/// are used to compare the keys and produce hash values.
/// @author sgrekhov@unipro.ru

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

bool myEquals(var key1, var key2) =>
    key1 > 0 && key2 > 0 || key1 <= 0 && key2 <= 0;
int myHashCode(var key) => key > 0 ? 1 : -1;

check(LinkedHashMap map, List keysExpected, List valuesExpected) {
  Expect.equals(keysExpected.length, map.keys.length);
  Expect.equals(valuesExpected.length, map.values.length);
  int i = 0;
  for(var k in map.keys) {
    Expect.equals(keysExpected[i++], k);
  }
  i = 0;
  for(var v in map.values) {
    Expect.equals(valuesExpected[i++], v);
  }
}

main() {
  LinkedHashMap map = new LinkedHashMap(equals: myEquals, hashCode: myHashCode);
  map[1] = 11;
  map[2] = 22;
  map[3] = 33;
  check(map, [1], [33]);

  map[2] = 55;
  check(map, [1], [55]);

  map[-2] = 100;
  check(map, [1, -2], [55, 100]);

  map[-20] = 200;
  check(map, [1, -2], [55, 200]);

  map.remove(10);
  map[15] = 66;
  check(map, [-2, 15], [200, 66]);
}
