use of org.yakindu.sct.model.sgraph.Region in project statecharts by Yakindu.
the class ModelSequencerHierarchyTest method testParentExitDeep.
/**
* The transition sequence must contain all exit actions for parent states
* that will be left by a transition.
*/
@SuppressWarnings("unused")
@Test
public void testParentExitDeep() {
Statechart sc = _createStatechart("sc");
{
InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, s_scope);
Region r = _createRegion("r", sc);
{
State s1 = _createState("s1", r);
{
_createExitAssignment(v1, s1, 1);
Region r_s1 = _createRegion("r", s1);
{
State s3 = _createState("s3", r_s1);
{
_createExitAssignment(v1, s3, 2);
Region r_s3 = _createRegion("r", s3);
{
State s4 = _createState("s4", r_s3);
_createExitAssignment(v1, s4, 3);
State s5 = _createState("s5", r_s3);
}
}
}
}
State s2 = _createState("s2", r);
{
Region r_s1 = _createRegion("r", s2);
{
_createState("s6", r_s1);
}
}
}
}
_createTransition(findState(sc, "s4"), findState(sc, "s6"));
ExecutionFlow flow = sequencer.transform(sc);
ExecutionState _s1 = flow.getStates().get(0);
assertEquals("sc.r.s1", _s1.getName());
assertNotNull(_s1.getExitAction());
ExecutionState _s3 = flow.getStates().get(1);
assertEquals("sc.r.s1.r.s3", _s3.getName());
assertNotNull(_s3.getExitAction());
ExecutionState _s4 = flow.getStates().get(2);
assertEquals("sc.r.s1.r.s3.r.s4", _s4.getName());
assertNotNull(_s4.getExitAction());
ExecutionState _s6 = flow.getStates().get(5);
assertEquals("sc.r.s2.r.s6", _s6.getName());
Reaction _t = _s4.getReactions().get(0);
assertTrue(_t.isTransition());
Sequence _effect = (Sequence) _t.getEffect();
assertEquals(2, _effect.getSteps().size());
assertCall(_effect, 0, _s1.getExitSequence());
assertCall(_effect, 1, _s6.getEnterSequences().get(0));
assertCall(_s1.getExitSequence(), 0, _s1.getSubScopes().get(0).getExitSequence());
StateSwitch _switch = (StateSwitch) _s1.getSubScopes().get(0).getExitSequence().getSteps().get(0);
StateCase _s4_case = assertedStateCase(_switch, _s4);
assertCall(assertedSequence(_s4_case.getStep()), 0, _s4.getExitSequence());
assertCall(assertedSequence(_s4_case.getStep()), 1, _s3.getExitAction());
assertCall(_s1.getExitSequence(), 1, _s1.getExitAction());
}
use of org.yakindu.sct.model.sgraph.Region in project statecharts by Yakindu.
the class FactoryUtils method createStatechartModel.
/**
* Creates a Statechart with an initial Region and an initial State
*
* @return instanceof {@link Statechart}
*/
public static void createStatechartModel(Resource resource, PreferencesHint preferencesHint) {
// Create a statechart
Statechart statechart = SGraphFactory.eINSTANCE.createStatechart();
String lastSegment = resource.getURI().lastSegment();
String statechartName = lastSegment.substring(0, lastSegment.indexOf('.'));
statechart.setName(statechartName);
statechart.setSpecification(INITIAL_SPECIFICATION);
Diagram diagram = ViewService.createDiagram(statechart, StatechartDiagramEditor.ID, preferencesHint);
diagram.setElement(statechart);
// Add to resource
resource.getContents().add(statechart);
resource.getContents().add(diagram);
// Create an initial region
Region region = SGraphFactory.eINSTANCE.createRegion();
region.setName(INITIAL_REGION_NAME);
statechart.getRegions().add(region);
Node regionView = ViewService.createNode(diagram, region, SemanticHints.REGION, preferencesHint);
setRegionViewLayoutConstraint(regionView);
// // Create an initial state
Entry initialState = SGraphFactory.eINSTANCE.createEntry();
initialState.setKind(EntryKind.INITIAL);
region.getVertices().add(initialState);
Node initialStateView = ViewService.createNode(getRegionCompartmentView(regionView), initialState, SemanticHints.ENTRY, preferencesHint);
setInitialStateViewLayoutConstraint(initialStateView);
// Create the first state
State state = SGraphFactory.eINSTANCE.createState();
state.setName("StateA");
region.getVertices().add(state);
Node stateNode = ViewService.createNode(getRegionCompartmentView(regionView), state, SemanticHints.STATE, preferencesHint);
setStateViewLayoutConstraint(stateNode);
// Create the transition from Initial State to State
Transition transition = SGraphFactory.eINSTANCE.createTransition();
transition.setSource(initialState);
transition.setTarget(state);
initialState.getOutgoingTransitions().add(transition);
ViewService.createEdge(initialStateView, stateNode, transition, SemanticHints.TRANSITION, preferencesHint);
// Create the textcompartment for events / variables
Node textCompartment = ViewService.createNode(diagram, statechart, SemanticHints.STATECHART_TEXT, preferencesHint);
setTextCompartmentLayoutConstraint(textCompartment);
}
use of org.yakindu.sct.model.sgraph.Region in project statecharts by Yakindu.
the class TransitionsWithNoTriggerTest method missingTriggerOnSyncSingleIncoming.
/**
* If a sync node has multiple incoming transitions then the transitions can omit the trigger.
*/
@Test
public void missingTriggerOnSyncSingleIncoming() {
statechart = loadStatechart("ValidEmptyTransitionFromSync.sct");
Region validRegion = firstNamed(eAllOfType(statechart, Region.class), "warning");
Synchronization sync = eAllOfType(validRegion, Synchronization.class).get(0);
assertEquals(1, sync.getIncomingTransitions().size());
assertTrue(validate(sync.getIncomingTransitions().get(0)));
assertIssueCount(diagnostics, 1);
assertWarning(diagnostics, ISSUE_TRANSITION_WITHOUT_TRIGGER);
}
use of org.yakindu.sct.model.sgraph.Region in project statecharts by Yakindu.
the class TransitionsWithNoTriggerTest method noTriggerOnSyncIncoming.
/**
* If a sync node has multiple incoming transitions then the transitions can omit the trigger.
*/
@Test
public void noTriggerOnSyncIncoming() {
statechart = loadStatechart("ValidEmptyTransitionFromSync.sct");
Region validRegion = firstNamed(eAllOfType(statechart, Region.class), "valid");
Synchronization sync = eAllOfType(validRegion, Synchronization.class).get(0);
for (Transition t : sync.getIncomingTransitions()) {
assertTrue(validate(t));
assertIssueCount(diagnostics, 0);
}
}
use of org.yakindu.sct.model.sgraph.Region in project statecharts by Yakindu.
the class SGraphJavaValidationTest method vertexNotReachable_FailOnExternalPseudoPathToSubstate.
/**
* If an incoming transitions is part of an external transition path to an
* internal state that only consists of pseudo states and only has state
* predecessors within the state then the state is not reachable and the
* validation must fail with an error.
*/
@Test
public void vertexNotReachable_FailOnExternalPseudoPathToSubstate() {
prepareStateTest();
Region subRegion = factory.createRegion();
state.getRegions().add(subRegion);
State stateA = factory.createState();
subRegion.getVertices().add(stateA);
Choice choice = factory.createChoice();
region.getVertices().add(choice);
createTransition(stateA, choice);
createTransition(choice, stateA);
validate(state);
assertIssue(diagnostics, ISSUE_NODE_NOT_REACHABLE);
}
Aggregations