// 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 bool contains(Object element)
/// Some types of iterable may have a different equality used for its elements.
/// For example, a [Set] may have a custom equality (see [Set.identical]) that
/// its [contains] uses. Likewise the [Iterable] returned by a [Map.keys] call
/// should use the same equality that the [Map] uses for keys.
/// @description Checks that [true] is returned if collection contains [element]
/// and [false] is returned otherwise for set.
/// @author iarkh@unipro.ru

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

class MyIterable extends Object with IterableMixin {
  Set _content;
  MyIterable(Set set): _content = set;

  Iterator get iterator {
    return _content.iterator;
  }
}

check(HashSet set, List list1, List list2) {
  MyIterable iterable = new MyIterable(set);
  list1.forEach((element) => Expect.isTrue(iterable.contains(element)));
  list2.forEach((element) => Expect.isFalse(iterable.contains(element)));
}

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], [1, 2, 4, 5, 7, 8]);

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

  set.add(7);
  check(set, [0, 7], [2, 5, 8]);

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

  set.add(14);
  check(set, [0, 7, 14], []);
}
