| /* |
| * 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")); |
| } |