/** * 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()); }
protected Object _execute(final ScheduleTimeEvent scheduleTimeEvent) throws ExecutionException { Object _xblockexpression = null; { TimeEvent _timeEvent = scheduleTimeEvent.getTimeEvent(); TimeEvent timeEvent = _timeEvent; Statement _timeValue = scheduleTimeEvent.getTimeValue(); Object _evaluateStatement = this.interpreter.evaluateStatement(_timeValue, this.executionContext); Object duration = _evaluateStatement; String _name = timeEvent.getName(); boolean _isPeriodic = timeEvent.isPeriodic(); this.timingService.scheduleTimeEvent( this.externalExecutionContext, _name, _isPeriodic, ((Integer) duration)); _xblockexpression = (null); } return _xblockexpression; }
@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()); }