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

// @dart = 2.9

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