// Copyright (c) 2016, 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.

/// @assertion SplayTreeMap.fromIterable(Iterable iterable,
/// {K key(element), V value(element), int compare(K key1, K key2),
/// bool isValidKey(potentialKey)})
/// For each element of the [iterable] this constructor computes a key/value
/// pair, by applying [key] and [value] respectively.
/// @description Checks that for each element of the iterable this constructor
/// computes a key/value pair, by applying [key] and [value] respectively
/// @author sgrekhov@unipro.ru

import "dart:collection";
import "../../../Utils/expect.dart";

check(Iterable expectedKeys, Iterable expectedValues, Map m2) {
  Expect.equals(expectedKeys.length, m2.length);
  for (int i = 0; i < expectedKeys.length; i++) {
    Expect.isTrue(m2.containsKey(expectedKeys.elementAt(i)));
    Expect.equals(expectedValues.elementAt(i), m2[expectedKeys.elementAt(i)]);
  }
}

int getKey(var element) => element * 2;
String getValue(var element) => "value=" + element.toString();

main() {
  SplayTreeMap map = new SplayTreeMap.fromIterable([],
      key: getKey, value: getValue);
  check([], [], map);

  map = new SplayTreeMap.fromIterable([1, 2, 3, 4],
      key: getKey, value: getValue);
  check([2, 4, 6, 8], ["value=1", "value=2", "value=3", "value=4"], map);
}
