瀏覽代碼

execution model now contains transition actions...

terfloth@itemis.de 14 年之前
父節點
當前提交
07c1b95696

+ 2 - 1
plugins/org.yakindu.sct.model.sexec/model/sexec.ecore

@@ -58,7 +58,8 @@
         containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="Execution" eSuperTypes="#//Step">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="statement" eType="ecore:EClass ../../org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore#//Statement"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="statement" eType="ecore:EClass ../../org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore#//Statement"
+        containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="EnterState" eSuperTypes="#//Step">
     <eStructuralFeatures xsi:type="ecore:EReference" name="state" eType="#//ExecutionState"/>

+ 5 - 5
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/Execution.java

@@ -26,26 +26,26 @@ import org.yakindu.sct.model.sgraph.Statement;
  */
 public interface Execution extends Step {
 	/**
-	 * Returns the value of the '<em><b>Statement</b></em>' reference.
+	 * Returns the value of the '<em><b>Statement</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Statement</em>' reference isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Statement</em>' reference.
+	 * @return the value of the '<em>Statement</em>' containment reference.
 	 * @see #setStatement(Statement)
 	 * @see org.yakindu.sct.model.sexec.SexecPackage#getExecution_Statement()
-	 * @model
+	 * @model containment="true"
 	 * @generated
 	 */
 	Statement getStatement();
 
 	/**
-	 * Sets the value of the '{@link org.yakindu.sct.model.sexec.Execution#getStatement <em>Statement</em>}' reference.
+	 * Sets the value of the '{@link org.yakindu.sct.model.sexec.Execution#getStatement <em>Statement</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Statement</em>' reference.
+	 * @param value the new value of the '<em>Statement</em>' containment reference.
 	 * @see #getStatement()
 	 * @generated
 	 */

+ 4 - 4
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/SexecPackage.java

@@ -596,7 +596,7 @@ public interface SexecPackage extends EPackage {
 	int EXECUTION__COMMENT = STEP__COMMENT;
 
 	/**
-	 * The feature id for the '<em><b>Statement</b></em>' reference.
+	 * The feature id for the '<em><b>Statement</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -1075,10 +1075,10 @@ public interface SexecPackage extends EPackage {
 	EClass getExecution();
 
 	/**
-	 * Returns the meta object for the reference '{@link org.yakindu.sct.model.sexec.Execution#getStatement <em>Statement</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.yakindu.sct.model.sexec.Execution#getStatement <em>Statement</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Statement</em>'.
+	 * @return the meta object for the containment reference '<em>Statement</em>'.
 	 * @see org.yakindu.sct.model.sexec.Execution#getStatement()
 	 * @see #getExecution()
 	 * @generated
@@ -1460,7 +1460,7 @@ public interface SexecPackage extends EPackage {
 		EClass EXECUTION = eINSTANCE.getExecution();
 
 		/**
-		 * The meta object literal for the '<em><b>Statement</b></em>' reference feature.
+		 * The meta object literal for the '<em><b>Statement</b></em>' containment reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated

+ 36 - 17
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/impl/ExecutionImpl.java

@@ -7,6 +7,7 @@
 package org.yakindu.sct.model.sexec.impl;
 
 import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -29,7 +30,7 @@ import org.yakindu.sct.model.sgraph.Statement;
  */
 public class ExecutionImpl extends StepImpl implements Execution {
 	/**
-	 * The cached value of the '{@link #getStatement() <em>Statement</em>}' reference.
+	 * The cached value of the '{@link #getStatement() <em>Statement</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @see #getStatement()
@@ -63,14 +64,6 @@ public class ExecutionImpl extends StepImpl implements Execution {
 	 * @generated
 	 */
 	public Statement getStatement() {
-		if (statement != null && statement.eIsProxy()) {
-			InternalEObject oldStatement = (InternalEObject)statement;
-			statement = (Statement)eResolveProxy(oldStatement);
-			if (statement != oldStatement) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, SexecPackage.EXECUTION__STATEMENT, oldStatement, statement));
-			}
-		}
 		return statement;
 	}
 
