// 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]);
}
