package org.squirrelframework.foundation.issues;
import junit.framework.Assert;
import org.junit.Test;
import org.squirrelframework.foundation.fsm.StateMachine.TransitionDeclinedEvent;
import org.squirrelframework.foundation.fsm.StateMachine.TransitionDeclinedListener;
import org.squirrelframework.foundation.fsm.StateMachineBuilderFactory;
import org.squirrelframework.foundation.fsm.UntypedStateMachine;
import org.squirrelframework.foundation.fsm.UntypedStateMachineBuilder;
import org.squirrelframework.foundation.fsm.annotation.ContextInsensitive;
import org.squirrelframework.foundation.fsm.annotation.StateMachineParameters;
import org.squirrelframework.foundation.fsm.impl.AbstractUntypedStateMachine;
public class Issue17 {
enum Issue17State {A, A1, A2}
enum Issue17Event {SAME, NEXT}
@ContextInsensitive
@StateMachineParameters(stateType=Issue17State.class, eventType=Issue17Event.class, contextType=Void.class)
static class Issue17StateMachine extends AbstractUntypedStateMachine {
StringBuilder logger = new StringBuilder();
void onA1ToA2(Issue17State from, Issue17State to, Issue17Event cause) {
logger.append("onA1ToA2");
}
void onSameWithinA(Issue17State from, Issue17State to, Issue17Event cause) {
logger.append("onSameWithinA");
}
String consumeLog() {
final String result = logger.toString();
logger = new StringBuilder();
return result;
}
}
@Test
public void testIssue17() {
final UntypedStateMachineBuilder builder = StateMachineBuilderFactory.create(Issue17StateMachine.class);
builder.defineSequentialStatesOn(Issue17State.A, Issue17State.A1, Issue17State.A2);
builder.internalTransition().within(Issue17State.A).on(Issue17Event.SAME).callMethod("onSameWithinA");
builder.localTransition().from(Issue17State.A1).to(Issue17State.A2).on(Issue17Event.NEXT).callMethod("onA1ToA2");
Issue17StateMachine fsm = builder.newUntypedStateMachine(Issue17State.A);
fsm.addTransitionDeclinedListener(new TransitionDeclinedListener<UntypedStateMachine, Object, Object, Object>() {
@Override
public void transitionDeclined(
TransitionDeclinedEvent<UntypedStateMachine, Object, Object, Object> event) {
System.out.println("Transition declined from state "+event.getSourceState()+" on event "+event.getCause());
}
});
fsm.start();
fsm.fire(Issue17Event.NEXT);
fsm.fire(Issue17Event.SAME);
Assert.assertTrue(fsm.consumeLog().equals("onA1ToA2"));
}
}