// Copyright (c) 2021, 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.

// Tests switch statements for const functions.

// SharedOptions=--enable-experiment=const-functions

import "package:expect/expect.dart";

const var1 = basicSwitch(1);
//           ^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var2 = basicSwitch(2);
//           ^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int basicSwitch(int x) {
  switch (x) {
    case 1:
      return 100;
    default:
      x++;
      break;
  }
  return x;
}

const var3 = multipleCaseSwitch(1);
//           ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var4 = multipleCaseSwitch(2);
//           ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var5 = multipleCaseSwitch(3);
//           ^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int multipleCaseSwitch(int x) {
  switch (x) {
    case 1:
    case 2:
      return 100;
    default:
      break;
  }
  return 0;
}

const var6 = continueLabelSwitch(1);
//           ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var7 = continueLabelSwitch(2);
//           ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var8 = continueLabelSwitch(3);
//           ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
const var9 = continueLabelSwitch(4);
//           ^^^^^^^^^^^^^^^^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
int continueLabelSwitch(int x) {
  switch (x) {
    label1:
    case 1:
      x = x + 100;
      continue label3;
    case 2:
      continue label1;
    label3:
    case 3:
      return x + 3;
  }
  return 0;
}

void main() {
  Expect.equals(var1, 100);
  Expect.equals(var2, 3);
  Expect.equals(var3, 100);
  Expect.equals(var4, 100);
  Expect.equals(var5, 0);
  Expect.equals(var6, 104);
  Expect.equals(var7, 105);
  Expect.equals(var8, 6);
  Expect.equals(var9, 0);
}
