// 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.

// @dart = 2.9

import "package:expect/expect.dart";

class A {
  const A();
  foo() => 42;
}

class B {
  foo() => 42;
}

main() {
  // Use an array to defeat type inferencing.
  var array = <dynamic>[new A(), new A(), new B(), new B()];
  var set = new Set.from(array.map((a) => a.foo));
  Expect.equals(array.length, set.length);
  set.addAll(array.map((a) => a.foo));
  Expect.equals(array.length, set.length);

  for (int i = 0; i < array.length; i += 2) {
    Expect.isTrue(set.contains(array[i].foo));
    Expect.equals(array[i], array[i]);
    Expect.equals(array[i].foo, array[i].foo);
    Expect.equals(array[i].foo.hashCode, array[i].foo.hashCode);
    for (int j = 0; j < array.length; j++) {
      if (i == j) continue;
      Expect.notEquals(array[i].foo, array[j].foo);
    }
  }

  // Try with dart2js intercepted types.
  array = <dynamic>['foo', 'bar', [], [], const []];
  set = new Set.from(array.map((a) => a.indexOf));
  Expect.equals(array.length, set.length);
  set.addAll(array.map((a) => a.indexOf));
  Expect.equals(array.length, set.length);

  for (int i = 0; i < array.length; i += 2) {
    Expect.isTrue(set.contains(array[i].indexOf));
    Expect.equals(array[i], array[i]);
    Expect.equals(array[i].indexOf, array[i].indexOf);
    Expect.equals(array[i].indexOf.hashCode, array[i].indexOf.hashCode);
    for (int j = 0; j < array.length; j++) {
      if (i == j) continue;
      Expect.notEquals(array[i].indexOf, array[j].indexOf);
    }
  }

  array = <dynamic>[const A(), const A()];
  set = new Set.from(array.map((a) => a.foo));
  Expect.equals(1, set.length);
  set.addAll(array.map((a) => a.foo));
  Expect.equals(1, set.length);

  Expect.isTrue(set.contains(array[0].foo));
  Expect.equals(array[0].foo, array[0].foo);
  Expect.equals(array[0].foo.hashCode, array[0].foo.hashCode);
  Expect.equals(array[0].foo, array[1].foo);
  Expect.equals(array[0].foo.hashCode, array[1].foo.hashCode);

  array = <dynamic>[const [], const []];
  set = new Set.from(array.map((a) => a.indexOf));
  Expect.equals(1, set.length);
  set.addAll(array.map((a) => a.indexOf));
  Expect.equals(1, set.length);

  Expect.isTrue(set.contains(array[0].indexOf));
  Expect.equals(array[0].indexOf, array[0].indexOf);
  Expect.equals(array[0].indexOf.hashCode, array[0].indexOf.hashCode);
  Expect.equals(array[0].indexOf, array[1].indexOf);
  Expect.equals(array[0].indexOf.hashCode, array[1].indexOf.hashCode);
}
