@Test
 public void subwayTurnstileOne() throws Exception {
   SemanticStateMachine ast =
       produceAst(
           ""
               + "Actions: Turnstile\n"
               + "FSM: OneCoinTurnstile\n"
               + "Initial: Locked\n"
               + "{\n"
               + "  Locked\tCoin\tUnlocked\t{alarmOff unlock}\n"
               + "  Locked \tPass\tLocked\t\talarmOn\n"
               + "  Unlocked\tCoin\tUnlocked\tthankyou\n"
               + "  Unlocked\tPass\tLocked\t\tlock\n"
               + "}");
   assertThat(
       ast.toString(),
       equalTo(
           ""
               + "Actions: Turnstile\n"
               + "FSM: OneCoinTurnstile\n"
               + "Initial: Locked{\n"
               + "  Locked {\n"
               + "    Coin Unlocked {alarmOff unlock}\n"
               + "    Pass Locked {alarmOn}\n"
               + "  }\n"
               + "\n"
               + "  Unlocked {\n"
               + "    Coin Unlocked {thankyou}\n"
               + "    Pass Locked {lock}\n"
               + "  }\n"
               + "}\n"));
 }
 @Test
 public void subwayTurnstileThree() throws Exception {
   SemanticStateMachine ast =
       produceAst(
           ""
               + "Actions: Turnstile\n"
               + "FSM: TwoCoinTurnstile\n"
               + "Initial: Locked\n"
               + "{\n"
               + "    (Base)\tReset\tLocked\tlock\n"
               + "\n"
               + "\tLocked : Base {\n"
               + "\t\tPass\tAlarming\t-\n"
               + "\t\tCoin\tFirstCoin\t-\n"
               + "\t}\n"
               + "\t\n"
               + "\tAlarming : Base\t<alarmOn >alarmOff -\t-\t-\n"
               + "\t\n"
               + "\tFirstCoin : Base {\n"
               + "\t\tPass\tAlarming\t-\n"
               + "\t\tCoin\tUnlocked\tunlock\n"
               + "\t}\n"
               + "\t\n"
               + "\tUnlocked : Base {\n"
               + "\t\tPass\tLocked\tlock\n"
               + "\t\tCoin\t-\t\tthankyou\n"
               + "\t}\n"
               + "}");
   assertThat(
       ast.toString(),
       equalTo(
           ""
               + "Actions: Turnstile\n"
               + "FSM: TwoCoinTurnstile\n"
               + "Initial: Locked{\n"
               + "  Alarming :Base <alarmOn >alarmOff {\n"
               + "    null Alarming {}\n"
               + "  }\n"
               + "\n"
               + "  (Base) {\n"
               + "    Reset Locked {lock}\n"
               + "  }\n"
               + "\n"
               + "  FirstCoin :Base {\n"
               + "    Pass Alarming {}\n"
               + "    Coin Unlocked {unlock}\n"
               + "  }\n"
               + "\n"
               + "  Locked :Base {\n"
               + "    Pass Alarming {}\n"
               + "    Coin FirstCoin {}\n"
               + "  }\n"
               + "\n"
               + "  Unlocked :Base {\n"
               + "    Pass Locked {lock}\n"
               + "    Coin Unlocked {thankyou}\n"
               + "  }\n"
               + "}\n"));
 }
 private void assertSemanticResult(String s, String expected) {
   SemanticStateMachine semanticStateMachine = produceAst(s);
   assertEquals(expected, semanticStateMachine.toString());
 }