// Copyright (c) 2020, 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 Calling the .length setter on a List with element type E with an
 * argument greater than the current length of the list is a runtime error
 * unless Null <: E
 *
 * @description Tests weak mode case.
 *
 * It is a library issue. The DartDoc on the setter `List.length=`
 * says that an `UnsupportedError` is thrown when `null` is not a valid element,
 * and that it 'fails' if the element type does not allow `null`.
 *
 * Failing and throwing could reasonably be assumed to be the same thing here.
 * "The element type does not allow null" could be taken to be true for any
 * non-nullable type, including all the ones that are used here, but seems like
 * it makes more sense to ask whether a dynamic check would actually allow the
 * value null.
 *
 * The actual implementation (for instance,
 * `_internal/js_runtime/lib/js_array.dart`) checks whether `null as E` throws,
 * which is consistent with this view of the situation.
 *
 * So it seems like it's expected that `list.length = 3;` executes without error
 * and stores null at index 2 in the list when the test runs with unsound null
 * checking.
 * @author iarkh@unipro.ru
 */

// Requirements=nnbd-weak

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

class A {}
void foo() {}
void bar() {}

typedef void Foo();

test<T>(T t1, T t2) {
  List<T> list = [t1, t2];
  list.length = 3;
  Expect.equals(3, list.length);
  Expect.isNull(list[2]);
}

main() {
  test<int>(3, 14);
  test<String>("Lily", "was here");
  test<A>(A(), A());
  test<Function>(foo, bar);
  test<Foo>(foo, bar);
  test<FutureOr<A>>(A(), A());
  test<FutureOr<Foo>>(foo, bar);
  test<FutureOr<FutureOr<A>>>(A(), A());
}
