package org.squirrelframework.foundation.issues; import org.junit.Test; import org.squirrelframework.foundation.fsm.AnonymousAction; import org.squirrelframework.foundation.fsm.StateMachineBuilder; import org.squirrelframework.foundation.fsm.StateMachineBuilderFactory; import org.squirrelframework.foundation.fsm.annotation.ContextInsensitive; import org.squirrelframework.foundation.fsm.impl.AbstractStateMachine; import static org.junit.Assert.assertEquals; public class Issue31 { @Test public void performsTransactionOnEventFromAction() { FSM fsm = createFSM(); fsm.start(); fsm.fire(Event.Stop); assertEquals(State.Working, fsm.getCurrentState()); } private static FSM createFSM() { StateMachineBuilder<FSM, State, Event, Void> builder = StateMachineBuilderFactory.create(FSM.class, State.class, Event.class, Void.class); builder.externalTransition().from(State.Idle).to(State.Working).on(Event.Start); builder.externalTransition().from(State.Working).to(State.Idle).on(Event.Stop); builder.onEntry(State.Idle).perform(new LoggerAction("Idle entry") { @Override public void execute(State from, State to, Event event, Void context, FSM stateMachine) { super.execute(from, to, event, context, stateMachine); stateMachine.fire(Event.Start); } }); builder.onExit(State.Idle).perform(new LoggerAction("Idle exit")); builder.onEntry(State.Working).perform(new LoggerAction("Working entry")); builder.onExit(State.Working).perform(new LoggerAction("Working exit")); return builder.newStateMachine(State.Idle); } private static class LoggerAction extends AnonymousAction<FSM, State, Event, Void> { private final String str; public LoggerAction(String str) { this.str = str; } @Override public void execute(State from, State to, Event event, Void context, FSM stateMachine) { System.err.println(str); } } @ContextInsensitive private static class FSM extends AbstractStateMachine<FSM, State, Event, Void> { } private static enum State { Idle, Working } private static enum Event { Start, Stop } }