use of org.yakindu.base.expressions.expressions.ElementReferenceExpression 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());
}
use of org.yakindu.base.expressions.expressions.ElementReferenceExpression in project statecharts by Yakindu.
the class ModelSequencerStateTest method testStateCycle_WithLocalReactions.
@SuppressWarnings("unused")
@Test
public void testStateCycle_WithLocalReactions() {
SimpleFlatTSC tsc = new SimpleFlatTSC();
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);
ExecutionState s2 = flow.getStates().get(1);
assertEquals(tsc.s1.getName(), s1.getSimpleName());
assertEquals(tsc.s2.getName(), s2.getSimpleName());
assertEquals(4, s1.getReactions().size());
assertNotNull(s1.getReactSequence());
Step step = s1.getReactSequence().getSteps().get(0);
If _if = (If) assertedSequence(assertedSequence(assertedSequence(step).getSteps().get(0)).getSteps().get(0)).getSteps().get(0);
assertNotNull(_if.getThenStep());
assertClass(Call.class, _if.getThenStep());
assertNotNull(_if.getElseStep());
Sequence _seq = assertedSequence(assertedSequence(_if.getElseStep()).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());
}
use of org.yakindu.base.expressions.expressions.ElementReferenceExpression in project statecharts by Yakindu.
the class SCTResourceTest method testParsingOnLoad.
@Test
public void testParsingOnLoad() throws Exception {
File tmpFile = File.createTempFile("SCTResource", "test.test");
tmpFile.deleteOnExit();
URI uri = URI.createFileURI(tmpFile.getPath().toString());
Resource resource = new XMIResourceImpl(uri);
Statechart statechart = createStatechart("internal: event Event1");
resource.getContents().add(statechart);
Transition transition = createTransition("Event1 [true] / 3 * 3");
resource.getContents().add(transition);
resource.save(Collections.EMPTY_MAP);
res.setURI(uri);
res.load(Collections.EMPTY_MAP);
statechart = (Statechart) res.getContents().get(0);
transition = (Transition) res.getContents().get(1);
assertEquals("" + res.getErrors(), 0, res.getErrors().size());
ReactionTrigger trigger = (ReactionTrigger) transition.getTrigger();
RegularEventSpec eventSpec = (RegularEventSpec) trigger.getTriggers().get(0);
ElementReferenceExpression expression = (ElementReferenceExpression) eventSpec.getEvent();
EventDefinition reference = (EventDefinition) expression.getReference();
assertNotNull(reference);
assertEquals("Event1", reference.getName());
}
use of org.yakindu.base.expressions.expressions.ElementReferenceExpression in project statecharts by Yakindu.
the class ModelSequencerStateReactionTest method testSingleTransitionTimeTrigger.
/**
* If a time trigger is defined for a transition then an event must be
* introduced into the execution flow.
*/
@SuppressWarnings("unused")
@Test
public void testSingleTransitionTimeTrigger() {
Statechart sc = _createStatechart("test");
Scope scope = _createInterfaceScope("interface", sc);
VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, scope);
Region r = _createRegion("main", sc);
State s = _createState("s", r);
Transition t = _createTransition(s, s);
ReactionTrigger tr1 = _createReactionTrigger(t);
_createTimeEventSpec(TimeEventType.AFTER, _createValue(1), TimeUnit.SECOND, tr1);
AssignmentExpression assign = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue(42), (ReactionEffect) t.getEffect());
ExecutionFlow flow = sequencer.transform(sc);
// assert definition of time event
Scope timerScope = flow.getScopes().get(1);
assertTrue(timerScope.getDeclarations().get(0) instanceof TimeEvent);
TimeEvent te = (TimeEvent) timerScope.getDeclarations().get(0);
// assert that the reaction check checks the time event
assertEquals(1, flow.getStates().size());
ExecutionState _s = flow.getStates().get(0);
assertEquals(s.getName(), _s.getSimpleName());
If _if = (If) SCTTestUtil.flattenSequenceStepsAsList(flow.getStates().get(0).getReactSequence()).get(0);
ElementReferenceExpression _ere = (ElementReferenceExpression) _if.getCheck().getCondition();
assertSame(te, _ere.getReference());
// assert the scheduling of the time event during state entry
assertNotNull(_s.getEntryAction());
Sequence entryAction = (Sequence) _s.getEntryAction();
ScheduleTimeEvent ste = (ScheduleTimeEvent) entryAction.getSteps().get(0);
assertSame(te, ste.getTimeEvent());
NumericalMultiplyDivideExpression multiply = (NumericalMultiplyDivideExpression) ste.getTimeValue();
assertIntLiteral(1, ((PrimitiveValueExpression) multiply.getLeftOperand()).getValue());
assertIntLiteral(1000, ((PrimitiveValueExpression) multiply.getRightOperand()).getValue());
assertEquals(MultiplicativeOperator.MUL, multiply.getOperator());
// assert the unscheduling of the time events during state exit
assertNotNull(_s.getExitAction());
Sequence exitAction = (Sequence) _s.getExitAction();
UnscheduleTimeEvent ute = (UnscheduleTimeEvent) exitAction.getSteps().get(0);
assertSame(te, ute.getTimeEvent());
}
use of org.yakindu.base.expressions.expressions.ElementReferenceExpression in project statecharts by Yakindu.
the class ModelSequencertDeclarationsTest method testTriggerEventDeclarationIntegrity.
/**
* The event refs used in the trigger condition must refer to the event
* declarations in the flow model and not the sc source model.
*/
@Test
public void testTriggerEventDeclarationIntegrity() {
Statechart sc = _createStatechart("test");
InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
EventDefinition e1 = _createEventDefinition("e1", s_scope);
Region r = _createRegion("main", sc);
State s1 = _createState("S1", r);
State s2 = _createState("S2", r);
Transition t = _createTransition(s1, s2);
ReactionTrigger tr1 = _createReactionTrigger(t);
_createRegularEventSpec(e1, tr1);
ExecutionFlow flow = sequencer.transform(sc);
EventDefinition _e1 = (EventDefinition) flow.getScopes().get(0).getDeclarations().get(0);
assertNotSame(e1, _e1);
assertEquals(e1.getName(), _e1.getName());
assertEquals(2, flow.getStates().size());
assertEquals(s1.getName(), flow.getStates().get(0).getSimpleName());
Step step = flow.getStates().get(0).getReactSequence().getSteps().get(0);
If _if = (If) assertedSequence(assertedSequence(assertedSequence(step).getSteps().get(0)).getSteps().get(0)).getSteps().get(0);
ElementReferenceExpression _ere = (ElementReferenceExpression) _if.getCheck().getCondition();
assertSame(_e1, _ere.getReference());
}
Aggregations