// 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.

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 work when there is a case that calls a function
// that always throws, and there is no break in the switch statement.
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);
}
