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