// 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 An expression like:
///   { ...a, ...b }
/// Is syntactically parsed as [mapOrSetLiteral]. To determine whether it
/// actually is a map or set, the surrounding context is used. Given an
/// [mapOrSetLiteral] with context type [C]:
///
/// If [Set<Null>] is assignable to [C], and [Map<Null, Null>] is not
/// assignable to [C], then the collection is a set literal.
///
/// Otherwise, it is a map literal.
///
/// In other words, if it can only be a set, it is. Otherwise, it's a map.
/// @description Checks that if [a] and [b] are set literals (probably,
/// null-aware), their spread is a set.
/// @author iarkh@unipro.ru


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

class MyIterable extends IterableBase {
  MyIterable();
  Iterator get iterator => MyIterator();
}

class MyIterator extends Iterator {
  int i = -1;
  MyIterator() {}
  @override
  bool moveNext() { return ++i < 10; }
  @override
  dynamic get current { return i; }
}

Set? getASet() => {1, 2, 3};
List? getAList() => [0, 2, 4, 6, 8];
Iterable? getIterable() => MyIterable();

main() {
  Set set1 = {1, 2, 3};
  List list1 = [0, 2, 4, 6, 8];
  var map = null;
  List? list2 = null;
  Iterable i = MyIterable();

  Set res1 = {...set1, ...?list2};
  Expect.setEquals(set1, res1);

  Set res2 = {...?list2, ...list1};
  Expect.setEquals(list1.toSet(), res2);

  Set res3 = {...?map, ...list1};
  Expect.setEquals(list1.toSet(), res3);

  Set res4 = {...?list2, ...?getIterable()};
  Expect.setEquals(i.toSet(), res4);

  Set res5 = {...i, ...?map};
  Expect.setEquals(i.toSet(), res5);

  Set res6 = {...set1, ...list1, ...?list2, ...?map, ...i};
  Expect.setEquals({1, 2, 3, 0, 4, 6, 8, 5, 7, 9}, res6);

  Set res7 =
      {...?getASet(), ...?getAList(), ...?list2, ...?map, ...?getIterable()};
  Expect.setEquals({1, 2, 3, 0, 4, 6, 8, 5, 7, 9}, res7);
}
