// Copyright (c) 2017, 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 Set<E> toSet()
/// Creates a [Set] containing the elements of this [Iterable].  ...
/// The order of the elements in the set is not guaranteed to be the same as for
/// the iterable.
/// @description Checks that proper [Set] is created.
/// @author iarkh@unipro.ru

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

class MyIterable<int> extends Object with IterableMixin {
  List _content;
  MyIterable(List list): _content = list;

  Iterator get iterator {
    return _content.iterator;
  }
}

void checkEquals(Iterable expected, Set actual) {
  Set set0 = new Set();
  for (var el in expected) {
    set0.add(el);
  }
  Expect.isTrue(set0.containsAll(actual));
  Expect.isTrue(actual.containsAll(set0));
}

main() {
  IterableMixin iterable = new MyIterable([]);
  Set res = iterable.toSet();
  Expect.equals(0, res.length);

  iterable = new MyIterable([1, "2", "3", "4", "5", "4", 1]);
  res = iterable.toSet();
  checkEquals(iterable, res);

  iterable = new MyIterable([null, [null], [], [1,2,3], [[null]]]);
  res = iterable.toSet();
  checkEquals(iterable, res);
}
