/*
 * 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 The grammar changes for map and set are a little more complex
 * because of the potential ambiguity of collections containing only spreads.
 * The changed and new rules are:
 *
 *    setOrMapLiteral:
 *    mapLiteral |
 *    setLiteral |
 *    mapOrSetLiteral
 *    ;
 *
 *    mapLiteral:
 *    const? typeArguments? '{' mapLiteralEntryList? '}'
 *    ;
 *
 *    mapLiteralEntryList:
 *    mapLiteralEntry ( ',' mapLiteralEntry )* ','?
 *    ;
 *
 *    mapLiteralEntry:
 *    expression ':' expression |
 *    spread
 *    ;
 *
 *    setLiteral:
 *    'const'? typeArguments? '{' spreadableList '}' ;
 *
 *    mapOrSetLiteral:
 *    'const'?  '{' spread (',' spread)* '}' ;
 *
 * @description Checks the very simple cases where some values are combined with
 * the existing set or list of integers
 * @author iarkh@unipro.ru
 */
// SharedOptions=--enable-experiment=constant-update-2018

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

main() {
  Set set1 = {1, 2, 3};
  Set set2 = {14, 18, 99};
  var list = [10, 20, 40, 60, 80];

  Expect.setEquals(set1, {...set1});
  Expect.setEquals(set2, {...set2});
  Expect.setEquals(list.toSet(), {...list});

  Expect.setEquals({12, 1, 2, 3}, {12, ...set1});
  Expect.setEquals({1, 2, 3, 12, 20, 30, 10}, {...set1, 12, 20, 30, 10});

  Expect.setEquals({1, 2, 3, 14, 18, 99, 10, 20, 40, 60, 80},
      {...set1, ...set2, ...list});
  Expect.setEquals({11, 1, 2, 3, 12, 16, 94, 10, 20, 40, 60, 80},
      {11, ...set1, 12, 16, 94, ...list});
}
