// Copyright (c) 2013, 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.

import "package:expect/expect.dart";

class A {
  const A();
  bool operator ==(Object other) {
    return false;
  }
}

class B {
  bool operator ==(Object other) {
    Expect.fail("Bad equality order.");
    return false;
  }
}

main() {
  test(iterable) {
    Expect.isFalse(iterable.contains(new B()));
  }

  var iterables = <dynamic>[
    <A>[new A()],
    new List<A>.filled(1, new A()),
    const <A>[const A()],
    new Set()..add(new A()),
    (new Map()..[new A()] = 0).keys,
    (new Map()..[0] = new A()).values
  ];

  for (var iterable in iterables) {
    test(iterable);
    test(iterable.map((x) => x));
    test(iterable.take(1));
  }
}
