/*
 * 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 the expansion is the then element if the condition
 * expression evaluates to true.
 * @author ngl@unipro.ru
 */
// SharedOptions=--enable-experiment=constant-update-2018
import "../../Utils/expect.dart";

main() {
  const t = true;
  const int x = 1;
  List<int> list1 = const [if (t) x else x + 10, 2];
  Expect.listEquals([1, 2], list1);
  const List<int> list2 = [if (t) x + 1 else x + 11, x];
  Expect.listEquals([2, 1], list2);
  var list3 = const [if (t) x else x + 12, 1];
  Expect.listEquals([1, 1], list3);
  var list4 = const <int>[if (t) x else x + 13, 3];
  Expect.listEquals([1, 3], list4);
  const list5 = [if (t) x else x + 14, 2];
  Expect.listEquals([1, 2], list5);

  Set<int> set1 = const {if (t) x else x + 10, -1};
  Expect.setEquals({1, -1}, set1);
  const Set<int> set2 = {if (t) x - 1 else x + 11, -1};
  Expect.setEquals({0, -1}, set2);
  var set3 = const {if (t) x else x + 12, -1};
  Expect.setEquals({1, -1}, set3);
  var set4 = const <int>{if (t) x + 1 else x + 13, -1};
  Expect.setEquals({2, -1}, set4);
  const set5 = {if (t) x else x + 14, -1};
  Expect.setEquals({1, -1}, set5);

  Map<int, String> map1 = const {if (t) x - 1: "0" else x + 10: "11"};
  Expect.mapEquals({0: "0"}, map1);
  const Map<int, String> map2 = {if (t) x: "1" else x + 11: "12"};
  Expect.mapEquals({1: "1"}, map2);
  var map3 = const {if (t) x + 1: "2" else x + 12: "13"};
  Expect.mapEquals({2: "2"}, map3);
  var map4 = const <int, String>{if (t) x: "x" else x + 13: "14"};
  Expect.mapEquals({1: "x"}, map4);
  const map5 = {if (t) x + 2: "3" else x + 14: "15"};
  Expect.mapEquals({3: "3"}, map5);
}
