use of org.yakindu.sct.model.stext.stext.ReactionEffect in project statecharts by Yakindu.
the class FoldIncomingActionsRefactoring method createEntryBlock.
private EList<Expression> createEntryBlock(List<Expression> actionsToAdd) {
EList<Expression> actionsOriginal;
LocalReaction newLocalReaction = StextFactory.eINSTANCE.createLocalReaction();
ReactionTrigger newReactionTrigger = StextFactory.eINSTANCE.createReactionTrigger();
EntryEvent entryEvent = StextFactory.eINSTANCE.createEntryEvent();
ReactionEffect newReactionEffect = StextFactory.eINSTANCE.createReactionEffect();
newLocalReaction.setTrigger(newReactionTrigger);
newReactionTrigger.getTriggers().add(entryEvent);
newReactionEffect.getActions().addAll(actionsToAdd);
newLocalReaction.setEffect(newReactionEffect);
Scope scope = getContextObject().getScopes().get(0);
scope.getReactions().add(newLocalReaction);
actionsOriginal = newReactionEffect.getActions();
return actionsOriginal;
}
use of org.yakindu.sct.model.stext.stext.ReactionEffect in project statecharts by Yakindu.
the class ModelSequencerStateTest method testStateCycle_EntryActionExclusion.
/**
* Entry action behaviors are not directly part of the states cycle steps
*/
@SuppressWarnings("unused")
@Test
public void testStateCycle_EntryActionExclusion() {
MinimalTSC tsc = new MinimalTSC();
VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, tsc.s_scope);
// add a simple entry action: "entry / x=42;"
LocalReaction lr = _createEntryAction(tsc.s1);
ReactionEffect lr_eff = _createReactionEffect(lr);
AssignmentExpression assign1 = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue(42), lr_eff);
// TRANSFORM
ExecutionFlow flow = sequencer.transform(tsc.sc);
// test state with one outgoing transition
ExecutionState s1 = flow.getStates().get(0);
assertEquals(0, s1.getReactions().size());
assertNotNull(s1.getReactSequence());
assertEquals(1, s1.getReactSequence().getSteps().size());
}
use of org.yakindu.sct.model.stext.stext.ReactionEffect in project statecharts by Yakindu.
the class LocalReactionTest method testSCLocalReaction.
/**
* The transition sequence must contain all exit actions for parent states
* that will be left by a transition.
*/
@Test
public void testSCLocalReaction() {
Statechart sc = _createStatechart("sc");
{
LocalReaction lr0 = _createLocalReaction(sc, _createAlwaysEventSpec(null));
VariableDefinition v = _createVariableDefinition("v", TYPE_INTEGER, getOrCreateInternalScope(sc));
_createVariableAssignment(v, AssignmentOperator.ADD_ASSIGN, _createValue(1), (ReactionEffect) lr0.getEffect());
Region r = _createRegion("r", sc);
{
State s1 = _createState("s1", r);
{
LocalReaction lr1 = _createLocalReaction(s1, _createAlwaysEventSpec(null));
_createVariableAssignment(v, AssignmentOperator.ADD_ASSIGN, _createValue(2), (ReactionEffect) lr1.getEffect());
_createEntryAssignment(v, s1, 1);
Region r_s1 = _createRegion("r", s1);
{
_createState("s3", r_s1);
}
}
State s2 = _createState("s2", r);
{
_createEntryAssignment(v, s2, 1);
Region r_s2 = _createRegion("r", s2);
{
_createState("s6", r_s2);
}
}
}
}
Transition t = _createTransition(findState(sc, "s3"), findState(sc, "s6"));
ReactionTrigger tr = _createReactionTrigger(t);
tr.setGuard(createGuardExpression(_createValue(true)));
ExecutionFlow flow = sequencer.transform(sc);
assertEquals(1, flow.getReactions().size());
ExecutionState _s1 = flow.getStates().get(0);
assertEquals("sc.r.s1", _s1.getName());
// assertEquals(1, _s1.getReactions().size());
ExecutionState _s3 = flow.getStates().get(1);
assertEquals("sc.r.s1.r.s3", _s3.getName());
ExecutionState _s2 = flow.getStates().get(2);
assertEquals("sc.r.s2", _s2.getName());
// assertEquals(1, _s2.getReactions().size());
ExecutionState _s6 = flow.getStates().get(3);
assertEquals("sc.r.s2.r.s6", _s6.getName());
Reaction _t = _s3.getReactions().get(0);
assertTrue(_t.isTransition());
// Check Stateswitch in flow
StateSwitch sSwitch = assertedSwitch(flow.getReactSequence().getSteps().get(0));
assertStateSwitch(sSwitch, _s3, _s6);
assertCall(assertedStateCase(sSwitch, _s3).getStep(), _s3.getReactSequence());
// Check reactSequence of leaf state
Sequence _effect = (Sequence) _t.getEffect();
assertCall(_effect, 0, _s1.getExitSequence());
assertCall(_effect, 1, _s2.getEntryAction());
assertCall(_effect, 2, _s6.getEnterSequences().get(0));
assertEquals(3, _effect.getSteps().size());
List<Step> steps = flattenSequenceStepsAsList(_s3.getReactSequence());
If _if = assertClass(If.class, steps.get(0));
assertEquals(flow.getReactions().get(0).getCheck(), assertClass(CheckRef.class, _if.getCheck()).getCheck());
_if = assertClass(If.class, steps.get(1));
assertEquals(_s1.getReactions().get(0).getCheck(), assertClass(CheckRef.class, _if.getCheck()).getCheck());
_if = assertClass(If.class, steps.get(2));
assertNotNull(assertClass(CheckRef.class, _if.getCheck()).getCheck());
assertCall(_if.getThenStep(), _effect);
}
use of org.yakindu.sct.model.stext.stext.ReactionEffect in project statecharts by Yakindu.
the class StatechartObjectViewerFilter method select.
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof DomainNavigatorItem) {
DomainNavigatorItem navigatorItem = (DomainNavigatorItem) element;
EObject modelElement = navigatorItem.getEObject();
if (modelElement instanceof Diagram) {
return false;
}
if (modelElement instanceof Trigger) {
return false;
}
if (modelElement instanceof InternalScope || modelElement instanceof InterfaceScope) {
return true;
}
if (modelElement instanceof Scope) {
return false;
}
if (modelElement instanceof LocalReaction) {
return false;
}
if (modelElement instanceof ReactionEffect) {
return false;
}
if (modelElement instanceof Expression) {
return false;
}
}
return true;
}
use of org.yakindu.sct.model.stext.stext.ReactionEffect in project statecharts by Yakindu.
the class ModelSequencerStateTest method testStateCycle_WithLocalReactionsOnly.
/**
* The cycle sequence of a state that only consists of local reactions
* includes sequential processing of the local reactions.
*/
@SuppressWarnings("unused")
@Test
public void testStateCycle_WithLocalReactionsOnly() {
MinimalTSC tsc = new MinimalTSC();
VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, tsc.s_scope);
// the first local reaction conforms to "e1 / x=42;"
LocalReaction lr1 = _createLocalReaction(tsc.s1, null);
_createRegularEventSpec(tsc.e1, (ReactionTrigger) lr1.getTrigger());
ReactionEffect lr1_eff = _createReactionEffect(lr1);
AssignmentExpression assign1 = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue(42), lr1_eff);
// the secont local reaction conforms to "e1 [x==42] / x=0;"
LocalReaction lr2 = _createLocalReaction(tsc.s1, null);
_createRegularEventSpec(tsc.e1, (ReactionTrigger) lr2.getTrigger());
LogicalRelationExpression lr2_equals = ExpressionsFactory.eINSTANCE.createLogicalRelationExpression();
lr2_equals.setOperator(RelationalOperator.EQUALS);
ElementReferenceExpression lr2_varRef = ExpressionsFactory.eINSTANCE.createElementReferenceExpression();
lr2_varRef.setReference(v1);
PrimitiveValueExpression lr2_value = _createValue(42);
lr2_equals.setLeftOperand(lr2_varRef);
lr2_equals.setRightOperand(lr2_value);
((ReactionTrigger) lr2.getTrigger()).setGuard(createGuardExpression(lr2_equals));
ReactionEffect lr2_eff = _createReactionEffect(lr2);
AssignmentExpression assign2 = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue(0), lr2_eff);
// the third local reaction conforms to: "[x==0] / x=1;"
LocalReaction lr3 = _createLocalReaction(tsc.s1, null);
LogicalRelationExpression lr3_equals = ExpressionsFactory.eINSTANCE.createLogicalRelationExpression();
lr3_equals.setOperator(RelationalOperator.EQUALS);
ElementReferenceExpression lr3_varRef = ExpressionsFactory.eINSTANCE.createElementReferenceExpression();
lr3_varRef.setReference(v1);
PrimitiveValueExpression lr3_value = _createValue(0);
lr3_equals.setLeftOperand(lr3_varRef);
lr3_equals.setRightOperand(lr3_value);
((ReactionTrigger) lr3.getTrigger()).setGuard(createGuardExpression(lr3_equals));
ReactionEffect lr3_eff = _createReactionEffect(lr3);
AssignmentExpression assign3 = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue(1), lr3_eff);
ExecutionFlow flow = sequencer.transform(tsc.sc);
// test state with one outgoing transition
ExecutionState s1 = flow.getStates().get(0);
assertEquals(tsc.s1.getName(), s1.getSimpleName());
assertEquals(3, s1.getReactions().size());
assertNotNull(s1.getReactSequence());
Step step = s1.getReactSequence().getSteps().get(0);
Sequence _seq = assertedSequence(assertedSequence(assertedSequence(assertedSequence(assertedSequence(step).getSteps().get(0)).getSteps().get(0)).getSteps().get(0)).getSteps().get(0));
assertEquals(3, _seq.getSteps().size());
// check first local reaction
If _lr1 = (If) _seq.getSteps().get(0);
assertClass(ElementReferenceExpression.class, _lr1.getCheck().getCondition());
assertSame(s1.getReactions().get(0).getCheck().getCondition(), _lr1.getCheck().getCondition());
Call _lr1_eff_call = (Call) _lr1.getThenStep();
assertSame(s1.getReactions().get(0).getEffect(), _lr1_eff_call.getStep());
// check second local reaction
If _lr2 = (If) _seq.getSteps().get(1);
assertClass(LogicalAndExpression.class, _lr2.getCheck().getCondition());
assertSame(s1.getReactions().get(1).getCheck().getCondition(), _lr2.getCheck().getCondition());
Call _lr2_eff_call = (Call) _lr2.getThenStep();
assertSame(s1.getReactions().get(1).getEffect(), _lr2_eff_call.getStep());
// check the third local reaction
If _lr3 = (If) _seq.getSteps().get(2);
assertClass(LogicalRelationExpression.class, _lr3.getCheck().getCondition());
assertSame(s1.getReactions().get(2).getCheck().getCondition(), _lr3.getCheck().getCondition());
Call _lr3_eff_call = (Call) _lr3.getThenStep();
assertSame(s1.getReactions().get(2).getEffect(), _lr3_eff_call.getStep());
}
Aggregations