/** * If a time trigger is defined for a transition then an event must be introduced into the * execution flow. */ @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()); }
@Check(CheckType.FAST) public void checkValueReferenedBeforeDefined(Scope scope) { EList<Declaration> declarations = scope.getDeclarations(); Set<QualifiedName> defined = Sets.newHashSet(); for (Declaration declaration : declarations) { if (declaration instanceof VariableDefinition) { VariableDefinition definition = (VariableDefinition) declaration; if (!definition.isConst()) return; Expression initialValue = definition.getInitialValue(); List<Expression> toCheck = Lists.newArrayList(initialValue); TreeIterator<EObject> eAllContents = initialValue.eAllContents(); while (eAllContents.hasNext()) { EObject next = eAllContents.next(); if (next instanceof Expression) toCheck.add((Expression) next); } for (Expression expression : toCheck) { EObject referencedObject = null; if (expression instanceof FeatureCall) referencedObject = ((FeatureCall) expression).getFeature(); else if (expression instanceof ElementReferenceExpression) referencedObject = ((ElementReferenceExpression) expression).getReference(); if (referencedObject instanceof VariableDefinition) { if (!defined.contains(nameProvider.getFullyQualifiedName(referencedObject))) error( REFERENCE_CONSTANT_BEFORE_DEFINED, definition, StextPackage.Literals.VARIABLE_DEFINITION__INITIAL_VALUE); } } defined.add(nameProvider.getFullyQualifiedName(definition)); } } }
@Test public void testSingleLocalTimeTrigger() { 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); LocalReaction timeTriggeredReaction = _createTimeTriggeredReaction(s, TimeEventType.AFTER, _createValue(2), TimeUnit.MILLISECOND); AssignmentExpression assign = _createVariableAssignment( v1, AssignmentOperator.ASSIGN, _createValue(42), (ReactionEffect) timeTriggeredReaction.getEffect()); ExecutionFlow flow = sequencer.transform(sc); 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 ExecutionState _s = flow.getStates().get(0); // 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()); PrimitiveValueExpression value = (PrimitiveValueExpression) ste.getTimeValue(); assertIntLiteral(2, value.getValue()); assertNotNull(_s.getExitAction()); Sequence exitAction = (Sequence) _s.getExitAction(); UnscheduleTimeEvent ute = (UnscheduleTimeEvent) exitAction.getSteps().get(0); assertSame(te, ute.getTimeEvent()); }
protected void _declareContents(final Scope scope) throws NumberFormatException { EList<Declaration> _declarations = scope.getDeclarations(); for (final Declaration declaration : _declarations) { this.addToScope(declaration); } }