// 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 [isValidKey] is omitted, it defaults to testing if the object is an [E]
/// instance.
/// @description Checks that default [isValidKey] function checks if the object
/// is a [K] instance. This means that equals and hashCode functions will not be
/// called for instances of unsupported types.
/// @author iarkh@unipro.ru

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

int i = 0;
bool equals(dynamic key1, dynamic key2) {
  i++;
  return key1 == key2;
}

int hashCode(dynamic key) {
  i++;
  return key;
}

main() {
  HashSet<int> set = new HashSet<int>(equals : equals, hashCode : hashCode);
  set.addAll([0, 1, 2, -3, -4]);

  i = 0;
  bool j = set.contains(null);
  Expect.equals(0, i);
  j = set.contains("string");
  Expect.equals(0, i);
  set.remove([]);
  Expect.equals(0, i);
}
