// 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 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 operator == always returns
/// [true] 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;
  }
}

class C1 {
  int get hashCode => 1;
  bool operator == (dynamic c) { return true; }
}

class C2 {
  int get hashCode => 1;
  bool operator == (dynamic c) { return false; }
}

main() {
  HashSet set = new HashSet<C1>();
  set.add(new C1());
  MyIterable iterable = new MyIterable(set);
  Expect.isTrue(iterable.contains(new C1()));
  Expect.isTrue(iterable.contains(new C2()));
  Expect.isTrue(iterable.contains(12345));

  set = new HashSet<C2>();
  set.add(new C2());
  iterable = new MyIterable(set);
  Expect.isFalse(iterable.contains(new C2()));
  Expect.isFalse(iterable.contains(new C1()));
  Expect.isFalse(iterable.contains(12345));
  Expect.isFalse(iterable.contains(null));
}
