// 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:
///    A spread element in a map literal has a static type that is not assignable
///    to [Map<Object, Object>].
/// @description Checks that compile error is thrown if spread element in map
/// literal is not assignable to [Map<Object, Object>]
/// @author iarkh@unipro.ru


import "dart:collection";

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

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

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

main() {
  test1();
  test2();
}

void test1() {
  var number = 1;
  var str = "checkme";
  var list = [1, 2, 3, 4, 5];
  var itr = new MyIterator();

  var m1  = <dynamic, dynamic>{...number};
  //                              ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.NOT_MAP_SPREAD
  // [cfe] Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
  var m2  = <dynamic, dynamic>{...str};
  //                              ^^^
  // [analyzer] COMPILE_TIME_ERROR.NOT_MAP_SPREAD
  // [cfe] Unexpected type 'String' of a map spread entry.  Expected 'dynamic' or a Map.
  var m3  = <dynamic, dynamic>{...list[0]};
  //                              ^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.NOT_MAP_SPREAD
  //                                  ^
  // [cfe] Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
  var m4  = <dynamic, dynamic>{...itr[0]};
  //                                 ^^^
  // [analyzer] COMPILE_TIME_ERROR.UNDEFINED_OPERATOR
  // [cfe] The operator '[]' isn't defined for the class 'MyIterator<dynamic>'.
}

void test2() {
  var number = 1 as int?;
  var str = "checkme" as String?;
  var list = [1, 2, 3, 4, 5] as List?;
  var itr = new MyIterator() as Iterator?;

  var m5  = <dynamic, dynamic>{...?number};
  //                               ^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.NOT_MAP_SPREAD
  // [cfe] Unexpected type 'int?' of a map spread entry.  Expected 'dynamic' or a Map.
  var m6  = <dynamic, dynamic>{...?str};
  //                               ^^^
  // [analyzer] COMPILE_TIME_ERROR.NOT_MAP_SPREAD
  // [cfe] Unexpected type 'String?' of a map spread entry.  Expected 'dynamic' or a Map.
  var m7  = <dynamic, dynamic>{...?list[0]};
  //                                   ^
  // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
  // [cfe] Operator '[]' cannot be called on 'List<dynamic>?' because it is potentially null.
  var m8 = <dynamic, dynamic>{...?itr[0]};
  //                                 ^
  // [analyzer] COMPILE_TIME_ERROR.UNCHECKED_USE_OF_NULLABLE_VALUE
  // [cfe] The operator '[]' isn't defined for the class 'Iterator<dynamic>?'.
}
