// Copyright (c) 2019, 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 If a list or set literal has a downwards inference type of
/// [Iterable<T>] for some [T], then the downwards inference context type of a
/// spread element in that list is [Iterable<T>].
/// @description Checks that a spread element inference context type is [T] in
/// the list literal
/// @author iarkh@unipro.ru

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

class A {}
class B extends A {}
class C extends B {}

List<T> getAList<T>(var a) { return <T>[a]; }

main() {
  dynamic a_list   = getAList<A>(new A());
  dynamic b_list   = getAList<B>(new B());
  dynamic c_list   = getAList<C>(new C());
  dynamic int_list = getAList<int>(12);
  dynamic str_list = ["string"];
  A a = new A();
  B b = new B();
  C c = new C();

  List list1 = <int>[2, 7, ...int_list, 4];
  Expect.isTrue(list1 is List<int>);

  List list2 = <A>[a, ...a_list];
  Expect.isTrue(list2 is List<A>);

  List list3 = <A>[a, ...b_list];
  Expect.isTrue(list3 is List<A>);

  List list4 = <A>[a, c, ...c_list, b];
  Expect.isTrue(list4 is List<A>);

  List list5 = <A>[a, b, c, ...c_list, new B(), ...a_list, ...b_list, new A()];
  Expect.isTrue(list5 is List<A>);

  List list6 = <B>[b, ...b_list, c, ...c_list];
  Expect.isTrue(list6 is List<B>);

  List list7 = [123, "123", null, a, ...a_list, ...?b_list, c, b, ...?c_list,
      ...str_list, ...int_list, null, 1499, []];
  Expect.isTrue(list7 is List<Object?>);

  List list8;

  Expect.throws(() => list8 = <int>[...str_list]);
  Expect.throws(() => list8 = <int>[1, 2, ...a_list, 14]);
  Expect.throws(() => list8 = <int>[1, 14, 0, ...c_list]);

  Expect.throws(() => list8 = <A>[...int_list]);
  Expect.throws(() => list8 = <A>[...?str_list]);

  Expect.throws(() => list8 = <B>[...a_list]);
  Expect.throws(() => list8 = <B>[b, ...?a_list, c]);

  Expect.throws(() => list8 = <C>[...b_list]);
  Expect.throws(() => list8 = <C>[...a_list, ...?b_list]);

  Expect.throws(() => list8 = <B>[...a_list]);
  Expect.throws(() => list8 = <B>[b, ...?a_list, c]);

  Expect.throws(() => list8 = <C>[...b_list]);
  Expect.throws(() => list8 = <C>[...a_list, ...?b_list]);
}
