blob: 620b2255d3405a7d53dbae9bf3a6b430f4b9125c [file] [log] [blame]
// 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"));
}