// Copyright (c) 2017, 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 LinkedHashMap({bool equals(K key1, K key2), int hashCode(K key),
/// bool isValidKey(potentialKey)})
/// If [isValidKey] is omitted, it defaults to testing if the object is an [E]
/// instance. That means that:
///   new LinkedHashSet<int>(equals: (int e1, int e2) => (e1 - e2) % 5 == 0,
///   hashCode: (int e) => e % 5)
/// does not need an [isValidKey] argument, because it defaults to only accepting
/// [int] values which are accepted by both [equals] and [hashCode].
/// @description Checks that [isValidKey] is not specified, it defaults to test
/// if the object is of [K] type or not.
/// @author iarkh@unipro.ru

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

main() {
  LinkedHashSet set = new LinkedHashSet<int>(
    equals: (int e1, int e2) => true,
    hashCode: (int e) => 1);

  LinkedHashSet set1 = new LinkedHashSet(
      equals: (e1, e2) => true,
      hashCode: (e) => 1);

  set.add(12);
  set1.add(12);

  Expect.isTrue(set.contains(12));
  Expect.isTrue(set.contains(0));
  Expect.isTrue(set.contains(-123));

  Expect.isFalse(set.contains("abcd"));
  Expect.isFalse(set.contains(null));
  Expect.isFalse(set.contains(new Object()));

  Expect.isTrue(set1.contains(12));
  Expect.isTrue(set1.contains(0));
  Expect.isTrue(set1.contains(-123));

  Expect.isTrue(set1.contains("abcd"));
  Expect.isTrue(set1.contains(null));
  Expect.isTrue(set1.contains(new Object()));
}
