// 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.

// @dart = 2.9

/// @assertion interface HashSet<E>
/// HashSet({bool equals(E e1, E e2), int hashCode(E e),
/// bool isValidKey(potentialKey) })
/// If the [equals] or [hashCode] methods won't work on all objects, but only on
/// some instances of [E], the [isValidKey] predicate can be used to restrict the
/// keys that the functions are applied to. Any key for which [isValidKey]
/// returns [false] is automatically assumed to not be in the set when asking
/// contains.
/// @description Checks that if [isValidKey] returns [false] given key is assumed
/// not to be in the set and so [equals] and [hashCode] methods are not called.
/// @author iarkh@unipro.ru

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

int i = 0;

bool equals(Object key1, Object key2) {
  i++;
  return key1 == key2;
}

int hashCode (Object e) {
  i++;
  return e.hashCode;
}

check(HashSet set, List list1, List list2) {
  i = 0;
  list1.forEach((element) => Expect.isTrue(set.contains(element)));
  list2.forEach((element) => Expect.isFalse(set.contains(element)));
  Expect.equals(0, i);
}

main() {
  HashSet set = new HashSet(
    equals: (Object key1, Object key2) => key1 == key2,
    hashCode: (e) => e.hashCode,
    isValidKey: (Object key) => key is int && key >= 0);

  set.addAll([0, 1, -3, "abcd", 15, 38, new Error()]);
  check(set, [0, 1, 15, 38], [-3, null, "abcd", new Error()]);

  set.remove("abcd");
  check(set, [0, 1, 15, 38], [-3, null, "abcd", new Error()]);

  set.remove(1);
  check(set, [0, 15, 38], [1, -3, null, "abcd", new Error()]);
}
