// 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 HashMap({bool equals(K key1, K key2), int hashCode(K key),
/// bool isValidKey(potentialKey) })
/// The [isValidKey] function defaults to just testing if the object is a [K]
/// instance.
/// @description Checks that default [isValidKey] function checks if the object
/// is a [K] instance. This means that [equals] and [hashCode] functions are
/// never called when trying to call [containsKey] or [remove] for unsupported
/// keys.
/// @author iarkh@unipro.ru

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

int i = 0;
bool equals(dynamic key1, dynamic key2) {
  i++;
  return key1 == key2;
}

int hashCode(dynamic key) {
  i++;
  return key;
}

main() {
  HashMap<int, int> map =
      new HashMap<int, int>(equals: equals, hashCode: hashCode);
  map.addAll({0: 0, 1: 0, 2: 12, -3: 0, -4: 0});

  i = 0;
  bool j = map.containsKey(null);
  Expect.equals(0, i);
  j = map.containsKey("string");
  Expect.equals(0, i);
  int? k = map["abcd"];
  Expect.equals(0, i);
  map.remove([]);
  Expect.equals(0, i);
}
