package org.squirrelframework.foundation.fsm;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.squirrelframework.foundation.fsm.annotation.StateMachineParameters;
import org.squirrelframework.foundation.fsm.annotation.Transit;
import org.squirrelframework.foundation.fsm.annotation.Transitions;
import org.squirrelframework.foundation.fsm.impl.AbstractUntypedStateMachine;
public class StateMachineImporterTest {
enum TestEvent {
toA, toB, toC, toD
}
@Transitions({
@Transit(from="a", to="b", on="toB")
})
@StateMachineParameters(stateType=String.class, eventType=TestEvent.class, contextType=Integer.class)
static class ImportParameterizedActionCase extends AbstractUntypedStateMachine {
}
@Test(expected=IllegalArgumentException.class)
public void testImportParameterizedActionFail() {
UntypedStateMachineBuilder builder =
StateMachineBuilderFactory.create(ImportParameterizedActionCase.class);
builder.externalTransition().from("a").to("b").on(TestEvent.toB).perform(new UntypedAnonymousAction() {
@Override
public void execute(Object from, Object to, Object event, Object context,
UntypedStateMachine stateMachine) {
}
});
ImportParameterizedActionCase sample = builder.newUntypedStateMachine("a");
String definition = sample.exportXMLDefinition(false);
UntypedStateMachineBuilder importedBuilder = new UntypedStateMachineImporter().importDefinition(definition);
}
@Test
public void testImportNonParameterizedActionSuccess() {
UntypedStateMachineBuilder builder =
StateMachineBuilderFactory.create(ImportParameterizedActionCase.class);
builder.externalTransition().from("a").to("b").on(TestEvent.toB).perform(Action.DUMMY_ACTION);
ImportParameterizedActionCase sample = builder.newUntypedStateMachine("a");
UntypedStateMachineBuilder importedBuilder =
new UntypedStateMachineImporter().importDefinition(sample.exportXMLDefinition(false));
ImportParameterizedActionCase importedSample = importedBuilder.newAnyStateMachine("a");
importedSample.fire(TestEvent.toB);
assertTrue(importedSample.getCurrentState().equals("b"));
}
@Test
public void testCloneStateMachineBuilder() {
UntypedStateMachineBuilder builder =
StateMachineBuilderFactory.create(ImportParameterizedActionCase.class);
ImportParameterizedActionCase orgSample = builder.newUntypedStateMachine("a");
orgSample.fire(TestEvent.toB);
UntypedStateMachineBuilder clonedBuilder =
new UntypedStateMachineImporter().importDefinition(orgSample.exportXMLDefinition(false));
// add new transition after clone a new state machine builder
clonedBuilder.externalTransition().from("a").to("c").on(TestEvent.toC);
ImportParameterizedActionCase newSample = clonedBuilder.newAnyStateMachine("a");
newSample.fire(TestEvent.toC);
assertTrue(orgSample.getCurrentState().equals("b"));
assertTrue(newSample.getCurrentState().equals("c"));
}
}