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

// @dart = 2.9

// 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();
}
