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

// In Dart 3.0, switch cases implicitly exit, so it's not an error to have a
// case that contains only a function that throws. Pin to 2.19 to test that
// older error-reporting behavior.
// @dart=2.19

import "package:expect/expect.dart";

switcher(val) {
  var x = 0;
  switch (val) {
    case 1:
      x = 100;
      break;
    case 2:
      x = 200;
      break;
    case 3:
      x = 300;
      break;
    default:
      return 400;
      break; // Intentional dead code (regression test for crash).
  }
  return x;
}

// Check unambiguated grammar allowing multiple labels per case/default.
switcher2(val) {
  var x = 0;
  switch (val) {
    foo:
    bar:
    case 1:
    baz:
    case 2:
      fez:
      {
        x = 100;
        break fez;
      }
      break;
    hest:
    fisk:
    case 3:
    case 4:
    svin:
    default:
      barber:
      {
        if (val > 2) {
          x = 200;
          break;
        } else {
          // Enable when continue to switch-case is implemented.
          continue hest;
        }
      }
  }
  return x;
}

var x = 0;

@pragma('dart2js:noInline')
switcher3(val) {
  switch (val) {
    case 1:
    default:
      incrementX();
  }
}

// Tests that switch cases that don't exit report an error even when the case
// body calls a function that the compiler can infer always throws, and there
// is no break in the switch case body.
switcher4(val) {
  switch (val) {
    case 1:
      return 100;
    case 2: _throw(); //# 00: compile-time error
    case 3:
      _throw();
      break;
    default:
      return 300;
  }
}

_throw() {
  throw 'exception';
}

// Tests that we generate a break after the last case if it isn't default.
switcher5(val) {
  var x = 0;
  switch(val) {
    case 1:
      return 100;
    case 2:
      return 200;
    case 3:
      x = 300;
  }
  return x;
}

incrementX() {
  x++;
}

badswitches(val) {
  // Test some badly formed switch bodies.
  // 01 - a label/statement without a following case/default.
  // 02 - a label without a following case/default or statement.
  switch (val) {
    foo: break; //    //# 01: compile-time error
    case 2: //        //# 02: compile-time error
    foo: //           //# 02: continued
  }
}

main() {
  Expect.equals(100, switcher(1));
  Expect.equals(200, switcher(2));
  Expect.equals(300, switcher(3));
  Expect.equals(400, switcher(4));

  Expect.equals(100, switcher2(1));
  Expect.equals(100, switcher2(2));
  Expect.equals(200, switcher2(3));
  Expect.equals(200, switcher2(4));
  Expect.equals(200, switcher2(5));


  switcher3(1);
  Expect.equals(1, x);

  Expect.equals(100, switcher4(1));

  Expect.equals(100, switcher5(1));
  Expect.equals(200, switcher5(2));
  Expect.equals(300, switcher5(3));

  badswitches(42);
}
