// 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 LinkedHashSet({bool equals(E e1, E e2), int hashCode(E e),
/// bool isValidKey(potentialKey)})
/// Create an insertion-ordered hash set using the provided [equals] and
/// [hashCode]. The provided [equals] must define a stable equivalence relation,
/// and [hashCode] must be consistent with [equals]
/// @description Checks that if consistent [equals] and [hashCode] are provided,
/// they are used to compare the keys and produce hash value for keys
/// @author sgrekhov@unipro.ru

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

bool myEquals(var key1, var key2) =>
    key1 > 0 && key2 > 0 || key1 <= 0 && key2 <= 0;
int myHashCode(var key) => key > 0 ? 1 : -1;

check(LinkedHashSet set, List expected) {
  Expect.equals(expected.length, set.length);
  int i = 0;
  for(var v in expected) {
    Expect.equals(v, set.elementAt(i++));
  }
}

main() {
  LinkedHashSet set = new LinkedHashSet(equals: myEquals, hashCode: myHashCode);
  set.add(1);
  set.add(2);
  set.add(3);
  check(set, [1]);

  set.add(2);
  check(set, [1]);

  set.add(-2);
  check(set, [1, -2]);

  set.add(-20);
  check(set, [1, -2]);

  set.remove(10);
  set.add(15);
  check(set, [-2, 15]);
}
