// 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.

/// @assertionfactory List.generate(int length, E generator(int index),
/// {bool growable: true})
/// Generate a List of values.
/// Creates a list with length positions and fills them by values created by
/// calling generator for each index in the range 0 .. [length]-1 in increasing
/// order.
/// The created length's length is fixed unless growable is true.
/// @description Checks that proper list with correct element order is created.
/// @author kaigorodov

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

typedef Generator(int index);

Generator gengen(List source) {
  return (int index) {
     return source[index];
   };
}

void checkEquals(List 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() {
  List<int> s = new List<int>.empty(growable: true);
  List a = new List.generate(0, gengen(s));
  Expect.equals(0, a.length);
  Expect.equals(0, s.length);

  for (var i = 0; i < 10; i++){
    s.add(i);
  }
  a = new List.generate(s.length, gengen(s));
  checkEquals(s, a);

  List l = new List.empty(growable: true);
  a = new List.generate(0, gengen(l));
  Expect.equals(0, a.length);
  Expect.equals(0, l.length);

  l.addAll(["1", "2", "3", "4", "5"]);
  a = new List.generate(l.length, gengen(l));
  checkEquals(l, a);

  List src = [null, [null], [], [1, 2, 3], [[null]]];
  a = new List.generate(src.length, gengen(src));
  checkEquals(src, a);

  src = new List.filled(34567, 0);
  src[34566] = -111111111;
  a = new List.generate(src.length, gengen(src));
  checkEquals(src, a);
}
