/*
 * 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 that spreadable map can be declared as constant.
 * @author iarkh@unipro.ru
 */
// SharedOptions=--enable-experiment=constant-update-2018

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

main() {
  const Map map1 = {1: 1, 2: 4, 3: 6};
  const Map map2 = {11: 28, 4: 7, 31: 12};
  const Map map3 = {0: 0, 7: 2, 5: 4, 6: 6, 8: 8};

  Expect.mapEquals(map1, const {...map1});
  Expect.mapEquals(map2, const {...map2});
  Expect.mapEquals(map3, const {...map3});

  Expect.mapEquals({12: 28, 1: 1, 2: 4, 3: 6}, const {12: 28, ...map1});
  Expect.mapEquals({1: 1, 2: 4, 3: 6, 12: 3, 112: 4, 33: 0, 10: 14},
      const {...map1, 12: 3, 112: 4, 33: 0, 10: 14});

  Expect.mapEquals(
      {1: 1, 2: 4, 3: 6, 11: 28, 4: 7, 31: 12, 0: 0, 7: 2, 5: 4, 6: 6, 8: 8},
      const {...map1, ...map2, ...map3});

  Expect.mapEquals({18: 2, 1: 1, 2: 4, 3: 6, 0: 14, 11: 23},
      const {18: 2, ...map1, 0: 14, 11: 23});

  Expect.mapEquals({18: 2, 1: 1, 2: 4, 3: 6, 100: 14, 111: 23, 11: 28, 4: 7,
        31: 12, 48: 299, 88: 41, 999: 14, 1000: 333,  0: 0, 7: 2, 5: 4, 6: 6,
        8: 8, 64: 39},
      const {18: 2, ...map1, 100: 14, 111: 23, ...map2, 48: 299, 88: 41, 999: 14,
        1000: 333, ...map3, 64: 39});
}