@@ -79,8 +72,14 @@ public class ExecutionImpl extends StepImpl implements Execution {
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public Statement basicGetStatement() {
-		return statement;
+	public NotificationChain basicSetStatement(Statement newStatement, NotificationChain msgs) {
+		Statement oldStatement = statement;
+		statement = newStatement;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, SexecPackage.EXECUTION__STATEMENT, oldStatement, newStatement);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
 	}
 
 	/**
@@ -89,10 +88,31 @@ public class ExecutionImpl extends StepImpl implements Execution {
 	 * @generated
 	 */
 	public void setStatement(Statement newStatement) {
-		Statement oldStatement = statement;
-		statement = newStatement;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, SexecPackage.EXECUTION__STATEMENT, oldStatement, statement));
+		if (newStatement != statement) {
+			NotificationChain msgs = null;
+			if (statement != null)
+				msgs = ((InternalEObject)statement).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - SexecPackage.EXECUTION__STATEMENT, null, msgs);
+			if (newStatement != null)
+				msgs = ((InternalEObject)newStatement).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - SexecPackage.EXECUTION__STATEMENT, null, msgs);
+			msgs = basicSetStatement(newStatement, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, SexecPackage.EXECUTION__STATEMENT, newStatement, newStatement));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case SexecPackage.EXECUTION__STATEMENT:
+				return basicSetStatement(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
 
 	/**
@@ -104,8 +124,7 @@ public class ExecutionImpl extends StepImpl implements Execution {
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case SexecPackage.EXECUTION__STATEMENT:
-				if (resolve) return getStatement();
-				return basicGetStatement();
+				return getStatement();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}

+ 1 - 1
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/impl/SexecPackageImpl.java

@@ -727,7 +727,7 @@ public class SexecPackageImpl extends EPackageImpl implements SexecPackage {
 		initEReference(getIf_ElseStep(), this.getStep(), null, "elseStep", null, 0, 1, If.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(executionEClass, Execution.class, "Execution", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getExecution_Statement(), theSGraphPackage.getStatement(), null, "statement", null, 0, 1, Execution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getExecution_Statement(), theSGraphPackage.getStatement(), null, "statement", null, 0, 1, Execution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(enterStateEClass, EnterState.class, "EnterState", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getEnterState_State(), this.getExecutionState(), null, "state", null, 0, 1, EnterState.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

+ 62 - 4
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/ModelSequencer.xtend

@@ -37,6 +37,15 @@ import org.yakindu.sct.model.sexec.ExitState
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.Reaction
 import org.yakindu.sct.model.sexec.Sequence
+import org.yakindu.sct.model.stext.stext.ReactionEffect
+import org.yakindu.sct.model.sgraph.Effect
+import org.yakindu.sct.model.sexec.Execution
+import org.yakindu.sct.model.stext.stext.ElementReferenceExpression
+import org.yakindu.sct.model.stext.stext.StextPackage
+import java.util.List
+import org.eclipse.emf.ecore.EObject
+import org.yakindu.sct.model.stext.stext.Assignment
+import org.yakindu.sct.model.sgraph.Variable
 
 class ModelSequencer {
 	
@@ -61,6 +70,9 @@ class ModelSequencer {
 		ef.defineEnterSequence(sc)
 		ef.defineStateCycles(sc)
 		
+		// retarget declaration refs
+		ef.retargetDeclRefs
+		
 		return ef
 	}
 	
@@ -125,8 +137,8 @@ class ModelSequencer {
 	 
 	 
 	def Reaction mapTransition(Transition t) {
-		val r = t.create
-		r.check = mapToCheck(t.trigger)
+		val r = t.create 
+		if (t.trigger != null) r.check = mapToCheck(t.trigger)
 		r.effect = mapToEffect(t)
 		return r
 	}
@@ -134,12 +146,29 @@ class ModelSequencer {
 
 	def Sequence mapToEffect(Transition t) {
 		val sequence = sexecFactory.createSequence 
-		if (t.source != null) sequence.steps.add(newExitStateStep(t.source as State))		
+		if (t.source != null) sequence.steps.add(newExitStateStep(t.source as State))
+		if (t.effect != null) sequence.steps.add(t.effect.mapEffect)		
 		if (t.target != null) sequence.steps.add(newEnterStateStep(t.target as State))
 		
 		return sequence
 	}	
 	
+	def dispatch Sequence mapEffect(Effect effect) {}
+	
+	def dispatch Sequence mapEffect(ReactionEffect effect) {
+		if ( ! effect.actions.empty) {
+			val sequence = sexecFactory.createSequence
+			sequence.name = "reaction_action"
+			sequence.steps.addAll( effect.actions.map( stmnt | stmnt.mapToExecution))
+			return sequence	
+		}	
+	}
+	
+	def Execution mapToExecution(Statement stmnt) {
+		val exec = sexecFactory.createExecution
+		exec.statement = EcoreUtil::copy(stmnt)
+		exec	
+	}
 	
 	/* ==========================================================================
 	 * SEQUENCING
@@ -278,6 +307,35 @@ class ModelSequencer {
 	}
 	
 	
+	
+	/************** retarget declaration refs **************/
+	
+	def retargetDeclRefs(ExecutionFlow flow) {
+		val allContent = EcoreUtil2::eAllContentsAsList(flow)
+		val declared = allContent.filter(e | e instanceof EventDefinition || e instanceof VariableDefinition).toList
+		
+		allContent.filter(e | e instanceof ElementReferenceExpression).map(s | s as ElementReferenceExpression).forEach( ere | ere.retarget(declared) )
+		allContent.filter(e | e instanceof Assignment).map(s | s as Assignment).forEach( ere | ere.retarget(declared) )
+	}
+	
+	
+	def retarget(ElementReferenceExpression ere, List<EObject> declared) {
+		if (! declared.contains(ere.value) ) ere.value = ere.value.replaced
+	}
+	
+	def retarget(Assignment assign, List<EObject> declared) {
+		if (! declared.contains(assign.varRef) ) assign.varRef = ((assign.varRef as VariableDefinition).replaced) as Variable
+	}
+	
+	def dispatch replaced(VariableDefinition vd) {
+		vd.create	
+	}
+	
+	def dispatch replaced(EventDefinition ed) {
+		ed.create	
+	}
+	
+	
 	//--------- UTILS ---------------
 	def sexecFactory() { SexecFactory::eINSTANCE }
 	def stextFactory() { StextFactory::eINSTANCE }
@@ -285,7 +343,7 @@ class ModelSequencer {
 	
 	
 	def entry(Region r) {
-		r.vertices.findFirst(v | v instanceof Entry && (v.name == null || v.name == 'default') ) as Entry
+		r.vertices.findFirst(v | v instanceof Entry && (v.name == null || v.name.empty || v.name == 'default') ) as Entry
 	}
 	
 	

+ 12 - 0
test-plugins/org.yakindu.sct.generator.cpp.test/src/org/yakindu/sct/generator/cpp/test/generator/CPPGeneratorTest.java

@@ -2,12 +2,16 @@ package org.yakindu.sct.generator.cpp.test.generator;
 
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createEventDefinition;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createInterfaceScope;
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createReactionEffect;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createReactionTrigger;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createRegion;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createRegularEventSpec;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createState;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createStatechart;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createTransition;
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createValue;
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createVariableAssignment;
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createVariableDefinition;
 
 import java.net.URL;
 
@@ -26,11 +30,16 @@ import org.yakindu.sct.model.sgraph.Region;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Transition;
+import org.yakindu.sct.model.stext.stext.Assignment;
+import org.yakindu.sct.model.stext.stext.AssignmentOperator;
 import org.yakindu.sct.model.stext.stext.ElementReferenceExpression;
 import org.yakindu.sct.model.stext.stext.EventDefinition;
 import org.yakindu.sct.model.stext.stext.InterfaceScope;
+import org.yakindu.sct.model.stext.stext.ReactionEffect;
 import org.yakindu.sct.model.stext.stext.ReactionTrigger;
 import org.yakindu.sct.model.stext.stext.RegularEventSpec;
+import org.yakindu.sct.model.stext.stext.Type;
+import org.yakindu.sct.model.stext.stext.VariableDefinition;
 
 import com.google.inject.Guice;
 import com.google.inject.Inject;
@@ -106,6 +115,9 @@ public class CPPGeneratorTest extends AbstractGeneratorTest {
 		_createRegularEventSpec(e2, tr2);
 		_createRegularEventSpec(e3, tr2);
 
+		VariableDefinition v1 = _createVariableDefinition("v1", Type.INTEGER, s_scope);
+		ReactionEffect effect = _createReactionEffect(t2);
+		Assignment assign = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue("42"), effect); 
 
 		ExecutionFlow flow = sequencer.transform(sc);
 

+ 45 - 2
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/ModelSequencerTest.java

@@ -8,6 +8,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.yakindu.sct.model.sexec.Call;
 import org.yakindu.sct.model.sexec.EnterState;
+import org.yakindu.sct.model.sexec.Execution;
 import org.yakindu.sct.model.sexec.ExecutionFlow;
 import org.yakindu.sct.model.sexec.ExecutionState;
 import org.yakindu.sct.model.sexec.ExitState;
@@ -26,11 +27,14 @@ import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Statement;
 import org.yakindu.sct.model.sgraph.Transition;
+import org.yakindu.sct.model.stext.stext.Assignment;
+import org.yakindu.sct.model.stext.stext.AssignmentOperator;
 import org.yakindu.sct.model.stext.stext.ElementReferenceExpression;
 import org.yakindu.sct.model.stext.stext.EventDefinition;
 import org.yakindu.sct.model.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.InternalScope;
 import org.yakindu.sct.model.stext.stext.LogicalOrExpression;
+import org.yakindu.sct.model.stext.stext.ReactionEffect;
 import org.yakindu.sct.model.stext.stext.ReactionTrigger;
 import org.yakindu.sct.model.stext.stext.Type;
 import org.yakindu.sct.model.stext.stext.VariableDefinition;
@@ -141,7 +145,7 @@ public class ModelSequencerTest {
 	
 	
 	/**
-	 * In the simplest case the a stet without an actions will be entered.
+	 * In the simplest case the a state without an actions will be entered.
 	 */
 	@Test public void testSCEnterSequence_SimpleFlatTSC() {
 		SimpleFlatTSC tsc = new SimpleFlatTSC();
@@ -202,6 +206,45 @@ public class ModelSequencerTest {
 	}
 	
 	
+	/**
+	 * 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);
+		Assignment 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();
+		
+		assertTrue(seq.getSteps().get(0) instanceof ExitState);
+		assertEquals(s1, ((ExitState)seq.getSteps().get(0)).getState());
+		assertTrue(seq.getSteps().get(1) instanceof Sequence);		
+		Execution _exec = (Execution) ((Sequence)seq.getSteps().get(1)).getSteps().get(0);
+		Assignment _assign = (Assignment) _exec.getStatement();
+		assertNotSame(_assign, assign);
+		assertNotSame(_assign.getVarRef(), assign.getVarRef());
+		assertNotSame(_assign.getVarRef(), v1);
+		
+		assertTrue(seq.getSteps().get(2) instanceof EnterState);
+		assertEquals(s2, ((EnterState)seq.getSteps().get(2)).getState());
+	}
+
+	
 	@Test public void testStateCycle_SimpleFlatTSC() {
 		OrthogonalFlatTSC tsc = new OrthogonalFlatTSC();
 		
@@ -235,7 +278,7 @@ public class ModelSequencerTest {
 		
 		_if = (If) s3.getCycle().getSteps().get(0);
 		assertNotNull(_if.getThenStep());
-		assertTrue(_if.getThenStep() instanceof Sequence);
+		assertTrue(_if.getThenStep() instanceof Call);
 		assertNotNull(_if.getElseStep());
 		assertTrue(_if.getElseStep() instanceof If);
 

+ 26 - 9
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/SCTTestUtil.java

@@ -1,14 +1,5 @@
 package org.yakindu.sct.model.sexec.transformation.test;
 
-import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createEventDefinition;
-import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createInterfaceScope;
-import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createReactionTrigger;
-import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createRegion;
-import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createRegularEventSpec;
-import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createState;
-import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createStatechart;
-import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createTransition;
-
 import org.yakindu.sct.model.sgraph.Entry;
 import org.yakindu.sct.model.sgraph.EntryKind;
 import org.yakindu.sct.model.sgraph.Reaction;
@@ -20,9 +11,14 @@ import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Transition;
 import org.yakindu.sct.model.sgraph.Vertex;
+import org.yakindu.sct.model.stext.stext.Assignment;
+import org.yakindu.sct.model.stext.stext.AssignmentOperator;
 import org.yakindu.sct.model.stext.stext.EventDefinition;
+import org.yakindu.sct.model.stext.stext.Expression;
 import org.yakindu.sct.model.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.InternalScope;
+import org.yakindu.sct.model.stext.stext.PrimitiveValueExpression;
+import org.yakindu.sct.model.stext.stext.ReactionEffect;
 import org.yakindu.sct.model.stext.stext.ReactionTrigger;
 import org.yakindu.sct.model.stext.stext.RegularEventSpec;
 import org.yakindu.sct.model.stext.stext.StextFactory;
@@ -119,6 +115,27 @@ public class SCTTestUtil {
 		return t;
 	}
 	
+	public static ReactionEffect _createReactionEffect(Reaction reaction) {
+		ReactionEffect effect = StextFactory.eINSTANCE.createReactionEffect();
+		if (reaction != null) reaction.setEffect(effect);
+		return effect;
+	}
+	
+	public static Assignment _createVariableAssignment(VariableDefinition v, AssignmentOperator op, Expression expression, ReactionEffect e) {
+		Assignment assignment = StextFactory.eINSTANCE.createAssignment();
+		assignment.setVarRef(v);
+		assignment.setOperator(op);
+		assignment.setExpression(expression);
+		if(e != null) e.getActions().add(assignment);
+		return assignment;
+	}
+	
+	public static PrimitiveValueExpression _createValue(String s) {
+		PrimitiveValueExpression assignment = StextFactory.eINSTANCE.createPrimitiveValueExpression();
+		assignment.setValue(s);
+		return assignment;
+	}
+	
 	
 	public static class SimpleFlatTSC {