// 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 List<E> toList({bool growable: true})
/// Creates a [List] containing the elements of this [Iterable].
/// The elements are in iteration order.
/// @description Checks created list contains all the iterable elements in
/// iteration order.
/// @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, List actual) {
  Expect.equals(expected.length, actual.length);
  Iterator it = expected.iterator;
  var i = 0;
  while (it.moveNext()) {
    Object? o = it.current;
    Expect.identical(actual[i], o);
    Expect.isTrue(actual[i] == o);
    i++;
  }
}

main() {
  IterableMixin iterable = new MyIterable([]);
  List list = iterable.toList();
  Expect.equals(0, list.length);

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

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