// Copyright (c) 2011, 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 "dart:collection";
import "package:expect/expect.dart";

void main() {
  // Test customized maps.
  // Regression test for issue http://dartbug.com/18109

  int hash(s) => s.toLowerCase().hashCode;
  bool equals(a, b) => a.toLowerCase() == b.toLowerCase();

  for (var m in [
    new HashMap<String, int>(equals: equals, hashCode: hash),
    new LinkedHashMap<String, int>(equals: equals, hashCode: hash),
  ]) {
    m["Abel"] = 42;
    for (var key in ["Abel", "abel", "ABEL", "Abel"]) {
      Expect.isTrue(m.containsKey(key), "contains $key in ${m.runtimeType} $m");
      Expect.equals(42, m[key], "get $key in ${m.runtimeType} $m");
      Expect.equals(42, m.remove(key), "remove $key in ${m.runtimeType} $m");
      m[key] = 42;
    }
  }

  int abshash(n) => n.abs();
  bool abseq(a, b) => a.abs() == b.abs();
  for (var m in [
    new HashMap<int, int>(equals: abseq, hashCode: abshash),
    new LinkedHashMap<int, int>(equals: abseq, hashCode: abshash),
  ]) {
    m[1] = 42;
    for (var key in [1, -1, 1]) {
      Expect.isTrue(m.containsKey(key), "contains $key in ${m.runtimeType} $m");
      Expect.equals(42, m[key], "get $key in ${m.runtimeType} $m");
      Expect.equals(42, m.remove(key), "remove $key in ${m.runtimeType} $m");
      m[key] = 42;
    }
  }
}
