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

// @dart = 2.9

/// @assertion LinkedHashMap({bool equals(K key1, K key2), int hashCode(K key),
/// bool isValidKey(potentialKey)})
/// ...
/// If using methods like operator [], [remove] and [containsKey] together with a
/// custom equality and hashcode, an extra [isValidKey] function can be supplied.
/// This function is called before calling [equals] or [hashCode] with an
/// argument that may not be a [K] instance, and if the call returns [false], the
/// key is assumed to not be in the set. The [isValidKey] function defaults to
/// just testing if the object is a [K] instance.
/// @description Checks that [isValidKey] is not ignored if [equals] and
/// [hashCode] are not specified. Test [LinkedHashMap<int>]
/// @author sgrekhov@unipro.ru

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

bool called = false;

bool isValidKey(var potentialKey) {
  called = true;
  return (potentialKey is int) && potentialKey < 100;
}

main() {
  LinkedHashMap<int, num> map =
      new LinkedHashMap<int, num>(isValidKey: isValidKey);

  map[101] = 1.1;

  Expect.isNull(map[101]);
  Expect.isTrue(called);

  called = false;
  Expect.isFalse(map.containsKey(101));
  Expect.isTrue(called);

  called = false;
  Expect.isNull(map.remove(101));
  Expect.isTrue(called);
}
