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

  var count = (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.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) {
    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);
  }
}
