// 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([int length])
/// Creates a list of the given length.
/// The list is a fixed-length list if length is provided, and an empty growable
/// list if length is omitted.
/// @description Checks that created list contains exactly length elements if
/// length is provided.
/// @author iefremov

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

void check(List a, int size) {
  Expect.isTrue(size > 0);

  Expect.isTrue(a.length == size);

  a[size-1] = 1;
  Expect.isTrue(a[size-1] == 1);

  a[0] = 42;
  Expect.isTrue(a[0] == 42);

  a[size>>1] = 6031769;
  Expect.isTrue(a[size>>1] == 6031769);

  Expect.throws(() {a[-1] = 0;}, (e) => e is RangeError);
  Expect.throws(() {a[size] = 0;}, (e) => e is RangeError);
}

main() {
  List a = new List.filled(0, 0);
  Expect.isTrue(a.length == 0);
  Expect.throws(() {a[0] = 1;}, (e) => e is RangeError);

  check(new List.filled(1, 0), 1);
  check(new List.filled(42, 0), 42);
  check(new List.filled(100500, 0), 100500);
}
