// 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 interface HashSet.from(Iterable elements)
/// All the [elements] should be assignable to [E]. [The elements] iterable
/// itself may have any element type, so this constructor can be used to
/// down-cast a [Set], for example as:
/// Set<SuperType> superSet = ...;
/// Set<SubType> subSet =
///     new HashSet<SubType>.from(superSet.where((e) => e is SubType));
/// @description Checks that provided down-cast example works as expected
/// @author iarkh@unipro.ru

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

check(HashSet set, List list1, List list2) {
  Expect.equals(list1. length, set.length);
  list1.forEach((element) => Expect.isTrue(set.contains(element)));
  list2.forEach((element) => Expect.isFalse(set.contains(element)));
}

main() {
  List list = ["testme", 1, 2, 3, null, "", [], [1, 2, 3], {}, new Error(),
      -1, -2, "string1", "string2", "string3", 'a', 'b', 'c'];

  HashSet set = new HashSet<int>.from(list.where((e) => e is int));
  check(set, [1, 2, 3, -1, -2],
      ["testme", null, "", [], [1, 2, 3], {}, new Error(), "string1", "string2",
      "string3", 'a', 'b', 'c']);

  set = new HashSet<String>.from(list.where((e) => e is String));
  check(set, ["testme", "", "string1", "string2", "string3", 'a', 'b', 'c'],
    [1, 2, 3, null, [], [1, 2, 3], {}, new Error(), -1, -2]);

  set = new HashSet.from(list.where((e) => e is Object?));
  check(set, list, ["unexist", 0 -5]);
}
