/**
   * 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());
  }
예제 #2
0
 @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);
   }
 }