// 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 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()]);
}
