package org.squirrelframework.foundation.fsm.atm;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import org.squirrelframework.foundation.component.SquirrelPostProcessorProvider;
import org.squirrelframework.foundation.component.SquirrelProvider;
import org.squirrelframework.foundation.fsm.ConverterProvider;
import org.squirrelframework.foundation.fsm.SCXMLVisitor;
import org.squirrelframework.foundation.fsm.StateMachineBuilder;
import org.squirrelframework.foundation.fsm.StateMachineBuilderFactory;
import org.squirrelframework.foundation.fsm.StateMachineStatus;
import org.squirrelframework.foundation.fsm.UntypedStateMachineBuilder;
import org.squirrelframework.foundation.fsm.UntypedStateMachineImporter;
import org.squirrelframework.foundation.fsm.atm.ATMStateMachine.ATMState;
public class ATMStateMachineTest {
@AfterClass
public static void afterTest() {
ConverterProvider.INSTANCE.clearRegistry();
SquirrelPostProcessorProvider.getInstance().clearRegistry();
}
private ATMStateMachine stateMachine;
@Before
public void setup() {
StateMachineBuilder<ATMStateMachine, ATMState, String, Void> builder = StateMachineBuilderFactory.create(
ATMStateMachine.class, ATMState.class, String.class, Void.class);
builder.externalTransition().from(ATMState.Idle).to(ATMState.Loading).on("Connected");
builder.externalTransition().from(ATMState.Loading).to(ATMState.Disconnected).on("ConnectionClosed");
builder.externalTransition().from(ATMState.Loading).to(ATMState.InService).on("LoadSuccess");
builder.externalTransition().from(ATMState.Loading).to(ATMState.OutOfService).on("LoadFail");
builder.externalTransition().from(ATMState.OutOfService).to(ATMState.Disconnected).on("ConnectionLost");
builder.externalTransition().from(ATMState.OutOfService).to(ATMState.InService).on("Startup");
builder.externalTransition().from(ATMState.InService).to(ATMState.OutOfService).on("Shutdown");
builder.externalTransition().from(ATMState.InService).to(ATMState.Disconnected).on("ConnectionLost");
builder.externalTransition().from(ATMState.Disconnected).to(ATMState.InService).on("ConnectionRestored");
stateMachine = builder.newStateMachine(ATMState.Idle);
}
@After
public void teardown() {
if(stateMachine!=null && stateMachine.getStatus()!=StateMachineStatus.TERMINATED) {
stateMachine.terminate(null);
}
}
@Test
public void testIdelToInService() {
stateMachine.start();
assertThat(stateMachine.consumeLog(), is(equalTo("entryIdle")));
assertThat(stateMachine.getCurrentState(), is(equalTo(ATMState.Idle)));
stateMachine.fire("Connected");
assertThat(stateMachine.consumeLog(), is(equalTo("exitIdle.transitFromIdleToLoadingOnConnected.entryLoading")));
assertThat(stateMachine.getCurrentState(), is(equalTo(ATMState.Loading)));
stateMachine.fire("LoadSuccess");
assertThat(stateMachine.consumeLog(), is(equalTo("exitLoading.transitFromLoadingToInServiceOnLoadSuccess.entryInService")));
assertThat(stateMachine.getCurrentState(), is(equalTo(ATMState.InService)));
stateMachine.fire("Shutdown");
assertThat(stateMachine.consumeLog(), is(equalTo("exitInService.transitFromInServiceToOutOfServiceOnShutdown.entryOutOfService")));
assertThat(stateMachine.getCurrentState(), is(equalTo(ATMState.OutOfService)));
stateMachine.fire("ConnectionLost");
assertThat(stateMachine.consumeLog(), is(equalTo("exitOutOfService.transitFromOutOfServiceToDisconnectedOnConnectionLost.entryDisconnected")));
assertThat(stateMachine.getCurrentState(), is(equalTo(ATMState.Disconnected)));
stateMachine.fire("ConnectionRestored");
assertThat(stateMachine.consumeLog(), is(equalTo("exitDisconnected.transitFromDisconnectedToInServiceOnConnectionRestored.entryInService")));
assertThat(stateMachine.getCurrentState(), is(equalTo(ATMState.InService)));
}
@Test
public void exportAndImportATMStateMachine() {
SCXMLVisitor visitor = SquirrelProvider.getInstance().newInstance(SCXMLVisitor.class);
stateMachine.accept(visitor);
// visitor.convertSCXMLFile("ATMStateMachine", true);
String xmlDef = visitor.getScxml(false);
UntypedStateMachineBuilder builder = new UntypedStateMachineImporter().importDefinition(xmlDef);
ATMStateMachine stateMachine = builder.newAnyStateMachine(ATMState.Idle);
stateMachine.start();
assertThat(stateMachine.consumeLog(), is(equalTo("entryIdle")));
assertThat(stateMachine.getCurrentState(), is(equalTo(ATMState.Idle)));
stateMachine.fire("Connected");
assertThat(stateMachine.consumeLog(), is(equalTo("exitIdle.transitFromIdleToLoadingOnConnected.entryLoading")));
assertThat(stateMachine.getCurrentState(), is(equalTo(ATMState.Loading)));
}
}