// Copyright (c) 2018, 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';

main() {
  runTests(<K, V>(entries) => Map<K, V>.fromEntries(entries));
  runTests(<K, V>(entries) => HashMap<K, V>.fromEntries(entries));
  runTests(<K, V>(entries) => LinkedHashMap<K, V>.fromEntries(entries));
}

void runTests(Map<K, V> Function<K, V>(Iterable<MapEntry<K, V>>) ctor) {
  fromEntriesTest(ctor);
  emptyIterableTest(ctor);
  equalElementsTest(ctor);
}

void fromEntriesTest(Map<K, V> Function<K, V>(Iterable<MapEntry<K, V>>) ctor) {
  var map = ctor([MapEntry(1, "one"), MapEntry(2, "two")]);
  Expect.equals(2, map.length);
  Expect.equals(2, map.keys.length);
  Expect.equals(2, map.values.length);
  Expect.equals("one", map[1]);
  Expect.equals("two", map[2]);
}

void emptyIterableTest(
    Map<K, V> Function<K, V>(Iterable<MapEntry<K, V>>) ctor) {
  var map = ctor([]);
  Expect.equals(0, map.length);
  Expect.equals(0, map.keys.length);
  Expect.equals(0, map.values.length);
}

void equalElementsTest(
    Map<K, V> Function<K, V>(Iterable<MapEntry<K, V>>) ctor) {
  var map =
      ctor([MapEntry(1, "one"), MapEntry(2, "two"), MapEntry(2, "other")]);
  Expect.equals(2, map.length);
  Expect.equals(2, map.keys.length);
  Expect.equals(2, map.values.length);
  Expect.equals("one", map[1]);
  Expect.equals("other", map[2]);
}
