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

// Test switch statement using labels.

// VMOptions=
// VMOptions=--force-switch-dispatch-type=0
// VMOptions=--force-switch-dispatch-type=1
// VMOptions=--force-switch-dispatch-type=2

import "package:expect/expect.dart";

class Switcher {
  Switcher() {}

  say1(sound) {
    var x = 0;
    switch (sound) {
      MOO:
      case "moo":
        x = 100;
        break;
      case "woof":
        x = 200;
        continue MOO;
      default:
        x = 300;
        break;
    }
    return x;
  }

  say2(sound) {
    var x = 0;
    switch (sound) {
      WOOF:
      case "woof":
        x = 200;
        break;
      case "moo":
        x = 100;
        continue WOOF;
      default:
        x = 300;
        break;
    }
    return x;
  }

  // forward label to outer switch
  say3(animal, sound) {
    var x = 0;
    switch (animal) {
      case "cow":
        switch (sound) {
          case "moo":
            x = 100;
            break;
          case "muh":
            x = 200;
            break;
          default:
            continue NIX_UNDERSTAND;
        }
        break;
      case "dog":
        if (sound == "woof") {
          x = 300;
        } else {
          continue NIX_UNDERSTAND;
        }
        break;
      NIX_UNDERSTAND:
      case "unicorn":
        x = 400;
        break;
      default:
        x = 500;
        break;
    }
    return x;
  }
}

class SwitchLabelTest {
  static testMain() {
    Switcher s = new Switcher();
    Expect.equals(100, s.say1("moo"));
    Expect.equals(100, s.say1("woof"));
    Expect.equals(300, s.say1("cockadoodledoo"));

    Expect.equals(200, s.say2("moo"));
    Expect.equals(200, s.say2("woof"));
    Expect.equals(300, s.say2("")); // Dead unicorn says nothing.

    Expect.equals(100, s.say3("cow", "moo"));
    Expect.equals(200, s.say3("cow", "muh"));
    Expect.equals(400, s.say3("cow", "boeh")); // Don't ask.
    Expect.equals(300, s.say3("dog", "woof"));
    Expect.equals(400, s.say3("dog", "boj")); // Ĉu vi parolas Esperanton?
    Expect.equals(400, s.say3("unicorn", "")); // Still dead.
    Expect.equals(500, s.say3("angry bird", "whoooo"));
  }
}

main() {
  SwitchLabelTest.testMain();
}
