// 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:
/// ...
/// It is a compile-time error if the condition evaluates to false and the else
/// expression, if it exists, is not a constant expression.
///
/// @description Checks that it is not a compile-time error if the condition
/// evaluates to false and the else expression is a constant expression while
/// the if expression is a potentially constant expression.
/// @author ngl@unipro.ru

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

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

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

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