/** The transition action must be part of the reaction effect sequence */ @Test public void testStateReaction_WithTransitionAction() { SimpleFlatTSC tsc = new SimpleFlatTSC(); VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, tsc.s_scope); ReactionEffect effect = _createReactionEffect(tsc.t1); AssignmentExpression assign = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue(42), effect); 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(1, s1.getReactions().size()); Reaction reaction = s1.getReactions().get(0); assertNotNull(reaction.getCheck()); assertNotNull(reaction.getEffect()); Sequence seq = (Sequence) reaction.getEffect(); assertCall(seq, 0, s1.getExitSequence()); assertClass(Sequence.class, seq.getSteps().get(1)); Execution _exec = (Execution) ((Sequence) seq.getSteps().get(1)).getSteps().get(0); AssignmentExpression _assign = (AssignmentExpression) _exec.getStatement(); assertNotSame(_assign, assign); assertNotSame(_assign.getVarRef(), assign.getVarRef()); assertNotSame(_assign.getVarRef(), v1); assertCall(seq, 2, s2.getEnterSequences().get(0)); }
private String getVariableName(AssignmentExpression exp) { Expression varRef = exp.getVarRef(); if (varRef instanceof ElementReferenceExpression && ((ElementReferenceExpression) varRef).getReference() instanceof Property) { Property reference = (Property) ((ElementReferenceExpression) varRef).getReference(); return reference.getName(); } else if (varRef instanceof FeatureCall && ((FeatureCall) varRef).getFeature() instanceof Property) { Property reference = (Property) ((FeatureCall) varRef).getFeature(); return reference.getName(); } return null; }
@Check(CheckType.FAST) public void checkAssignmentToFinalVariable(AssignmentExpression exp) { Expression varRef = exp.getVarRef(); EObject referencedObject = null; if (varRef instanceof FeatureCall) referencedObject = ((FeatureCall) varRef).getFeature(); else if (varRef instanceof ElementReferenceExpression) referencedObject = ((ElementReferenceExpression) varRef).getReference(); if (referencedObject instanceof VariableDefinition) { if (((VariableDefinition) referencedObject).isConst()) { error(ASSIGNMENT_TO_VALUE, ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__VAR_REF); } } }
@Check(CheckType.FAST) public void checkLeftHandAssignment(final AssignmentExpression expression) { Expression varRef = expression.getVarRef(); if (varRef instanceof FeatureCall) { EObject referencedObject = ((FeatureCall) varRef).getFeature(); if (!(referencedObject instanceof Property) && !(referencedObject instanceof Property)) { error(LEFT_HAND_ASSIGNMENT, ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__VAR_REF); } } else if (varRef instanceof ElementReferenceExpression) { EObject referencedObject = ((ElementReferenceExpression) varRef).getReference(); if (!(referencedObject instanceof Property)) { error(LEFT_HAND_ASSIGNMENT, ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__VAR_REF); } } else { error(LEFT_HAND_ASSIGNMENT, ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__VAR_REF); } }