package org.squirrelframework.foundation.issues;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Assert;
import org.junit.Test;
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.StateMachine.TransitionDeclinedEvent;
import org.squirrelframework.foundation.fsm.annotation.ContextInsensitive;
import org.squirrelframework.foundation.fsm.annotation.StateMachineParameters;
import org.squirrelframework.foundation.fsm.impl.AbstractUntypedStateMachine;
public class Issue16 {
private static enum Issue16State {
A, B
}
private static enum Issue16Event {
A2B, A2A
}
@ContextInsensitive
@StateMachineParameters(stateType=Issue16State.class, eventType=Issue16Event.class, contextType=Void.class)
private static class Issue16StateMachine extends AbstractUntypedStateMachine {
}
@Test
public void testIssue16() {
final AtomicBoolean timedEventTriggered = new AtomicBoolean(false);
final UntypedStateMachineBuilder builder = StateMachineBuilderFactory.create(Issue16StateMachine.class);
builder.defineTimedState(Issue16State.A, 100, 0, Issue16Event.A2A, null);
builder.transition().from(Issue16State.A).to(Issue16State.A).on(Issue16Event.A2A);
builder.transition().from(Issue16State.A).to(Issue16State.B).on(Issue16Event.A2B);
Issue16StateMachine fsm = builder.newUntypedStateMachine(Issue16State.A);
fsm.addTransitionDeclinedListener(new TransitionDeclinedListener<UntypedStateMachine, Object, Object, Object>() {
@Override
public void transitionDeclined(TransitionDeclinedEvent<UntypedStateMachine, Object, Object, Object> event) {
System.out.println("Transition from "+event.getSourceState()+" on event "+event.getCause()+" is declined.");
timedEventTriggered.set(true);
}
});
fsm.fire(Issue16Event.A2B);
System.out.println("Current state is "+fsm.getCurrentState());
try {
Thread.sleep(300);
} catch (InterruptedException e) {}
if(timedEventTriggered.get()) {
Assert.fail();
}
}
}