// 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 "package:expect/expect.dart";
import 'dart:collection';

main() {
  positiveTest();
  emptyMapTest();
  fewerKeysIterableTest();
  fewerValuesIterableTest();
  equalElementsTest();
  genericTypeTest();
}

void positiveTest() {
  var map = new Map.fromIterables([1, 2, 3], ["one", "two", "three"]);
  Expect.isTrue(map is Map);
  Expect.isTrue(map is LinkedHashMap);

  Expect.equals(3, map.length);
  Expect.equals(3, map.keys.length);
  Expect.equals(3, map.values.length);

  Expect.equals("one", map[1]);
  Expect.equals("two", map[2]);
  Expect.equals("three", map[3]);
}

void emptyMapTest() {
  var map = new Map.fromIterables([], []);
  Expect.isTrue(map is Map);
  Expect.isTrue(map is LinkedHashMap);

  Expect.equals(0, map.length);
  Expect.equals(0, map.keys.length);
  Expect.equals(0, map.values.length);
}

void fewerValuesIterableTest() {
  Expect.throws(() => new Map.fromIterables([1, 2], [0]));
}

void fewerKeysIterableTest() {
  Expect.throws(() => new Map.fromIterables([1], [0, 2]));
}

void equalElementsTest() {
  var map = new Map.fromIterables([1, 2, 2], ["one", "two", "three"]);
  Expect.isTrue(map is Map);
  Expect.isTrue(map is LinkedHashMap);

  Expect.equals(2, map.length);
  Expect.equals(2, map.keys.length);
  Expect.equals(2, map.values.length);

  Expect.equals("one", map[1]);
  Expect.equals("three", map[2]);
}

void genericTypeTest() {
  var map =
      new Map<int, String>.fromIterables([1, 2, 3], ["one", "two", "three"]);
  Expect.isTrue(map is Map<int, String>);

  // Make sure it is not just Map<dynamic, dynamic>.
  Expect.isFalse(map is Map<String, dynamic>);
  Expect.isFalse(map is Map<dynamic, int>);

  Expect.equals(3, map.length);
  Expect.equals(3, map.keys.length);
  Expect.equals(3, map.values.length);

  Expect.equals("one", map[1]);
  Expect.equals("two", map[2]);
  Expect.equals("three", map[3]);
}
