// 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 HashMap({bool equals(K key1, K key2), int hashCode(K key),
/// bool isValidKey(potentialKey) })
/// If [equals] ... is omitted, the key's own [Object.operator==] is used
/// instead. Similar, if [hashCode] is ... omitted, the key's own
/// [Object.hashCode] is used.
/// @description Checks that if equals and hashCode methods are not provided,
/// [Object.operator==] and [Object.hashCode] are used when adding or updating
/// elements of [HashMap]
/// @author iarkh@unipro.ru

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

check(HashMap map, Map expected, List unexistent) {
  expected.forEach((key, value) {
    Expect.isTrue(map.containsKey(key));
    Expect.equals(value, map[key]);
  });
  for(int i = 0; i < unexistent.length; i++) {
    Expect.isFalse(map.containsKey(unexistent[i]));
    Expect.equals(null, map[unexistent[i]]);
  }
}

main() {
  HashMap map = new HashMap();
  Map aMap = new Map();
  List unexist = new List.empty(growable: true);

  for (int i = 0; i <= 40; i += 2) {
    aMap.putIfAbsent (i, () => i);
    unexist.add(i + 1);
    map.putIfAbsent(i, () => i);
    check(map, aMap, unexist);
  }

  for (int i = 0; i <= 40; i += 2) {
    unexist.add(i + 1);
    map.putIfAbsent(i, () => i + 1); // nothing should be actually added
    check(map, aMap, unexist);
  }

  aMap =
    {1 : 1, 6 : 6, 3 : [1, 2, 3], null : "abcd", "error" : new Error(),
      "null" : null, [0, 1] : "testme"};
  unexist = [-25, 484, "no there"];
  map = new HashMap();
  map.addAll(aMap);
  check(map, aMap, unexist);

  // Nothing should be actually added:
  map.putIfAbsent(1, () => "should not add");
  map.putIfAbsent(null, () => "should not add");
  map.putIfAbsent("abcd", () => "should not add");
  check(map, aMap, unexist);
}
