// Copyright (c) 2011, 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 factory List.from(Iterable other, {bool growable: true})
/// Creates an list with the elements of other.
/// The order in the list will be the order provided by the iterator of other.
/// The returned list is growable if growable is true, otherwise it's a fixed
/// length list.
/// @description Checks that the list created with growable==true can change it's
/// size.
/// @author varlax

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

void check(List l) {
  int len = l.length;
  l.add(null);
  Expect.equals(len + 1, l.length);

  l.clear();
  Expect.equals(0, l.length);
}

main() {
  check(new List.from([]));

  Set<int> s = new Set<int>();
  for (var i = 0; i < 10; i++){
    s.add(i);
  }
  check(new List.from(s));

  Queue<int> q = new Queue<int>();
  for (var i = 0; i < 10; i++){
    q.add(i);
  }
  check(new List.from(q));

  List l = new List.empty(growable: true);
  l.addAll(["1", "2", "3", "4", "5"]);
  List a = new List.from(l, growable:true);
  check(a);

  List src = [null, [null], [], [1, 2, 3], [[null]]];
  a = new List.from(src);
  check(a);

  src = new List.filled(34567, 0);
  src[34566] = -111111111;
  a = new List.from(src, growable:true);
  check(a);
}
