// 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

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);
}
