// 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 set 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();

  Set set1 = <int>{2, 7, ...int_list, 4};
  Expect.isTrue(set1 is Set<int>);

  Set set2 = <A>{a, ...a_list};
  Expect.isTrue(set2 is Set<A>);

  Set set3 = <A>{a, ...b_list};
  Expect.isTrue(set3 is Set<A>);

  Set set4 = <A>{a, c, ...c_list, b};
  Expect.isTrue(set4 is Set<A>);

  Set set5 = <A>{a, b, c, ...c_list, new B(), ...a_list, ...b_list, new A()};
  Expect.isTrue(set5 is Set<A>);

  Set set6 = <B>{b, ...b_list, c, ...c_list};
  Expect.isTrue(set6 is Set<B>);

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

  Set set8;
  Expect.throws(() => set8 = <int>{...str_list});
  Expect.throws(() => set8 = <int>{1, 2, ...a_list, 14});
  Expect.throws(() => set8 = <int>{1, 14, 0, ...c_list});

  Expect.throws(() => set8 = <A>{...int_list});
  Expect.throws(() => set8 = <A>{...?str_list});

  Expect.throws(() => set8 = <B>{...a_list});
  Expect.throws(() => set8 = <B>{b, ...?a_list, c});

  Expect.throws(() => set8 = <C>{...b_list});
  Expect.throws(() => set8 = <C>{...a_list, ...?b_list});

  Expect.throws(() => set8 = <B>{...a_list});
  Expect.throws(() => set8 = <B>{b, ...?a_list, c});
  Expect.throws(() => set8 = <C>{...b_list});
  Expect.throws(() => set8 = <C>{...a_list, ...?b_list});
}
