// 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) })
/// If using methods like [operator[]], [remove] and [containsKey] together with
/// a custom equality and hashcode, an extra [isValidKey] function can be
/// supplied.
/// This function is called before calling [equals] or [hashCode] with an
/// argument that may not be a [K] instance, and if the call returns [false], the
/// key is assumed to not be in the set.
/// @description Checks that when performing [], [remove] or [containsKey],
/// [isValidKey] is called before [equals] and [hashCode] functions, and if
/// [isValidKey] return [false], equals and [hashCode] are not called at all.
/// @author iarkh@unipro.ru

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

String sequence = "";

bool equals(dynamic key1, dynamic key2) {
  sequence = sequence + "e";
  return key1 == key2;
}

int hashCode(dynamic key) {
  sequence = sequence + "h";
  return key;
}

bool isValidKey(Object? key) {
  sequence = sequence + "i";
  return key is int && key > 0;
}

main() {
  HashMap map = new HashMap(
      equals: equals, hashCode: hashCode, isValidKey : isValidKey);
  map.addAll({1 : 1, 3: 3, 9 : 9});

  sequence = "";
  Expect.isFalse(map.containsKey(-3));
  Expect.equals(null, map[-7]);
  map.remove(-15);
  Expect.isTrue(sequence.contains("i"));
  Expect.isFalse(sequence.contains("e"));
  Expect.isFalse(sequence.contains("h"));

  sequence = "";
  Expect.isTrue(map.containsKey(3));
  Expect.isTrue(sequence.startsWith("i"));

  sequence = "";
  Expect.equals(3, map[3]);
  Expect.isTrue(sequence.startsWith("i"));

  sequence = "";
  map.remove(9);
  Expect.isTrue(sequence.startsWith("i"));
}
