/*
 * Copyright (c) 2018, 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 Each element in a map can be one of a few things:
 *  A normal expression.
 *  An if element.
 *  A for element.
 *  The body of if and for elements use listElement, not expression, which
 *  allows nesting.
 *
 * @description Checks that each element in the map can be a normal expression,
 * 'if' element or 'for' element
 * @author sgrekhov@unipro.ru
 */
// SharedOptions=--enable-experiment=constant-update-2018
import "../../Utils/expect.dart";

main() {
  bool b = true;
  Map<int, String> map1 = {
    0: "0",
    if (b) 1: "1",
    if (!b) 2 : "2",
    for (int i = 5; i < 9; i++) i: "$i"
  };
  Expect.mapEquals({0: "0", 1: "1", 5: "5", 6: "6", 7: "7", 8: "8"}, map1);

  Expect.mapEquals({}, {
    if (false) 0: "x",
    for (int i = 0; i < -1; i++) 1: "y"
  });

  Iterable<String> collection = ["not", "to", "be"];
  Map map2 = <String, String>{
    "0": "To",
    "1": "be",
    if (b) "2": "or",
    if (!b) "3": "and",
    for (var v in collection) v.substring(0, 1): v
  };
  Expect.mapEquals({
    "0": "To",
    "1": "be",
    "2": "or",
    "n": "not",
    "t": "to",
    "b": "be"
  }, map2);

  const constMap = const <int, String>{
    0: "0",
    if (1 >  2) 1: "1",
    if (2 > 1)  2: "2",
    3: "3"
  };
  Expect.mapEquals({0: "0", 2: "2", 3: "3"}, constMap);
}
