public class HierarchicalStateMachineTest {
public enum HState {
A, D, E, E1
}
public enum HEvent {
A2D, D2E1
}
@States({
@State(name="A", initialState=true),
@State(name="D", entryCallMethod="enterD", exitCallMethod="leftD"),
@State(name="E", entryCallMethod="enterE", exitCallMethod="leftE"),
@State(parent="E", name="E1", entryCallMethod="enterE1", exitCallMethod="leftE1"),
})
@Transitions({
@Transit(from="A", to="D", on="A2D", callMethod="transitA2D"),
@Transit(from="D", to="E1", on="D2E1", callMethod="transitD2E1"),
@Transit(from="A", to="C", on="Finish", callMethod="transitA2C"),
})
static class HierachicalStateMachine extends AbstractStateMachine<HierachicalStateMachine, HState, HEvent, Integer> {
... methods definitions as in HierarchicalStateMachineTest from the Squirrel Test Suite
}
@Test
public void testChildTransition() {
stateMachine.start();
stateMachine.consumeLog();
stateMachine.fire(HEvent.A2D, 1);
stateMachine.consumeLog();
stateMachine.fire(HEvent.D2E1, 2);
assertThat(stateMachine.consumeLog(), is(equalTo("leftD.transitD2E1.enterE.enterE1")));
assertThat(stateMachine.getCurrentState(), is(equalTo(HState.E1)));
}