// 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() {
  testWithConstMap();
  testWithNonConstMap();
  testWithHashMap();
  testWithLinkedMap();
}

testWithConstMap() {
  var map = const {'b': 42, 'a': 43};
  var otherMap = new Map<String, int>.from(map);
  Expect.isTrue(otherMap is Map);
  Expect.isTrue(otherMap is LinkedHashMap);

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

  int count(Map<String, int> map) {
    int cnt = 0;
    map.forEach((a, b) {
      cnt += b;
    });
    return cnt;
  }

  Expect.equals(42 + 43, count(map));
  Expect.equals(count(map), count(otherMap));
}

testWithNonConstMap() {
  var map = {'b': 42, 'a': 43};
  var otherMap = new Map<String, int>.from(map);
  Expect.isTrue(otherMap is Map);
  Expect.isTrue(otherMap is LinkedHashMap);

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

  int count(Map<String, int> map) {
    int count = 0;
    map.forEach((a, b) {
      count += b;
    });
    return count;
  }

  ;

  Expect.equals(42 + 43, count(map));
  Expect.equals(count(map), count(otherMap));

  // Test that adding to the original map does not change otherMap.
  map['c'] = 44;
  Expect.equals(3, map.length);
  Expect.equals(2, otherMap.length);
  Expect.equals(2, otherMap.keys.length);
  Expect.equals(2, otherMap.values.length);

  // Test that adding to otherMap does not change the original map.
  otherMap['c'] = 44;
  Expect.equals(3, map.length);
  Expect.equals(3, otherMap.length);
  Expect.equals(3, otherMap.keys.length);
  Expect.equals(3, otherMap.values.length);
}

testWithHashMap() {
  var map = const {'b': 1, 'a': 2, 'c': 3};
  var otherMap = new HashMap.from(map);
  Expect.isTrue(otherMap is Map);
  Expect.isTrue(otherMap is HashMap);
  var i = 1;
  for (var val in map.values) {
    Expect.equals(i++, val);
  }
}

testWithLinkedMap() {
  var map = const {'b': 1, 'a': 2, 'c': 3};
  var otherMap = new LinkedHashMap.from(map);
  Expect.isTrue(otherMap is Map);
  Expect.isTrue(otherMap is LinkedHashMap);
  var i = 1;
  for (var val in map.values) {
    Expect.equals(i++, val);
  }
}
