/*
 * 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 It is a static error if:
 *    If a list or set spread element's static type implements [Iterable<T>] for
 *    some [T] and [T] is not assignable to the element type of the list.
 * @description Checks that compile error is thrown if spread element type in
 * set literal is not assignable to the type of the set.
 * @author iarkh@unipro.ru
 */

import "dart:collection";

class MyIterable<T> extends IterableBase<T> {
  late MyIterator<T> iterator;
  MyIterable() { iterator = MyIterator(); }
  Iterator getIterator<T>() { return iterator; }
}

class MyIterator<T> extends Iterator<T> {
  @override
  bool moveNext() { return false; }

  @override
  T get current => throw "Should not reach here!";
}

main() {

  List<Object> l1  = <Object> [];
  List<int> l2  = <int>[1, 2, 3];
  List<bool> l3  = <bool>[true, false, true, true];
  List<bool> l4  = <bool>[true, false, true, true];
  List<int> l5  = <int>[];
  List<bool> l6  = <bool>[];
  List<String> l7  = <String>[];
  List<String> l8  = <String>["1", "2"];
  List<Object> l9 = <Object>["1", "2"];

  Iterable<int> i1 = new MyIterable<int>();
  Iterable<String> i2 = new MyIterable<String>();
  Iterable<bool> i3 = new MyIterable<bool>();
  Iterable i4 = new MyIterable<Object>();

  Set list1 = <String>{...l1};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'Object' to collection elements of type 'String'.
  Set list2 = <String>{...l2};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'int' to collection elements of type 'String'.
  Set list3 = <Object>{...l3};
  Set list4 = <String>{...l4};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'bool' to collection elements of type 'String'.
  Set list5 = <String>{...l5};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'int' to collection elements of type 'String'.
  Set list6 = <String>{...l6};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'bool' to collection elements of type 'String'.
  Set list7 = <String>{...l7};
  Set list8 = <String>{...l8};
  Set list9 = <String>{...l9};
  //                      ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'Object' to collection elements of type 'String'.

  Set list11 = <String>{...i1};
  //                       ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'int' to collection elements of type 'String'.
  Set list12 = <String>{...i2};
  Set list13 = <String>{...i3};
  //                       ^^
  // [analyzer] COMPILE_TIME_ERROR.SET_ELEMENT_TYPE_NOT_ASSIGNABLE
  // [cfe] Can't assign spread elements of type 'bool' to collection elements of type 'String'.
  Set list14 = <String>{...i4};
}
