// 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)})
/// If no functions are specified for [key] and [value] the default is to use the
/// [iterable] value itself.
/// @description Checks that if no functions for keys and values specified then
/// [iterable] values are used
/// @author sgrekhov@unipro.ru

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

check(Iterable source, Map m2) {
  Expect.equals(source.length, m2.length);
  source.forEach((var element) {
    Expect.isTrue(m2.containsKey(element));
    Expect.equals(element, m2[element]);
  });
}

main() {
  Iterable source = [];
  SplayTreeMap map = new SplayTreeMap.fromIterable(source);
  check(source, map);

  source = [1, 2, 3, 4];
  map = new SplayTreeMap.fromIterable(source);
  check(source, map);

  source = ["1", "2", "3", "4", "5", "6"];
  map = new SplayTreeMap.fromIterable(source);
  check(source, map);


  source = [new DateTime.now(), new DateTime(1970), new DateTime(2016)];
  map = new SplayTreeMap.fromIterable(source);
  check(source, map);

  source = [new Duration(), new Duration(hours: 1), new Duration(days: 1)];
  map = new SplayTreeMap.fromIterable(source);
  check(source, map);
}
