Browse Source

Added Operation and OperationCall mapping to sexec transformation (YAKHMI-471)

benjamin.schwertfeger@gmail.com 13 years ago
parent
commit
5dcf1d05cd

+ 1 - 1
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/BehaviorMapping.xtend

@@ -175,7 +175,7 @@ class BehaviorMapping {
 	def Execution mapToExecution(Statement stmnt) {
 		val exec = sexec.factory.createExecution
 		exec.statement = EcoreUtil::copy(stmnt)
-		exec	
+		exec
 	}
 	
 	def ExecutionFlow mapTransitions(Statechart statechart, ExecutionFlow r){

+ 17 - 6
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/ModelSequencer.xtend

@@ -71,6 +71,10 @@ import com.google.inject.name.Named
 import org.yakindu.sct.model.sexec.ExecutionRegion
 import org.yakindu.sct.model.sexec.ExecutionScope
 import org.yakindu.sct.model.sexec.StateVector
+import org.yakindu.sct.model.stext.stext.OperationCall
+import org.yakindu.sct.model.stext.stext.Operation
+import java.util.Set
+import java.util.Collection
 
 class ModelSequencer {
 	 
@@ -246,29 +250,36 @@ class ModelSequencer {
 	
 	def retargetDeclRefs(ExecutionFlow flow) {
 		val allContent = EcoreUtil2::eAllContentsAsList(flow)
-		val declared = allContent.filter(e | e instanceof EventDefinition || e instanceof VariableDefinition).toList
+		val declared = allContent.filter(e | e instanceof EventDefinition || e instanceof VariableDefinition || e instanceof Operation).toSet
 		
-		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) )
+		allContent.filter(typeof(ElementReferenceExpression)).forEach( ere | ere.retarget(declared) )
+		allContent.filter(typeof(Assignment)).forEach( ere | ere.retarget(declared) )
+		allContent.filter(typeof(OperationCall)).forEach( call|call.retarget(declared))
 	}
 	
 	
-	def retarget(ElementReferenceExpression ere, List<EObject> declared) {
+	def retarget(ElementReferenceExpression ere, Collection<EObject> declared) {
 		if (! declared.contains(ere.value) ) ere.value = ere.value.replaced
 	}
 	
-	def retarget(Assignment assign, List<EObject> declared) {
+	def retarget(Assignment assign, Collection<EObject> declared) {
 		if (! declared.contains(assign.varRef) ) assign.varRef = ((assign.varRef as VariableDefinition).replaced) as Variable
 	}
+	def retarget(OperationCall call, Collection<EObject> declared) {
+		if (! declared.contains(call.operation) ) call.operation = (call.operation.replaced) as Operation
+	}
 	
 	def dispatch replaced(VariableDefinition vd) {
 		vd.create	
 	}
+	def dispatch replaced(Operation vd) {
+		vd.create	
+	}
 	
 	def dispatch replaced(EventDefinition ed) {
 		ed.create	
 	}
-	
+
 	def dispatch replaced(TimeEvent ed) {
 		ed	
 	}

+ 4 - 0
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/SexecElementMapping.xtend

@@ -51,6 +51,8 @@ import org.yakindu.sct.model.stext.stext.OnCycleEvent
 import org.yakindu.sct.model.stext.stext.BoolLiteral
 import org.yakindu.sct.model.stext.stext.AlwaysEvent
 import org.yakindu.sct.model.stext.stext.DefaultEvent
+import org.yakindu.sct.model.stext.stext.OperationCall
+import org.yakindu.sct.model.stext.stext.Operation
  
 
 @Singleton class SexecElementMapping {
@@ -82,6 +84,8 @@ import org.yakindu.sct.model.stext.stext.DefaultEvent
 	
 	def VariableDefinition create r : EcoreUtil::copy(v) create(VariableDefinition v) {}
 	
+	def Operation create r : EcoreUtil::copy(v) create(Operation v) {}
+	
 	
 	def ExecutionState create r : sexecFactory.createExecutionState create(RegularState state){
 		if (state != null) {

+ 6 - 0
plugins/org.yakindu.sct.model.sexec/src/org/yakindu/sct/model/sexec/transformation/StructureMapping.xtend

@@ -17,6 +17,8 @@ import org.yakindu.sct.model.sexec.ExecutionScope
 import org.eclipse.xtext.EcoreUtil2
 import java.util.ArrayList
 import org.yakindu.sct.model.sexec.TimeEvent
+import org.yakindu.sct.model.stext.stext.OperationCall
+import org.yakindu.sct.model.stext.stext.Operation
 
 class StructureMapping {
 	 
@@ -60,6 +62,10 @@ class StructureMapping {
 		val _v = v.create
 		return _v
 	}
+	def dispatch Declaration map(Operation v) {
+		val _v = v.create
+		return _v
+	}
 	 
 	
 	//==========================================================================

+ 49 - 33
plugins/org.yakindu.sct.model.sexec/xtend-gen/org/yakindu/sct/model/sexec/transformation/ModelSequencer.java

@@ -2,7 +2,9 @@ package org.yakindu.sct.model.sexec.transformation;
 
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
+import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.EcoreUtil2;
@@ -54,6 +56,8 @@ import org.yakindu.sct.model.stext.stext.BoolLiteral;
 import org.yakindu.sct.model.stext.stext.ElementReferenceExpression;
 import org.yakindu.sct.model.stext.stext.EventDefinition;
 import org.yakindu.sct.model.stext.stext.Literal;
+import org.yakindu.sct.model.stext.stext.Operation;
+import org.yakindu.sct.model.stext.stext.OperationCall;
 import org.yakindu.sct.model.stext.stext.PrimitiveValueExpression;
 import org.yakindu.sct.model.stext.stext.VariableDefinition;
 
@@ -409,59 +413,51 @@ public class ModelSequencer {
       final Function1<EObject,Boolean> _function = new Function1<EObject,Boolean>() {
           public Boolean apply(final EObject e) {
             boolean _operator_or = false;
+            boolean _operator_or_1 = false;
             if ((e instanceof org.yakindu.sct.model.stext.stext.EventDefinition)) {
+              _operator_or_1 = true;
+            } else {
+              _operator_or_1 = BooleanExtensions.operator_or((e instanceof org.yakindu.sct.model.stext.stext.EventDefinition), (e instanceof org.yakindu.sct.model.stext.stext.VariableDefinition));
+            }
+            if (_operator_or_1) {
               _operator_or = true;
             } else {
-              _operator_or = BooleanExtensions.operator_or((e instanceof org.yakindu.sct.model.stext.stext.EventDefinition), (e instanceof org.yakindu.sct.model.stext.stext.VariableDefinition));
+              _operator_or = BooleanExtensions.operator_or(_operator_or_1, (e instanceof org.yakindu.sct.model.stext.stext.Operation));
             }
             return ((Boolean)_operator_or);
           }
         };
       Iterable<EObject> _filter = IterableExtensions.<EObject>filter(allContent, _function);
-      List<EObject> _list = IterableExtensions.<EObject>toList(_filter);
-      final List<EObject> declared = _list;
-      final Function1<EObject,Boolean> _function_1 = new Function1<EObject,Boolean>() {
-          public Boolean apply(final EObject e_1) {
-            return ((Boolean)(e_1 instanceof org.yakindu.sct.model.stext.stext.ElementReferenceExpression));
-          }
-        };
-      Iterable<EObject> _filter_1 = IterableExtensions.<EObject>filter(allContent, _function_1);
-      final Function1<EObject,ElementReferenceExpression> _function_2 = new Function1<EObject,ElementReferenceExpression>() {
-          public ElementReferenceExpression apply(final EObject s) {
-            return ((ElementReferenceExpression) s);
-          }
-        };
-      Iterable<ElementReferenceExpression> _map = IterableExtensions.<EObject, ElementReferenceExpression>map(_filter_1, _function_2);
-      final Function1<ElementReferenceExpression,Object> _function_3 = new Function1<ElementReferenceExpression,Object>() {
+      Set<EObject> _set = IterableExtensions.<EObject>toSet(_filter);
+      final Set<EObject> declared = _set;
+      Iterable<ElementReferenceExpression> _filter_1 = IterableExtensions.<ElementReferenceExpression>filter(allContent, org.yakindu.sct.model.stext.stext.ElementReferenceExpression.class);
+      final Function1<ElementReferenceExpression,Object> _function_1 = new Function1<ElementReferenceExpression,Object>() {
           public Object apply(final ElementReferenceExpression ere) {
             Object _retarget = ModelSequencer.this.retarget(ere, declared);
             return _retarget;
           }
         };
-      IterableExtensions.<ElementReferenceExpression>forEach(_map, _function_3);
-      final Function1<EObject,Boolean> _function_4 = new Function1<EObject,Boolean>() {
-          public Boolean apply(final EObject e_2) {
-            return ((Boolean)(e_2 instanceof org.yakindu.sct.model.stext.stext.Assignment));
-          }
-        };
-      Iterable<EObject> _filter_2 = IterableExtensions.<EObject>filter(allContent, _function_4);
-      final Function1<EObject,Assignment> _function_5 = new Function1<EObject,Assignment>() {
-          public Assignment apply(final EObject s_1) {
-            return ((Assignment) s_1);
-          }
-        };
-      Iterable<Assignment> _map_1 = IterableExtensions.<EObject, Assignment>map(_filter_2, _function_5);
-      final Function1<Assignment,Object> _function_6 = new Function1<Assignment,Object>() {
+      IterableExtensions.<ElementReferenceExpression>forEach(_filter_1, _function_1);
+      Iterable<Assignment> _filter_2 = IterableExtensions.<Assignment>filter(allContent, org.yakindu.sct.model.stext.stext.Assignment.class);
+      final Function1<Assignment,Object> _function_2 = new Function1<Assignment,Object>() {
           public Object apply(final Assignment ere_1) {
             Object _retarget_1 = ModelSequencer.this.retarget(ere_1, declared);
             return _retarget_1;
           }
         };
-      IterableExtensions.<Assignment>forEach(_map_1, _function_6);
+      IterableExtensions.<Assignment>forEach(_filter_2, _function_2);
+      Iterable<OperationCall> _filter_3 = IterableExtensions.<OperationCall>filter(allContent, org.yakindu.sct.model.stext.stext.OperationCall.class);
+      final Function1<OperationCall,Object> _function_3 = new Function1<OperationCall,Object>() {
+          public Object apply(final OperationCall call) {
+            Object _retarget_2 = ModelSequencer.this.retarget(call, declared);
+            return _retarget_2;
+          }
+        };
+      IterableExtensions.<OperationCall>forEach(_filter_3, _function_3);
     }
   }
   
-  public Object retarget(final ElementReferenceExpression ere, final List<EObject> declared) {
+  public Object retarget(final ElementReferenceExpression ere, final Collection<EObject> declared) {
     Object _xifexpression = null;
     Declaration _value = ere.getValue();
     boolean _contains = declared.contains(_value);
@@ -474,7 +470,7 @@ public class ModelSequencer {
     return _xifexpression;
   }
   
-  public Object retarget(final Assignment assign, final List<EObject> declared) {
+  public Object retarget(final Assignment assign, final Collection<EObject> declared) {
     Object _xifexpression = null;
     Variable _varRef = assign.getVarRef();
     boolean _contains = declared.contains(_varRef);
@@ -487,11 +483,29 @@ public class ModelSequencer {
     return _xifexpression;
   }
   
+  public Object retarget(final OperationCall call, final Collection<EObject> declared) {
+    Object _xifexpression = null;
+    Operation _operation = call.getOperation();
+    boolean _contains = declared.contains(_operation);
+    boolean _operator_not = BooleanExtensions.operator_not(_contains);
+    if (_operator_not) {
+      Operation _operation_1 = call.getOperation();
+      Declaration _replaced = this.replaced(_operation_1);
+      call.setOperation(((Operation) _replaced));
+    }
+    return _xifexpression;
+  }
+  
   protected Declaration _replaced(final VariableDefinition vd) {
     VariableDefinition _create = this.mapping.create(vd);
     return _create;
   }
   
+  protected Declaration _replaced(final Operation vd) {
+    Operation _create = this.mapping.create(vd);
+    return _create;
+  }
+  
   protected Declaration _replaced(final EventDefinition ed) {
     EventDefinition _create = this.mapping.create(ed);
     return _create;
@@ -508,6 +522,8 @@ public class ModelSequencer {
       return _replaced((EventDefinition)ed);
     } else if ((ed instanceof VariableDefinition)) {
       return _replaced((VariableDefinition)ed);
+    } else if ((ed instanceof Operation)) {
+      return _replaced((Operation)ed);
     } else {
       throw new IllegalArgumentException("Unhandled parameter types: " +
         java.util.Arrays.<Object>asList(ed).toString());

+ 42 - 25
plugins/org.yakindu.sct.model.sexec/xtend-gen/org/yakindu/sct/model/sexec/transformation/SexecElementMapping.java

@@ -52,6 +52,7 @@ import org.yakindu.sct.model.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.InternalScope;
 import org.yakindu.sct.model.stext.stext.LocalReaction;
 import org.yakindu.sct.model.stext.stext.OnCycleEvent;
+import org.yakindu.sct.model.stext.stext.Operation;
 import org.yakindu.sct.model.stext.stext.PrimitiveValueExpression;
 import org.yakindu.sct.model.stext.stext.ReactionTrigger;
 import org.yakindu.sct.model.stext.stext.RegularEventSpec;
@@ -185,19 +186,35 @@ public class SexecElementMapping {
     return r;
   }
   
-  private final HashMap<ArrayList<?>,ExecutionState> _createCache_create_5 = new HashMap<ArrayList<?>,ExecutionState>();
+  private final HashMap<ArrayList<?>,Operation> _createCache_create_5 = new HashMap<ArrayList<?>,Operation>();
   
-  public ExecutionState create(final RegularState state) {
-    final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(state);
-    final ExecutionState r;
+  public Operation create(final Operation v) {
+    final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(v);
+    final Operation r;
     synchronized (_createCache_create_5) {
       if (_createCache_create_5.containsKey(_cacheKey)) {
         return _createCache_create_5.get(_cacheKey);
       }
+      Operation _copy = EcoreUtil.<Operation>copy(v);
+      r = _copy;
+      _createCache_create_5.put(_cacheKey, r);
+    }
+    return r;
+  }
+  
+  private final HashMap<ArrayList<?>,ExecutionState> _createCache_create_6 = new HashMap<ArrayList<?>,ExecutionState>();
+  
+  public ExecutionState create(final RegularState state) {
+    final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(state);
+    final ExecutionState r;
+    synchronized (_createCache_create_6) {
+      if (_createCache_create_6.containsKey(_cacheKey)) {
+        return _createCache_create_6.get(_cacheKey);
+      }
       SexecFactory _sexecFactory = this.sexecFactory();
       ExecutionState _createExecutionState = _sexecFactory.createExecutionState();
       r = _createExecutionState;
-      _createCache_create_5.put(_cacheKey, r);
+      _createCache_create_6.put(_cacheKey, r);
     }
     boolean _operator_notEquals = ObjectExtensions.operator_notEquals(state, null);
     if (_operator_notEquals) {
@@ -220,19 +237,19 @@ public class SexecElementMapping {
     return r;
   }
   
-  private final HashMap<ArrayList<?>,ExecutionChoice> _createCache_create_6 = new HashMap<ArrayList<?>,ExecutionChoice>();
+  private final HashMap<ArrayList<?>,ExecutionChoice> _createCache_create_7 = new HashMap<ArrayList<?>,ExecutionChoice>();
   
   public ExecutionChoice create(final Choice choice) {
     final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(choice);
     final ExecutionChoice r;
-    synchronized (_createCache_create_6) {
-      if (_createCache_create_6.containsKey(_cacheKey)) {
-        return _createCache_create_6.get(_cacheKey);
+    synchronized (_createCache_create_7) {
+      if (_createCache_create_7.containsKey(_cacheKey)) {
+        return _createCache_create_7.get(_cacheKey);
       }
       SexecFactory _sexecFactory = this.sexecFactory();
       ExecutionChoice _createExecutionChoice = _sexecFactory.createExecutionChoice();
       r = _createExecutionChoice;
-      _createCache_create_6.put(_cacheKey, r);
+      _createCache_create_7.put(_cacheKey, r);
     }
     boolean _operator_notEquals = ObjectExtensions.operator_notEquals(choice, null);
     if (_operator_notEquals) {
@@ -259,19 +276,19 @@ public class SexecElementMapping {
     return r;
   }
   
-  private final HashMap<ArrayList<?>,ExecutionRegion> _createCache_create_7 = new HashMap<ArrayList<?>,ExecutionRegion>();
+  private final HashMap<ArrayList<?>,ExecutionRegion> _createCache_create_8 = new HashMap<ArrayList<?>,ExecutionRegion>();
   
   public ExecutionRegion create(final Region region) {
     final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(region);
     final ExecutionRegion r;
-    synchronized (_createCache_create_7) {
-      if (_createCache_create_7.containsKey(_cacheKey)) {
-        return _createCache_create_7.get(_cacheKey);
+    synchronized (_createCache_create_8) {
+      if (_createCache_create_8.containsKey(_cacheKey)) {
+        return _createCache_create_8.get(_cacheKey);
       }
       SexecFactory _sexecFactory = this.sexecFactory();
       ExecutionRegion _createExecutionRegion = _sexecFactory.createExecutionRegion();
       r = _createExecutionRegion;
-      _createCache_create_7.put(_cacheKey, r);
+      _createCache_create_8.put(_cacheKey, r);
     }
     boolean _operator_notEquals = ObjectExtensions.operator_notEquals(region, null);
     if (_operator_notEquals) {
@@ -304,19 +321,19 @@ public class SexecElementMapping {
     return r;
   }
   
-  private final HashMap<ArrayList<?>,org.yakindu.sct.model.sexec.Reaction> _createCache_create_8 = new HashMap<ArrayList<?>,org.yakindu.sct.model.sexec.Reaction>();
+  private final HashMap<ArrayList<?>,org.yakindu.sct.model.sexec.Reaction> _createCache_create_9 = new HashMap<ArrayList<?>,org.yakindu.sct.model.sexec.Reaction>();
   
   public org.yakindu.sct.model.sexec.Reaction create(final Transition tr) {
     final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(tr);
     final org.yakindu.sct.model.sexec.Reaction r;
-    synchronized (_createCache_create_8) {
-      if (_createCache_create_8.containsKey(_cacheKey)) {
-        return _createCache_create_8.get(_cacheKey);
+    synchronized (_createCache_create_9) {
+      if (_createCache_create_9.containsKey(_cacheKey)) {
+        return _createCache_create_9.get(_cacheKey);
       }
       SexecFactory _sexecFactory = this.sexecFactory();
       org.yakindu.sct.model.sexec.Reaction _createReaction = _sexecFactory.createReaction();
       r = _createReaction;
-      _createCache_create_8.put(_cacheKey, r);
+      _createCache_create_9.put(_cacheKey, r);
     }
     {
       String _id = this.sce.id(tr);
@@ -327,19 +344,19 @@ public class SexecElementMapping {
     return r;
   }
   
-  private final HashMap<ArrayList<?>,org.yakindu.sct.model.sexec.Reaction> _createCache_create_9 = new HashMap<ArrayList<?>,org.yakindu.sct.model.sexec.Reaction>();
+  private final HashMap<ArrayList<?>,org.yakindu.sct.model.sexec.Reaction> _createCache_create_10 = new HashMap<ArrayList<?>,org.yakindu.sct.model.sexec.Reaction>();
   
   public org.yakindu.sct.model.sexec.Reaction create(final LocalReaction lr) {
     final ArrayList<?>_cacheKey = CollectionLiterals.newArrayList(lr);
     final org.yakindu.sct.model.sexec.Reaction r;
-    synchronized (_createCache_create_9) {
-      if (_createCache_create_9.containsKey(_cacheKey)) {
-        return _createCache_create_9.get(_cacheKey);
+    synchronized (_createCache_create_10) {
+      if (_createCache_create_10.containsKey(_cacheKey)) {
+        return _createCache_create_10.get(_cacheKey);
       }
       SexecFactory _sexecFactory = this.sexecFactory();
       org.yakindu.sct.model.sexec.Reaction _createReaction = _sexecFactory.createReaction();
       r = _createReaction;
-      _createCache_create_9.put(_cacheKey, r);
+      _createCache_create_10.put(_cacheKey, r);
     }
     {
       String _id = this.sce.id(lr);

+ 11 - 0
plugins/org.yakindu.sct.model.sexec/xtend-gen/org/yakindu/sct/model/sexec/transformation/StructureMapping.java

@@ -32,6 +32,7 @@ import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Vertex;
 import org.yakindu.sct.model.stext.stext.EventDefinition;
+import org.yakindu.sct.model.stext.stext.Operation;
 import org.yakindu.sct.model.stext.stext.TimeEventSpec;
 import org.yakindu.sct.model.stext.stext.VariableDefinition;
 
@@ -107,6 +108,14 @@ public class StructureMapping {
     }
   }
   
+  protected Declaration _map(final Operation v) {
+    {
+      Operation _create = this.mapping.create(v);
+      final Operation _v = _create;
+      return _v;
+    }
+  }
+  
   public ExecutionFlow mapRegularStates(final Statechart statechart, final ExecutionFlow r) {
     {
       List<RegularState> _allRegularStates = this.sct.allRegularStates(statechart);
@@ -265,6 +274,8 @@ public class StructureMapping {
       return _map((EventDefinition)e);
     } else if ((e instanceof VariableDefinition)) {
       return _map((VariableDefinition)e);
+    } else if ((e instanceof Operation)) {
+      return _map((Operation)e);
     } else if ((e instanceof Declaration)) {
       return _map((Declaration)e);
     } else {

+ 39 - 0
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/ModelSequencertDeclarationsTest.java

@@ -7,8 +7,11 @@ import static org.junit.Assert.assertTrue;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.*;
 
 import org.junit.Test;
+import org.yakindu.sct.model.sexec.Call;
+import org.yakindu.sct.model.sexec.Execution;
 import org.yakindu.sct.model.sexec.ExecutionFlow;
 import org.yakindu.sct.model.sexec.If;
+import org.yakindu.sct.model.sexec.Step;
 import org.yakindu.sct.model.sgraph.Declaration;
 import org.yakindu.sct.model.sgraph.Region;
 import org.yakindu.sct.model.sgraph.Scope;
@@ -19,6 +22,9 @@ 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.Operation;
+import org.yakindu.sct.model.stext.stext.OperationCall;
+import org.yakindu.sct.model.stext.stext.ReactionEffect;
 import org.yakindu.sct.model.stext.stext.ReactionTrigger;
 import org.yakindu.sct.model.stext.stext.VariableDefinition;
 
@@ -103,4 +109,37 @@ public class ModelSequencertDeclarationsTest extends ModelSequencerTest {
 		assertSame(_e1, _ere.getValue());
 	}
 
+	/**
+	 * The OperationCalls must map to Operations in Scopes inside the Flow..
+	 */
+	@Test
+	public void testOperationMapping() {
+
+		Statechart sc = _createStatechart("test");
+		InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
+		Operation _operation = _createOperation("value", s_scope);
+		Region r = _createRegion("main", sc);
+		State s1 = _createState("S1", r);
+		State s2 = _createState("S2", r);
+		Transition t = _createTransition(s1, s2);
+		ReactionEffect tr1 = _createReactionEffect(t);
+		OperationCall _operationCall = _createOperationCall(_operation);
+		tr1.getActions().add(_operationCall);
+
+		ExecutionFlow flow = sequencer.transform(sc);
+
+		Operation _o1 = (Operation) flow.getScopes().get(0).getDeclarations()
+				.get(0);
+		assertNotSame(_operation, _o1);
+		assertEquals(_operation.getName(), _o1.getName());
+
+		If _if = (If) flow.getStates().get(0).getReactSequence().getSteps()
+				.get(0);
+		Step thenSequence = assertedSequence(
+				((Call) _if.getThenStep()).getStep()).getSteps().get(1);
+		Execution call = (Execution) assertedSequence(thenSequence).getSteps()
+				.get(0);
+		assertNotSame(_operationCall, call.getStatement());
+		assertSame(_o1, ((OperationCall) call.getStatement()).getOperation());
+	}
 }

+ 19 - 0
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/SCTTestUtil.java

@@ -6,6 +6,9 @@ import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.EcoreUtil2;
 import org.yakindu.base.types.Type;
 import org.yakindu.base.types.TypesFactory;
+import org.yakindu.sct.model.sexec.Execution;
+import org.yakindu.sct.model.sexec.Sequence;
+import org.yakindu.sct.model.sexec.SexecFactory;
 import org.yakindu.sct.model.sgraph.Entry;
 import org.yakindu.sct.model.sgraph.EntryKind;
 import org.yakindu.sct.model.sgraph.FinalState;
@@ -30,6 +33,8 @@ import org.yakindu.sct.model.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.InternalScope;
 import org.yakindu.sct.model.stext.stext.LocalReaction;
 import org.yakindu.sct.model.stext.stext.OnCycleEvent;
+import org.yakindu.sct.model.stext.stext.Operation;
+import org.yakindu.sct.model.stext.stext.OperationCall;
 import org.yakindu.sct.model.stext.stext.PrimitiveValueExpression;
 import org.yakindu.sct.model.stext.stext.ReactionEffect;
 import org.yakindu.sct.model.stext.stext.ReactionTrigger;
@@ -56,6 +61,14 @@ public class SCTTestUtil {
 		return e;
 	}
 
+	public static Operation _createOperation(String name, Scope scope) {
+		Operation e = StextFactory.eINSTANCE.createOperation();
+		e.setName(name);
+		if (scope != null)
+			scope.getDeclarations().add(e);
+		return e;
+	}
+
 	public static VariableDefinition _createVariableDefinition(String name,
 			Type type, Scope scope, Expression initialValue) {
 		VariableDefinition definition = _createVariableDefinition(name, type,
@@ -277,6 +290,12 @@ public class SCTTestUtil {
 		return assignment;
 	}
 
+	public static OperationCall _createOperationCall(Operation o) {
+		OperationCall oc = StextFactory.eINSTANCE.createOperationCall();
+		oc.setOperation(o);
+		return oc;
+	}
+
 	public static PrimitiveValueExpression _createValue(int i) {
 		PrimitiveValueExpression assignment = StextFactory.eINSTANCE
 				.createPrimitiveValueExpression();