package org.squirrelframework.foundation.issues;
import junit.framework.Assert;
import org.junit.Test;
import org.squirrelframework.foundation.fsm.StateMachineBuilderFactory;
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;
/**
* Created by kailianghe on 12/1/14.
*/
public class Issue27 {
enum Issue17State {Off, Operating, Moving}
enum Issue17Event {Move}
@ContextInsensitive
@StateMachineParameters(stateType=Issue17State.class, eventType=Issue17Event.class, contextType=Void.class)
static class Issue17StateMachine extends AbstractUntypedStateMachine {
StringBuilder logger = new StringBuilder();
void exitOff(Issue17State from, Issue17State to, Issue17Event cause) {
logger.append("exitOff-");
}
void entryOff(Issue17State from, Issue17State to, Issue17Event cause) {
logger.append("entryOff-");
}
void entryMoving(Issue17State from, Issue17State to, Issue17Event cause) {
logger.append("entryMoving-");
}
void entryOperating(Issue17State from, Issue17State to, Issue17Event cause) {
logger.append("entryOperating-");
}
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.Operating, Issue17State.Moving);
builder.externalTransition().from(Issue17State.Off).to(Issue17State.Moving).on(Issue17Event.Move);
Issue17StateMachine fsm = builder.newUntypedStateMachine(Issue17State.Off);
fsm.start();
fsm.fire(Issue17Event.Move);
// System.out.println(fsm.consumeLog());
Assert.assertTrue(fsm.consumeLog().equals("entryOff-exitOff-entryOperating-entryMoving-"));
}
}