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

library map.from.test;

import "package:expect/expect.dart";
import 'dart:collection';

main() {
  for (Map<num, num> map in [
    <num, num>{},
    const <num, num>{},
    new HashMap<num, num>(),
    new LinkedHashMap<num, num>(),
    new SplayTreeMap<num, num>(),
    <num, num>{1: 11, 2: 12, 4: 14},
    const <num, num>{1: 11, 2: 12, 4: 14},
    new Map<num, num>()
      ..[1] = 11
      ..[2] = 12
      ..[3] = 13,
    new HashMap<num, num>()
      ..[1] = 11
      ..[2] = 12
      ..[3] = 13,
    new LinkedHashMap<num, num>()
      ..[1] = 11
      ..[2] = 12
      ..[3] = 13,
    new SplayTreeMap<num, num>()
      ..[1] = 11
      ..[2] = 12
      ..[3] = 13,
  ]) {
    expectThrows(void operation()) {
      // Allow CastError as well as TypeError. Dart2js creates a CastError
      // here for some reason, and it's not wront.
      Expect.throws(operation, (e) => e is TypeError || e is CastError);
    }

    var sourceType = map.runtimeType.toString();
    check(sourceType, map, new Map<Object, Object>.of(map));
    check(sourceType, map, new Map<num, num>.of(map));
    expectThrows(() => new Map<int, int>.of(map));
    check(sourceType, map, new HashMap<Object, Object>.of(map));
    check(sourceType, map, new HashMap<num, num>.of(map));
    expectThrows(() => new HashMap<int, int>.of(map));
    check(sourceType, map, new LinkedHashMap<Object, Object>.of(map));
    check(sourceType, map, new LinkedHashMap<num, num>.of(map));
    expectThrows(() => new LinkedHashMap<int, int>.of(map));
    check(sourceType, map, new SplayTreeMap<Object, Object>.of(map));
    check(sourceType, map, new SplayTreeMap<num, num>.of(map));
    expectThrows(() => new SplayTreeMap<int, int>.of(map));
  }
}

check(String sourceType, Map<num, num> expect, Map actual) {
  var targetType = actual.runtimeType.toString();
  var name = "$sourceType->$targetType";
  Expect.equals(expect.length, actual.length, "$name.length");
  for (var key in expect.keys) {
    Expect.isTrue(actual.containsKey(key), "$name?[$key]");
    Expect.equals(expect[key], actual[key], "$name[$key]");
  }
}
