/*
 * 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 if element:
 * ...
 * The expansion is:
 * - The then element if the condition expression evaluates to true.
 * - The else element if the condition is false and there is one.
 * - Otherwise, the if element expands to nothing.
 *
 * @description Checks that if element expands to nothing if the condition
 * evaluates to false and the else expression is not exist.
 * @author ngl@unipro.ru
 */
// SharedOptions=--enable-experiment=constant-update-2018
import "../../Utils/expect.dart";

main() {
  const t = false;
  List<int> list1 = const [if (t) 1, 11];
  Expect.listEquals([11], list1);
  const List<int> list2 = [if (t) 2, 12];
  Expect.listEquals([12], list2);
  var list3 = const [if (t) 3, 13];
  Expect.listEquals([13], list3);
  var list4 = const <int>[if (t) 4, 14];
  Expect.listEquals([14], list4);
  const list5 = [if (t) 5, 15];
  Expect.listEquals([15], list5);

  Set<int> set1 = const {if (t) 1, -1};
  Expect.setEquals({-1}, set1);
  const Set<int> set2 = {if (t) 2, -2};
  Expect.setEquals({-2}, set2);
  var set3 = const {if (t) 3, -3};
  Expect.setEquals({-3}, set3);
  var set4 = const <int>{if (t) 4, -4};
  Expect.setEquals({-4}, set4);
  const set5 = {if (t) 5, -5};
  Expect.setEquals({-5}, set5);

  Map<int, String> map1 = const {if (t) 1: "1x", 11: "x1"};
  Expect.mapEquals({11: "x1"}, map1);
  const Map<int, String> map2 = {if (t) 2: "2x", 12: "x2"};
  Expect.mapEquals({12: "x2"}, map2);
  var map3 = const {if (t) 3: "3x", 13: "x3"};
  Expect.mapEquals({13: "x3"}, map3);
  var map4 = const <int, String>{if (t) 4: "4x", 14: "x4"};
  Expect.mapEquals({14: "x4"}, map4);
  const map5 = {if (t) 5: "5x", 15: "x5"};
  Expect.mapEquals({15: "x5"}, map5);
}
