// 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) })
/// Create a hash set using the provided [equals] as equality.
/// @description Checks that it's impossible to add an element which is already
/// equal to another element in the set.
/// @author iarkh@unipro.ru

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

check(HashSet set, List list1, List list2, List list3) {
  list1.forEach((element) => Expect.isTrue(set.contains(element)));
  list2.forEach((element) => Expect.isFalse(set.contains(element)));
  Expect.equals(list3.length, set.length);
  for(int i = 0; i < list3.length; i++) {
    Expect.isTrue(list3[i] == set.elementAt(i));
  }
}

main() {
  HashSet set = new HashSet(
      equals: (var key1, var key2) => key1 % 3 == key2 % 3,
      hashCode: (var e) => e % 3);

  set.add(0);
  check(set, [0, 3, 6, 9], [1, 2, 4, 5, 7, 8], [0]);

  set.add(3);
  check(set, [0, 3, 6, 9], [1, 2, 4, 5, 7, 8], [0]);

  set .add(7);
  check(set, [0, 1, 3, 4, 6, 7, 9, 10, 12], [2, 5, 8], [0, 7]);

  set .add(4);
  check(set, [0, 1, 3, 4, 6, 7, 9, 10, 12], [2, 5, 8], [0, 7]);

  set.add(14);
  check(set,
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], [], [0, 7, 14]);
}
