/**
   * 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());
  }