Просмотр исходного кода

Added Exit behavior for Regions (YAKHMI-469)

benjamin.schwertfeger@gmail.com 14 лет назад
Родитель
Сommit
18573294fc

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

@@ -255,62 +255,8 @@ class BehaviorMapping {
 		
 		// first process the exit behavior of orthogonal states that hase to be performed before source exit
 		val topExitState = t.exitStates.last
-		if ( topExitState != null ) {
-			val List<ExecutionState> leafStates = topExitState.collectLeafStates(new ArrayList<RegularState>()).map(rs|rs.create)
-			val topVector = topExitState.stateVector
-			val sourceVector = t.source.stateVector
-		
-			val prepositions = (topVector.offset .. sourceVector.offset).take(sourceVector.offset - topVector.offset)
-			
-			for ( i: prepositions ) {
-				
-				// create a state switch for each state configuration vector position
-				var StateSwitch sSwitch = topExitState.create.defineExitSwitch(leafStates, i)
-				sequence.steps.add(sSwitch);
-			}
-		}
-		
-		// second process the exit path behavior from the the source state
-		if (t.source != null && t.source instanceof RegularState) {
-			sequence.steps.add((t.source as RegularState).create.exitSequence.newCall)	
-		}
- 
-		t.exitStates().fold(sequence, [seq, state | {
-			if (state != t.source && state != topExitState) { // since we call the exit sequence of the source state we have to exclude it's exit action here
-				if (t.source.stateVector.last == state.create.stateVector.last) {
-					if ( state.create.exitAction != null) seq.steps.add(state.create.exitAction.newCall)
-					if ( trace.addTraceSteps ) seq.steps.add(state.create.newTraceStateExited())			
-				}
-			}
-			
-			seq
-		}])
-
+		sequence.steps.add(topExitState.create.exitSequence.newCall)
 
-		// third process the exit behavior of orthogonal states that hase to be performed after source exit
-		if ( topExitState != null ) {
-			val List<ExecutionState> leafStates = topExitState.collectLeafStates(new ArrayList<RegularState>()).map(rs|rs.create)
-			val topVector = topExitState.stateVector
-			val sourceVector = t.source.stateVector
-		
-			val postpositions = (sourceVector.last .. topVector.last).drop(1)
-			
-			for ( i: postpositions ) {
-						
-				// create a state switch for each state configuration vector position
-				var StateSwitch sSwitch = topExitState.create.defineExitSwitch(leafStates, i)
-				sequence.steps.add(sSwitch);
-			}
-		}
-		
-		// forth exit the top exit state
-		// TODO refactor: the algorithm shoud not depend on these special cases...
-		if ( topExitState != t.source ) {
-			if (topExitState.create.exitAction != null) sequence.steps.add(topExitState.create.exitAction.newCall)
-			if ( trace.addTraceSteps ) sequence.steps += topExitState.create.newTraceStateExited
-		}
-		
-		
 		// map transition actions
 		if (t.effect != null) sequence.steps.add(t.effect.mapEffect)	
 		if (trace.addTraceSteps) { sequence.steps += r.newTraceReactionFired() }

+ 62 - 222
plugins/org.yakindu.sct.model.sexec/xtend-gen/org/yakindu/sct/model/sexec/transformation/BehaviorMapping.java

@@ -1,7 +1,6 @@
 package org.yakindu.sct.model.sexec.transformation;
 
 import com.google.inject.Inject;
-import java.util.ArrayList;
 import java.util.List;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EObject;
@@ -30,12 +29,9 @@ import org.yakindu.sct.model.sexec.ReactionFired;
 import org.yakindu.sct.model.sexec.ScheduleTimeEvent;
 import org.yakindu.sct.model.sexec.Sequence;
 import org.yakindu.sct.model.sexec.SexecFactory;
-import org.yakindu.sct.model.sexec.StateSwitch;
-import org.yakindu.sct.model.sexec.StateVector;
 import org.yakindu.sct.model.sexec.Step;
 import org.yakindu.sct.model.sexec.TimeEvent;
 import org.yakindu.sct.model.sexec.TraceStateEntered;
-import org.yakindu.sct.model.sexec.TraceStateExited;
 import org.yakindu.sct.model.sexec.UnscheduleTimeEvent;
 import org.yakindu.sct.model.sexec.transformation.SequenceBuilder;
 import org.yakindu.sct.model.sexec.transformation.SexecElementMapping;
@@ -593,188 +589,32 @@ public class BehaviorMapping {
       Iterable<State> _exitStates = this.exitStates(t);
       State _last = IterableExtensions.<State>last(_exitStates);
       final State topExitState = _last;
-      boolean _operator_notEquals = ObjectExtensions.operator_notEquals(topExitState, null);
+      EList<Step> _steps = sequence.getSteps();
+      ExecutionState _create = this.factory.create(topExitState);
+      Sequence _exitSequence = _create.getExitSequence();
+      Call _newCall = this.factory.newCall(_exitSequence);
+      _steps.add(_newCall);
+      Effect _effect = t.getEffect();
+      boolean _operator_notEquals = ObjectExtensions.operator_notEquals(_effect, null);
       if (_operator_notEquals) {
-        {
-          ArrayList<RegularState> _arrayList = new ArrayList<RegularState>();
-          List<RegularState> _collectLeafStates = this.sgraph.collectLeafStates(topExitState, _arrayList);
-          final Function1<RegularState,ExecutionState> _function = new Function1<RegularState,ExecutionState>() {
-              public ExecutionState apply(final RegularState rs) {
-                ExecutionState _create = BehaviorMapping.this.factory.create(rs);
-                return _create;
-              }
-            };
-          List<ExecutionState> _map = ListExtensions.<RegularState, ExecutionState>map(_collectLeafStates, _function);
-          final List<ExecutionState> leafStates = _map;
-          StateVector _stateVector = this.svBuilder.stateVector(topExitState);
-          final StateVector topVector = _stateVector;
-          Vertex _source = t.getSource();
-          StateVector _stateVector_1 = this.svBuilder.stateVector(_source);
-          final StateVector sourceVector = _stateVector_1;
-          int _offset = topVector.getOffset();
-          int _offset_1 = sourceVector.getOffset();
-          Iterable<Integer> _operator_upTo = IntegerExtensions.operator_upTo(((Integer)_offset), ((Integer)_offset_1));
-          int _offset_2 = sourceVector.getOffset();
-          int _offset_3 = topVector.getOffset();
-          int _operator_minus = IntegerExtensions.operator_minus(((Integer)_offset_2), ((Integer)_offset_3));
-          Iterable<Integer> _take = IterableExtensions.<Integer>take(_operator_upTo, _operator_minus);
-          final Iterable<Integer> prepositions = _take;
-          for (final Integer i : prepositions) {
-            {
-              ExecutionState _create_1 = this.factory.create(topExitState);
-              StateSwitch _defineExitSwitch = this.seqBuilder.defineExitSwitch(_create_1, leafStates, i);
-              StateSwitch sSwitch = _defineExitSwitch;
-              EList<Step> _steps = sequence.getSteps();
-              _steps.add(sSwitch);
-            }
-          }
-        }
-      }
-      boolean _operator_and = false;
-      Vertex _source_1 = t.getSource();
-      boolean _operator_notEquals_1 = ObjectExtensions.operator_notEquals(_source_1, null);
-      if (!_operator_notEquals_1) {
-        _operator_and = false;
-      } else {
-        Vertex _source_2 = t.getSource();
-        _operator_and = BooleanExtensions.operator_and(_operator_notEquals_1, (_source_2 instanceof org.yakindu.sct.model.sgraph.RegularState));
-      }
-      if (_operator_and) {
         EList<Step> _steps_1 = sequence.getSteps();
-        Vertex _source_3 = t.getSource();
-        ExecutionState _create_2 = this.factory.create(((RegularState) _source_3));
-        Sequence _exitSequence = _create_2.getExitSequence();
-        Call _newCall = this.factory.newCall(_exitSequence);
-        _steps_1.add(_newCall);
-      }
-      Iterable<State> _exitStates_1 = this.exitStates(t);
-      final Function2<Sequence,State,Sequence> _function_1 = new Function2<Sequence,State,Sequence>() {
-          public Sequence apply(final Sequence seq , final State state) {
-            Sequence _xblockexpression = null;
-            {
-              boolean _operator_and_1 = false;
-              Vertex _source_4 = t.getSource();
-              boolean _operator_notEquals_2 = ObjectExtensions.operator_notEquals(state, _source_4);
-              if (!_operator_notEquals_2) {
-                _operator_and_1 = false;
-              } else {
-                boolean _operator_notEquals_3 = ObjectExtensions.operator_notEquals(state, topExitState);
-                _operator_and_1 = BooleanExtensions.operator_and(_operator_notEquals_2, _operator_notEquals_3);
-              }
-              if (_operator_and_1) {
-                Vertex _source_5 = t.getSource();
-                StateVector _stateVector_2 = BehaviorMapping.this.svBuilder.stateVector(_source_5);
-                int _last_1 = BehaviorMapping.this.sexec.last(_stateVector_2);
-                ExecutionState _create_3 = BehaviorMapping.this.factory.create(state);
-                StateVector _stateVector_3 = _create_3.getStateVector();
-                int _last_2 = BehaviorMapping.this.sexec.last(_stateVector_3);
-                boolean _operator_equals = ObjectExtensions.operator_equals(((Integer)_last_1), ((Integer)_last_2));
-                if (_operator_equals) {
-                  {
-                    ExecutionState _create_4 = BehaviorMapping.this.factory.create(state);
-                    Step _exitAction = _create_4.getExitAction();
-                    boolean _operator_notEquals_4 = ObjectExtensions.operator_notEquals(_exitAction, null);
-                    if (_operator_notEquals_4) {
-                      EList<Step> _steps_2 = seq.getSteps();
-                      ExecutionState _create_5 = BehaviorMapping.this.factory.create(state);
-                      Step _exitAction_1 = _create_5.getExitAction();
-                      Call _newCall_1 = BehaviorMapping.this.factory.newCall(_exitAction_1);
-                      _steps_2.add(_newCall_1);
-                    }
-                    boolean _isAddTraceSteps = BehaviorMapping.this.trace.isAddTraceSteps();
-                    if (_isAddTraceSteps) {
-                      EList<Step> _steps_3 = seq.getSteps();
-                      ExecutionState _create_6 = BehaviorMapping.this.factory.create(state);
-                      TraceStateExited _newTraceStateExited = BehaviorMapping.this.trace.newTraceStateExited(_create_6);
-                      _steps_3.add(_newTraceStateExited);
-                    }
-                  }
-                }
-              }
-              _xblockexpression = (seq);
-            }
-            return _xblockexpression;
-          }
-        };
-      IterableExtensions.<State, Sequence>fold(_exitStates_1, sequence, _function_1);
-      boolean _operator_notEquals_5 = ObjectExtensions.operator_notEquals(topExitState, null);
-      if (_operator_notEquals_5) {
-        {
-          ArrayList<RegularState> _arrayList_1 = new ArrayList<RegularState>();
-          List<RegularState> _collectLeafStates_1 = this.sgraph.collectLeafStates(topExitState, _arrayList_1);
-          final Function1<RegularState,ExecutionState> _function_2 = new Function1<RegularState,ExecutionState>() {
-              public ExecutionState apply(final RegularState rs_1) {
-                ExecutionState _create_7 = BehaviorMapping.this.factory.create(rs_1);
-                return _create_7;
-              }
-            };
-          List<ExecutionState> _map_1 = ListExtensions.<RegularState, ExecutionState>map(_collectLeafStates_1, _function_2);
-          final List<ExecutionState> leafStates_1 = _map_1;
-          StateVector _stateVector_4 = this.svBuilder.stateVector(topExitState);
-          final StateVector topVector_1 = _stateVector_4;
-          Vertex _source_6 = t.getSource();
-          StateVector _stateVector_5 = this.svBuilder.stateVector(_source_6);
-          final StateVector sourceVector_1 = _stateVector_5;
-          int _last_3 = this.sexec.last(sourceVector_1);
-          int _last_4 = this.sexec.last(topVector_1);
-          Iterable<Integer> _operator_upTo_1 = IntegerExtensions.operator_upTo(((Integer)_last_3), ((Integer)_last_4));
-          Iterable<Integer> _drop = IterableExtensions.<Integer>drop(_operator_upTo_1, 1);
-          final Iterable<Integer> postpositions = _drop;
-          for (final Integer i_1 : postpositions) {
-            {
-              ExecutionState _create_8 = this.factory.create(topExitState);
-              StateSwitch _defineExitSwitch_1 = this.seqBuilder.defineExitSwitch(_create_8, leafStates_1, i_1);
-              StateSwitch sSwitch_1 = _defineExitSwitch_1;
-              EList<Step> _steps_4 = sequence.getSteps();
-              _steps_4.add(sSwitch_1);
-            }
-          }
-        }
-      }
-      Vertex _source_7 = t.getSource();
-      boolean _operator_notEquals_6 = ObjectExtensions.operator_notEquals(topExitState, _source_7);
-      if (_operator_notEquals_6) {
-        {
-          ExecutionState _create_9 = this.factory.create(topExitState);
-          Step _exitAction_2 = _create_9.getExitAction();
-          boolean _operator_notEquals_7 = ObjectExtensions.operator_notEquals(_exitAction_2, null);
-          if (_operator_notEquals_7) {
-            EList<Step> _steps_5 = sequence.getSteps();
-            ExecutionState _create_10 = this.factory.create(topExitState);
-            Step _exitAction_3 = _create_10.getExitAction();
-            Call _newCall_2 = this.factory.newCall(_exitAction_3);
-            _steps_5.add(_newCall_2);
-          }
-          boolean _isAddTraceSteps_1 = this.trace.isAddTraceSteps();
-          if (_isAddTraceSteps_1) {
-            EList<Step> _steps_6 = sequence.getSteps();
-            ExecutionState _create_11 = this.factory.create(topExitState);
-            TraceStateExited _newTraceStateExited_1 = this.trace.newTraceStateExited(_create_11);
-            CollectionExtensions.<Step>operator_add(_steps_6, _newTraceStateExited_1);
-          }
-        }
-      }
-      Effect _effect = t.getEffect();
-      boolean _operator_notEquals_8 = ObjectExtensions.operator_notEquals(_effect, null);
-      if (_operator_notEquals_8) {
-        EList<Step> _steps_7 = sequence.getSteps();
         Effect _effect_1 = t.getEffect();
         Sequence _mapEffect = this.mapEffect(_effect_1);
-        _steps_7.add(_mapEffect);
+        _steps_1.add(_mapEffect);
       }
-      boolean _isAddTraceSteps_2 = this.trace.isAddTraceSteps();
-      if (_isAddTraceSteps_2) {
-        EList<Step> _steps_8 = sequence.getSteps();
+      boolean _isAddTraceSteps = this.trace.isAddTraceSteps();
+      if (_isAddTraceSteps) {
+        EList<Step> _steps_2 = sequence.getSteps();
         ReactionFired _newTraceReactionFired = this.trace.newTraceReactionFired(r);
-        CollectionExtensions.<Step>operator_add(_steps_8, _newTraceReactionFired);
+        CollectionExtensions.<Step>operator_add(_steps_2, _newTraceReactionFired);
       }
       List<ExecutionScope> _entryScopes = this.entryScopes(t);
-      Iterable<ExecutionScope> _drop_1 = IterableExtensions.<ExecutionScope>drop(_entryScopes, 1);
-      List<ExecutionScope> _list = IterableExtensions.<ExecutionScope>toList(_drop_1);
+      Iterable<ExecutionScope> _drop = IterableExtensions.<ExecutionScope>drop(_entryScopes, 1);
+      List<ExecutionScope> _list = IterableExtensions.<ExecutionScope>toList(_drop);
       List<ExecutionScope> _reverse = ListExtensions.<ExecutionScope>reverse(_list);
-      final Function2<Sequence,ExecutionScope,Sequence> _function_3 = new Function2<Sequence,ExecutionScope,Sequence>() {
-          public Sequence apply(final Sequence seq_1 , final ExecutionScope scope) {
-            Sequence _xblockexpression_1 = null;
+      final Function2<Sequence,ExecutionScope,Sequence> _function = new Function2<Sequence,ExecutionScope,Sequence>() {
+          public Sequence apply(final Sequence seq , final ExecutionScope scope) {
+            Sequence _xblockexpression = null;
             {
               if ((scope instanceof org.yakindu.sct.model.sexec.ExecutionRegion)) {
                 {
@@ -782,15 +622,15 @@ public class BehaviorMapping {
                   EList<ExecutionScope> _subScopes = _superScope.getSubScopes();
                   final EList<ExecutionScope> siblingRegions = _subScopes;
                   int _indexOf = siblingRegions.indexOf(scope);
-                  Iterable<ExecutionScope> _take_1 = IterableExtensions.<ExecutionScope>take(siblingRegions, _indexOf);
-                  for (final ExecutionScope region : _take_1) {
+                  Iterable<ExecutionScope> _take = IterableExtensions.<ExecutionScope>take(siblingRegions, _indexOf);
+                  for (final ExecutionScope region : _take) {
                     Sequence _enterSequence = region.getEnterSequence();
-                    boolean _operator_notEquals_9 = ObjectExtensions.operator_notEquals(_enterSequence, null);
-                    if (_operator_notEquals_9) {
-                      EList<Step> _steps_9 = seq_1.getSteps();
+                    boolean _operator_notEquals_1 = ObjectExtensions.operator_notEquals(_enterSequence, null);
+                    if (_operator_notEquals_1) {
+                      EList<Step> _steps_3 = seq.getSteps();
                       Sequence _enterSequence_1 = region.getEnterSequence();
-                      Call _newCall_3 = BehaviorMapping.this.factory.newCall(_enterSequence_1);
-                      _steps_9.add(_newCall_3);
+                      Call _newCall_1 = BehaviorMapping.this.factory.newCall(_enterSequence_1);
+                      _steps_3.add(_newCall_1);
                     }
                   }
                 }
@@ -798,30 +638,30 @@ public class BehaviorMapping {
               if ((scope instanceof org.yakindu.sct.model.sexec.ExecutionState)) {
                 {
                   Step _entryAction = ((ExecutionState) scope).getEntryAction();
-                  boolean _operator_notEquals_10 = ObjectExtensions.operator_notEquals(_entryAction, null);
-                  if (_operator_notEquals_10) {
-                    EList<Step> _steps_10 = seq_1.getSteps();
+                  boolean _operator_notEquals_2 = ObjectExtensions.operator_notEquals(_entryAction, null);
+                  if (_operator_notEquals_2) {
+                    EList<Step> _steps_4 = seq.getSteps();
                     Step _entryAction_1 = ((ExecutionState) scope).getEntryAction();
-                    Call _newCall_4 = BehaviorMapping.this.factory.newCall(_entryAction_1);
-                    _steps_10.add(_newCall_4);
+                    Call _newCall_2 = BehaviorMapping.this.factory.newCall(_entryAction_1);
+                    _steps_4.add(_newCall_2);
                   }
-                  boolean _isAddTraceSteps_3 = BehaviorMapping.this.trace.isAddTraceSteps();
-                  if (_isAddTraceSteps_3) {
-                    EList<Step> _steps_11 = seq_1.getSteps();
+                  boolean _isAddTraceSteps_1 = BehaviorMapping.this.trace.isAddTraceSteps();
+                  if (_isAddTraceSteps_1) {
+                    EList<Step> _steps_5 = seq.getSteps();
                     TraceStateEntered _newTraceStateEntered = BehaviorMapping.this.trace.newTraceStateEntered(((ExecutionState) scope));
-                    _steps_11.add(_newTraceStateEntered);
+                    _steps_5.add(_newTraceStateEntered);
                   }
                 }
               }
-              _xblockexpression_1 = (seq_1);
+              _xblockexpression = (seq);
             }
-            return _xblockexpression_1;
+            return _xblockexpression;
           }
         };
-      IterableExtensions.<ExecutionScope, Sequence>fold(_reverse, sequence, _function_3);
+      IterableExtensions.<ExecutionScope, Sequence>fold(_reverse, sequence, _function);
       Vertex _target = t.getTarget();
-      boolean _operator_notEquals_11 = ObjectExtensions.operator_notEquals(_target, null);
-      if (_operator_notEquals_11) {
+      boolean _operator_notEquals_3 = ObjectExtensions.operator_notEquals(_target, null);
+      if (_operator_notEquals_3) {
         {
           Vertex _target_1 = t.getTarget();
           Region _parentRegion = _target_1.getParentRegion();
@@ -830,30 +670,30 @@ public class BehaviorMapping {
           final EList<Region> siblingRegions_1 = _regions;
           Vertex _target_2 = t.getTarget();
           if ((_target_2 instanceof org.yakindu.sct.model.sgraph.RegularState)) {
-            EList<Step> _steps_12 = sequence.getSteps();
+            EList<Step> _steps_6 = sequence.getSteps();
             Vertex _target_3 = t.getTarget();
-            ExecutionState _create_12 = this.factory.create(((RegularState) _target_3));
-            Sequence _enterSequence_2 = _create_12.getEnterSequence();
-            Call _newCall_5 = this.factory.newCall(_enterSequence_2);
-            _steps_12.add(_newCall_5);
+            ExecutionState _create_1 = this.factory.create(((RegularState) _target_3));
+            Sequence _enterSequence_2 = _create_1.getEnterSequence();
+            Call _newCall_3 = this.factory.newCall(_enterSequence_2);
+            _steps_6.add(_newCall_3);
           } else {
             Vertex _target_4 = t.getTarget();
             if ((_target_4 instanceof org.yakindu.sct.model.sgraph.Choice)) {
-              EList<Step> _steps_13 = sequence.getSteps();
+              EList<Step> _steps_7 = sequence.getSteps();
               Vertex _target_5 = t.getTarget();
-              ExecutionChoice _create_13 = this.factory.create(((Choice) _target_5));
-              Sequence _reactSequence = _create_13.getReactSequence();
-              Call _newCall_6 = this.factory.newCall(_reactSequence);
-              _steps_13.add(_newCall_6);
+              ExecutionChoice _create_2 = this.factory.create(((Choice) _target_5));
+              Sequence _reactSequence = _create_2.getReactSequence();
+              Call _newCall_4 = this.factory.newCall(_reactSequence);
+              _steps_7.add(_newCall_4);
             }
           }
         }
       }
       List<ExecutionScope> _entryScopes_1 = this.entryScopes(t);
-      Iterable<ExecutionScope> _drop_2 = IterableExtensions.<ExecutionScope>drop(_entryScopes_1, 1);
-      final Function2<Sequence,ExecutionScope,Sequence> _function_4 = new Function2<Sequence,ExecutionScope,Sequence>() {
-          public Sequence apply(final Sequence seq_2 , final ExecutionScope scope_1) {
-            Sequence _xblockexpression_2 = null;
+      Iterable<ExecutionScope> _drop_1 = IterableExtensions.<ExecutionScope>drop(_entryScopes_1, 1);
+      final Function2<Sequence,ExecutionScope,Sequence> _function_1 = new Function2<Sequence,ExecutionScope,Sequence>() {
+          public Sequence apply(final Sequence seq_1 , final ExecutionScope scope_1) {
+            Sequence _xblockexpression_1 = null;
             {
               if ((scope_1 instanceof org.yakindu.sct.model.sexec.ExecutionRegion)) {
                 {
@@ -862,25 +702,25 @@ public class BehaviorMapping {
                   final EList<ExecutionScope> siblingRegions_2 = _subScopes_1;
                   int _indexOf_1 = siblingRegions_2.indexOf(scope_1);
                   int _operator_plus = IntegerExtensions.operator_plus(((Integer)_indexOf_1), ((Integer)1));
-                  Iterable<ExecutionScope> _drop_3 = IterableExtensions.<ExecutionScope>drop(siblingRegions_2, _operator_plus);
-                  for (final ExecutionScope region_1 : _drop_3) {
+                  Iterable<ExecutionScope> _drop_2 = IterableExtensions.<ExecutionScope>drop(siblingRegions_2, _operator_plus);
+                  for (final ExecutionScope region_1 : _drop_2) {
                     Sequence _enterSequence_3 = region_1.getEnterSequence();
-                    boolean _operator_notEquals_12 = ObjectExtensions.operator_notEquals(_enterSequence_3, null);
-                    if (_operator_notEquals_12) {
-                      EList<Step> _steps_14 = seq_2.getSteps();
+                    boolean _operator_notEquals_4 = ObjectExtensions.operator_notEquals(_enterSequence_3, null);
+                    if (_operator_notEquals_4) {
+                      EList<Step> _steps_8 = seq_1.getSteps();
                       Sequence _enterSequence_4 = region_1.getEnterSequence();
-                      Call _newCall_7 = BehaviorMapping.this.factory.newCall(_enterSequence_4);
-                      _steps_14.add(_newCall_7);
+                      Call _newCall_5 = BehaviorMapping.this.factory.newCall(_enterSequence_4);
+                      _steps_8.add(_newCall_5);
                     }
                   }
                 }
               }
-              _xblockexpression_2 = (seq_2);
+              _xblockexpression_1 = (seq_1);
             }
-            return _xblockexpression_2;
+            return _xblockexpression_1;
           }
         };
-      IterableExtensions.<ExecutionScope, Sequence>fold(_drop_2, sequence, _function_4);
+      IterableExtensions.<ExecutionScope, Sequence>fold(_drop_1, sequence, _function_1);
       return sequence;
     }
   }

+ 84 - 0
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/Assert.java

@@ -6,18 +6,23 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.sql.CallableStatement;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 
 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.ExecutionState;
+import org.yakindu.sct.model.sexec.ExitState;
 import org.yakindu.sct.model.sexec.Sequence;
 import org.yakindu.sct.model.sexec.StateCase;
 import org.yakindu.sct.model.sexec.StateSwitch;
 import org.yakindu.sct.model.sexec.Step;
+import org.yakindu.sct.model.sexec.Trace;
+import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.stext.stext.Assignment;
 import org.yakindu.sct.model.stext.stext.AssignmentOperator;
 import org.yakindu.sct.model.stext.stext.BoolLiteral;
@@ -89,6 +94,14 @@ public class Assert {
 		return null;
 	}
 
+	/**
+	 * @deprecated Already Sequence in this case. Assert will never fail
+	 */
+	@Deprecated
+	public static Sequence assertedSequence(Sequence step) {
+		return step;
+	}
+
 	public static Sequence assertedSequence(Step step) {
 
 		assertNotNull("Step is null", step);
@@ -170,4 +183,75 @@ public class Assert {
 
 		return step.toString();
 	}
+
+	public static void assertedOrder(Step step,
+			List<? extends ExecutionState> currentStates,
+			List<? extends StepNode> requiredSteps) {
+		assertedOrder_intern(step, currentStates, requiredSteps);
+		if (!requiredSteps.isEmpty()) {
+			fail("Step was missing: " + requiredSteps.toString());
+		}
+	}
+
+	private static void assertedOrder_intern(Step step,
+			List<? extends ExecutionState> currentStates,
+			List<? extends StepNode> requiredSteps) {
+		if (requiredSteps.isEmpty()) {
+			return;
+		}
+		boolean found = false;
+
+		if (step == requiredSteps.get(0).step) {
+			found = true;
+			StepNode removed = requiredSteps.remove(0);
+			if (removed instanceof StepLeaf) {
+				return;
+			}
+		}
+		if (step instanceof Sequence) {
+			for (Step subStep : ((Sequence) step).getSteps()) {
+				assertedOrder_intern(subStep, currentStates, requiredSteps);
+			}
+		} else if (step instanceof Call) {
+			assertedOrder_intern(((Call) step).getStep(), currentStates,
+					requiredSteps);
+		} else if (step instanceof StateSwitch) {
+			StateCase stateCase = null;
+			StringBuilder sb = new StringBuilder();
+			for (StateCase caze : ((StateSwitch) step).getCases()) {
+				sb.append(", " + caze.getState().getName());
+				if (stateCase == null
+						&& caze.getState() == currentStates.get(0)) {
+					currentStates.remove(0);
+					stateCase = caze;
+				}
+			}
+			assertNotNull("No state case found for " + currentStates + " in "
+					+ sb.toString(), stateCase);
+			assertedOrder_intern(stateCase.getStep(), currentStates,
+					requiredSteps);
+		} else if (found == false) {
+			fail("Step without match: " + step);
+		}
+	}
+
+	public static class StepNode {
+		public final Step step;
+
+		public StepNode(Step step) {
+			assertNotNull(step);
+			this.step = step;
+		}
+
+		@Override
+		public String toString() {
+			return step.toString();
+		}
+	}
+
+	public static class StepLeaf extends StepNode {
+		public StepLeaf(Step step) {
+			super(step);
+		}
+	}
 }

+ 224 - 170
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/ModelSequencerHierarchyTest.java

@@ -4,40 +4,49 @@ import static org.junit.Assert.*;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.*;
 
 import org.junit.Test;
+import org.yakindu.sct.model.sexec.EnterState;
 import org.yakindu.sct.model.sexec.ExecutionFlow;
 import org.yakindu.sct.model.sexec.ExecutionState;
 import org.yakindu.sct.model.sexec.Reaction;
 import org.yakindu.sct.model.sexec.Sequence;
+import org.yakindu.sct.model.sexec.StateCase;
+import org.yakindu.sct.model.sexec.StateSwitch;
 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.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.VariableDefinition;
 
- 
 public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 
-
 	/**
-	 * The transition sequence must contain all exit actions for parent states that will be left by a transition.
+	 * The transition sequence must contain all exit actions for parent states
+	 * that will be left by a transition.
 	 */
-	@Test public void testParentEntryDeep() {
-		
-		Statechart sc = _createStatechart("sc"); {  
-			
+	@Test
+	public void testParentEntryDeep() {
+
+		Statechart sc = _createStatechart("sc");
+		{
+
 			InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
-			VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, s_scope);
-			
+			VariableDefinition v1 = _createVariableDefinition("v1",
+					TYPE_INTEGER, s_scope);
 
-			Region r = _createRegion("r", sc); {
-				State s1 = _createState("s1", r); {
+			Region r = _createRegion("r", sc);
+			{
+				State s1 = _createState("s1", r);
+				{
 					_createEntryAssignment(v1, s1, 1);
 
-					Region r_s1 = _createRegion("r", s1); {
-						State s3 = _createState("s3", r_s1); {
+					Region r_s1 = _createRegion("r", s1);
+					{
+						State s3 = _createState("s3", r_s1);
+						{
 							_createEntryAssignment(v1, s3, 2);
-							
-							Region r_s3 = _createRegion("r", s3); {
+
+							Region r_s3 = _createRegion("r", s3);
+							{
 								State s4 = _createState("s4", r_s3);
 								_createEntryAssignment(v1, s4, 3);
 
@@ -45,20 +54,21 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 							}
 						}
 					}
-				}		
-				State s2 = _createState("s2", r); {
-					Region r_s1 = _createRegion("r", s2); {
+				}
+				State s2 = _createState("s2", r);
+				{
+					Region r_s1 = _createRegion("r", s2);
+					{
 						_createState("s6", r_s1);
 					}
 				}
 			}
 		}
-	
+
 		_createTransition(findState(sc, "s6"), findState(sc, "s4"));
-		
+
 		ExecutionFlow flow = sequencer.transform(sc);
-		
-		
+
 		ExecutionState _s1 = flow.getStates().get(0);
 		assertEquals("sc.r.s1", _s1.getName());
 		assertNotNull(_s1.getEntryAction());
@@ -70,45 +80,52 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 		ExecutionState _s4 = flow.getStates().get(2);
 		assertEquals("sc.r.s1.r.s3.r.s4", _s4.getName());
 		assertNotNull(_s4.getEntryAction());
-		
+
 		ExecutionState _s6 = flow.getStates().get(5);
 		assertEquals("sc.r.s2.r.s6", _s6.getName());
 		assertNull(_s6.getEntryAction());
-		
+
 		Reaction _t = _s6.getReactions().get(0);
 		assertTrue(_t.isTransition());
-		
+
 		Sequence _effect = (Sequence) _t.getEffect();
 		assertEquals(4, _effect.getSteps().size());
-		
+
 		assertCall(_effect, 3, _s4.getEnterSequence());
-		assertCall(_effect, 2, _s3.getEntryAction());		
+		assertCall(_effect, 2, _s3.getEntryAction());
 		assertCall(_effect, 1, _s1.getEntryAction());
-		
+
 	}
-	
-	
+
 	/**
-	 * The transition sequence must contain all exit actions for parent states that will be left by a transition. 
-	 * A parent state may have no exit action.
+	 * The transition sequence must contain all exit actions for parent states
+	 * that will be left by a transition. A parent state may have no exit
+	 * action.
 	 * 
 	 */
-	@Test public void testParentEntryPartial() {
-		
-		Statechart sc = _createStatechart("sc"); {  
-			
+	@Test
+	public void testParentEntryPartial() {
+
+		Statechart sc = _createStatechart("sc");
+		{
+
 			InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
-			VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, s_scope);
-			
+			VariableDefinition v1 = _createVariableDefinition("v1",
+					TYPE_INTEGER, s_scope);
 
-			Region r = _createRegion("r", sc); {
-				State s1 = _createState("s1", r); {
+			Region r = _createRegion("r", sc);
+			{
+				State s1 = _createState("s1", r);
+				{
 					_createEntryAssignment(v1, s1, 1);
 
-					Region r_s1 = _createRegion("r", s1); {
-						State s3 = _createState("s3", r_s1); {
-							
-							Region r_s3 = _createRegion("r", s3); {
+					Region r_s1 = _createRegion("r", s1);
+					{
+						State s3 = _createState("s3", r_s1);
+						{
+
+							Region r_s3 = _createRegion("r", s3);
+							{
 								State s4 = _createState("s4", r_s3);
 								_createEntryAssignment(v1, s4, 3);
 
@@ -116,19 +133,21 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 							}
 						}
 					}
-				}		
-				State s2 = _createState("s2", r); {
-					Region r_s1 = _createRegion("r", s2); {
+				}
+				State s2 = _createState("s2", r);
+				{
+					Region r_s1 = _createRegion("r", s2);
+					{
 						_createState("s6", r_s1);
 					}
 				}
 			}
 		}
-	
+
 		_createTransition(findState(sc, "s6"), findState(sc, "s4"));
-		
+
 		ExecutionFlow flow = sequencer.transform(sc);
-			
+
 		ExecutionState _s1 = flow.getStates().get(0);
 		assertEquals("sc.r.s1", _s1.getName());
 		assertNotNull(_s1.getEntryAction());
@@ -140,44 +159,48 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 		ExecutionState _s4 = flow.getStates().get(2);
 		assertEquals("sc.r.s1.r.s3.r.s4", _s4.getName());
 		assertNotNull(_s4.getEntryAction());
-		
+
 		ExecutionState _s6 = flow.getStates().get(5);
 		assertEquals("sc.r.s2.r.s6", _s6.getName());
 		assertNull(_s6.getEntryAction());
-		
+
 		Reaction _t = _s6.getReactions().get(0);
 		assertTrue(_t.isTransition());
-		
+
 		Sequence _effect = (Sequence) _t.getEffect();
 		assertEquals(3, _effect.getSteps().size());
-		
+
 		assertCall(_effect, 2, _s4.getEnterSequence());
-		assertCall(_effect,  1, _s1.getEntryAction());
+		assertCall(_effect, 1, _s1.getEntryAction());
 	}
-	
-	
-	
-	
+
 	/**
 	 * Transitions to sibling state must nut invoke parent exit actions.
 	 */
-	@Test public void testParentEntryExclusionForSiblingTransitions() {
-		
-		Statechart sc = _createStatechart("sc"); {  
-			
+	@Test
+	public void testParentEntryExclusionForSiblingTransitions() {
+
+		Statechart sc = _createStatechart("sc");
+		{
+
 			InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
-			VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, s_scope);
-			
+			VariableDefinition v1 = _createVariableDefinition("v1",
+					TYPE_INTEGER, s_scope);
 
-			Region r = _createRegion("r", sc); {
-				State s1 = _createState("s1", r); {
+			Region r = _createRegion("r", sc);
+			{
+				State s1 = _createState("s1", r);
+				{
 					_createEntryAssignment(v1, s1, 1);
 
-					Region r_s1 = _createRegion("r", s1); {
-						State s3 = _createState("s3", r_s1); {
+					Region r_s1 = _createRegion("r", s1);
+					{
+						State s3 = _createState("s3", r_s1);
+						{
 							_createEntryAssignment(v1, s3, 2);
 
-							Region r_s3 = _createRegion("r", s3); {
+							Region r_s3 = _createRegion("r", s3);
+							{
 								State s4 = _createState("s4", r_s3);
 								_createEntryAssignment(v1, s4, 3);
 
@@ -185,19 +208,21 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 							}
 						}
 					}
-				}		
-				State s2 = _createState("s2", r); {
-					Region r_s1 = _createRegion("r", s2); {
+				}
+				State s2 = _createState("s2", r);
+				{
+					Region r_s1 = _createRegion("r", s2);
+					{
 						_createState("s6", r_s1);
 					}
 				}
 			}
 		}
-	
+
 		_createTransition(findState(sc, "s5"), findState(sc, "s4"));
-		
+
 		ExecutionFlow flow = sequencer.transform(sc);
-		
+
 		ExecutionState _s1 = flow.getStates().get(0);
 		assertEquals("sc.r.s1", _s1.getName());
 		assertNotNull(_s1.getEntryAction());
@@ -209,45 +234,48 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 		ExecutionState _s4 = flow.getStates().get(2);
 		assertEquals("sc.r.s1.r.s3.r.s4", _s4.getName());
 		assertNotNull(_s4.getEntryAction());
-		
+
 		ExecutionState _s5 = flow.getStates().get(3);
 		assertEquals("sc.r.s1.r.s3.r.s5", _s5.getName());
 		assertNull(_s5.getEntryAction());
-		
+
 		Reaction _t = _s5.getReactions().get(0);
 		assertTrue(_t.isTransition());
-		
+
 		Sequence _effect = (Sequence) _t.getEffect();
 		assertEquals(2, _effect.getSteps().size());
-		
-		assertCall(_effect, 1, _s4.getEnterSequence());	
-	}
 
+		assertCall(_effect, 1, _s4.getEnterSequence());
+	}
 
-	
-	
-	
-	
 	/**
-	 * The transition sequence must contain all exit actions for parent states that will be left by a transition.
+	 * The transition sequence must contain all exit actions for parent states
+	 * that will be left by a transition.
 	 */
-	@Test public void testParentExitDeep() {
-		
-		Statechart sc = _createStatechart("sc"); {  
-			
+	@Test
+	public void testParentExitDeep() {
+
+		Statechart sc = _createStatechart("sc");
+		{
+
 			InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
-			VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, s_scope);
-			
+			VariableDefinition v1 = _createVariableDefinition("v1",
+					TYPE_INTEGER, s_scope);
 
-			Region r = _createRegion("r", sc); {
-				State s1 = _createState("s1", r); {
+			Region r = _createRegion("r", sc);
+			{
+				State s1 = _createState("s1", r);
+				{
 					_createExitAssignment(v1, s1, 1);
 
-					Region r_s1 = _createRegion("r", s1); {
-						State s3 = _createState("s3", r_s1); {
+					Region r_s1 = _createRegion("r", s1);
+					{
+						State s3 = _createState("s3", r_s1);
+						{
 							_createExitAssignment(v1, s3, 2);
-							
-							Region r_s3 = _createRegion("r", s3); {
+
+							Region r_s3 = _createRegion("r", s3);
+							{
 								State s4 = _createState("s4", r_s3);
 								_createExitAssignment(v1, s4, 3);
 
@@ -255,20 +283,21 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 							}
 						}
 					}
-				}		
-				State s2 = _createState("s2", r); {
-					Region r_s1 = _createRegion("r", s2); {
+				}
+				State s2 = _createState("s2", r);
+				{
+					Region r_s1 = _createRegion("r", s2);
+					{
 						_createState("s6", r_s1);
 					}
 				}
 			}
 		}
-	
+
 		_createTransition(findState(sc, "s4"), findState(sc, "s6"));
-		
+
 		ExecutionFlow flow = sequencer.transform(sc);
-		
-		
+
 		ExecutionState _s1 = flow.getStates().get(0);
 		assertEquals("sc.r.s1", _s1.getName());
 		assertNotNull(_s1.getExitAction());
@@ -280,40 +309,61 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 		ExecutionState _s4 = flow.getStates().get(2);
 		assertEquals("sc.r.s1.r.s3.r.s4", _s4.getName());
 		assertNotNull(_s4.getExitAction());
-		
+
+		ExecutionState _s6 = flow.getStates().get(5);
+		assertEquals("sc.r.s2.r.s6", _s6.getName());
+
 		Reaction _t = _s4.getReactions().get(0);
 		assertTrue(_t.isTransition());
-		
+
 		Sequence _effect = (Sequence) _t.getEffect();
-		assertEquals(4, _effect.getSteps().size());
-		
-		assertCall(_effect, 0, _s4.getExitSequence());
-		assertCall(_effect, 1, _s3.getExitAction());
-		assertCall(_effect, 2, _s1.getExitAction());
+		assertEquals(2, _effect.getSteps().size());
+
+		assertCall(_effect, 0, _s1.getExitSequence());
+		assertCall(_effect, 1, _s6.getEnterSequence());
+
+		assertCall(_s1.getExitSequence(), 0, _s1.getSubScopes().get(0)
+				.getExitSequence());
+		StateSwitch _switch = (StateSwitch) _s1.getSubScopes().get(0)
+				.getExitSequence().getSteps().get(0);
+
+		StateCase _s4_case = assertedStateCase(_switch, _s4);
+		assertCall(assertedSequence(_s4_case.getStep()), 0,
+				_s4.getExitSequence());
+		assertCall(assertedSequence(_s4_case.getStep()), 1, _s3.getExitAction());
+
+		assertCall(_s1.getExitSequence(), 1, _s1.getExitAction());
 	}
-	
-	
+
 	/**
-	 * The transition sequence must contain all exit actions for parent states that will be left by a transition. 
-	 * A parent state may have no exit action.
+	 * The transition sequence must contain all exit actions for parent states
+	 * that will be left by a transition. A parent state may have no exit
+	 * action.
 	 * 
 	 */
-	@Test public void testParentExitPartial() {
-		
-		Statechart sc = _createStatechart("sc"); {  
-			
+	@Test
+	public void testParentExitPartial() {
+
+		Statechart sc = _createStatechart("sc");
+		{
+
 			InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
-			VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, s_scope);
-			
+			VariableDefinition v1 = _createVariableDefinition("v1",
+					TYPE_INTEGER, s_scope);
 
-			Region r = _createRegion("r", sc); {
-				State s1 = _createState("s1", r); {
+			Region r = _createRegion("r", sc);
+			{
+				State s1 = _createState("s1", r);
+				{
 					_createExitAssignment(v1, s1, 1);
 
-					Region r_s1 = _createRegion("r", s1); {
-						State s3 = _createState("s3", r_s1); {
-							
-							Region r_s3 = _createRegion("r", s3); {
+					Region r_s1 = _createRegion("r", s1);
+					{
+						State s3 = _createState("s3", r_s1);
+						{
+
+							Region r_s3 = _createRegion("r", s3);
+							{
 								State s4 = _createState("s4", r_s3);
 								_createExitAssignment(v1, s4, 3);
 
@@ -321,20 +371,21 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 							}
 						}
 					}
-				}		
-				State s2 = _createState("s2", r); {
-					Region r_s1 = _createRegion("r", s2); {
+				}
+				State s2 = _createState("s2", r);
+				{
+					Region r_s1 = _createRegion("r", s2);
+					{
 						_createState("s6", r_s1);
 					}
 				}
 			}
 		}
-	
+
 		_createTransition(findState(sc, "s4"), findState(sc, "s6"));
-		
+
 		ExecutionFlow flow = sequencer.transform(sc);
-		
-		
+
 		ExecutionState _s1 = flow.getStates().get(0);
 		assertEquals("sc.r.s1", _s1.getName());
 		assertNotNull(_s1.getExitAction());
@@ -346,39 +397,45 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 		ExecutionState _s4 = flow.getStates().get(2);
 		assertEquals("sc.r.s1.r.s3.r.s4", _s4.getName());
 		assertNotNull(_s4.getExitAction());
-		
+
 		Reaction _t = _s4.getReactions().get(0);
 		assertTrue(_t.isTransition());
-		
+
 		Sequence _effect = (Sequence) _t.getEffect();
-		assertEquals(3, _effect.getSteps().size());
-		
-		assertCall(_effect, 0, _s4.getExitSequence());
-		assertCall(_effect, 1, _s1.getExitAction());
+		assertEquals(2, _effect.getSteps().size());
+
+		assertCall(_effect, 0, _s1.getExitSequence());
+		// assertCall(_effect, 0, _s4.getExitSequence());
+		// assertCall(_effect, 1, _s1.getExitAction());
 	}
-	
 
-	
 	/**
 	 * Transitions to sibling state must nut invoke parent exit actions.
 	 */
-	@Test public void testParentExitExclusionForSiblingTransitions() {
-		
-		Statechart sc = _createStatechart("sc"); {  
-			
+	@Test
+	public void testParentExitExclusionForSiblingTransitions() {
+
+		Statechart sc = _createStatechart("sc");
+		{
+
 			InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
-			VariableDefinition v1 = _createVariableDefinition("v1", TYPE_INTEGER, s_scope);
-			
+			VariableDefinition v1 = _createVariableDefinition("v1",
+					TYPE_INTEGER, s_scope);
 
-			Region r = _createRegion("r", sc); {
-				State s1 = _createState("s1", r); {
+			Region r = _createRegion("r", sc);
+			{
+				State s1 = _createState("s1", r);
+				{
 					_createExitAssignment(v1, s1, 1);
 
-					Region r_s1 = _createRegion("r", s1); {
-						State s3 = _createState("s3", r_s1); {
+					Region r_s1 = _createRegion("r", s1);
+					{
+						State s3 = _createState("s3", r_s1);
+						{
 							_createExitAssignment(v1, s3, 2);
 
-							Region r_s3 = _createRegion("r", s3); {
+							Region r_s3 = _createRegion("r", s3);
+							{
 								State s4 = _createState("s4", r_s3);
 								_createExitAssignment(v1, s4, 3);
 
@@ -386,20 +443,21 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 							}
 						}
 					}
-				}		
-				State s2 = _createState("s2", r); {
-					Region r_s1 = _createRegion("r", s2); {
+				}
+				State s2 = _createState("s2", r);
+				{
+					Region r_s1 = _createRegion("r", s2);
+					{
 						_createState("s6", r_s1);
 					}
 				}
 			}
 		}
-	
+
 		_createTransition(findState(sc, "s4"), findState(sc, "s5"));
-		
+
 		ExecutionFlow flow = sequencer.transform(sc);
-		
-		
+
 		ExecutionState _s1 = flow.getStates().get(0);
 		assertEquals("sc.r.s1", _s1.getName());
 		assertNotNull(_s1.getExitAction());
@@ -411,19 +469,15 @@ public class ModelSequencerHierarchyTest extends ModelSequencerTest {
 		ExecutionState _s4 = flow.getStates().get(2);
 		assertEquals("sc.r.s1.r.s3.r.s4", _s4.getName());
 		assertNotNull(_s4.getExitAction());
-		
+
 		Reaction _t = _s4.getReactions().get(0);
 		assertTrue(_t.isTransition());
-		
+
 		Sequence _effect = (Sequence) _t.getEffect();
 		assertSequenceSize(2, _effect);
-		
-		assertCall(_effect, 0, _s4.getExitSequence());
-		
-	}
 
+		assertCall(_effect, 0, _s4.getExitSequence());
 
-	
-	
+	}
 
 }

+ 114 - 242
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/ModelSequencerOrthogonalityTest.java

@@ -2,6 +2,7 @@ package org.yakindu.sct.model.sexec.transformation.test;
 
 import static org.junit.Assert.*;
 import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.*;
+import static org.yakindu.sct.model.sexec.transformation.test.Assert.*;
 
 import org.junit.Test;
 import org.yakindu.sct.model.sexec.Call;
@@ -19,6 +20,8 @@ import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.VariableDefinition;
 
+import com.google.common.collect.Lists;
+
 public class ModelSequencerOrthogonalityTest extends ModelSequencerTest {
 
 	/**
@@ -552,6 +555,8 @@ public class ModelSequencerOrthogonalityTest extends ModelSequencerTest {
 
 		ExecutionFlow flow = sequencer.transform(sc);
 
+		ExecutionState _s1 = flow.getStates().get(0);
+		assertEquals("sc.r.s1", _s1.getName());
 		ExecutionState _s2 = flow.getStates().get(1);
 		assertEquals("sc.r.s1.r2.s2", _s2.getName());
 		ExecutionState _s2b = flow.getStates().get(2);
@@ -569,27 +574,14 @@ public class ModelSequencerOrthogonalityTest extends ModelSequencerTest {
 		assertTrue(_t.isTransition());
 
 		Sequence _effect = (Sequence) _t.getEffect();
-		assertEquals(4, _effect.getSteps().size());
-
-		Step _switch = _effect.getSteps().get(0);
-		assertStateSwitch(_switch, _s2, _s2b);
-		assertCall(assertedSequence(assertedStateCase(_switch, _s2).getStep()),
-				0, _s2.getExitSequence());
-		assertCall(
-				assertedSequence(assertedStateCase(_switch, _s2b).getStep()),
-				0, _s2b.getExitSequence());
-
-		assertCall(_effect, 1, _s3.getExitSequence());
+		assertEquals(2, _effect.getSteps().size());
 
-		_switch = _effect.getSteps().get(2);
-		assertStateSwitch(_switch, _s4, _s4b);
-		assertCall(assertedSequence(assertedStateCase(_switch, _s4).getStep()),
-				0, _s4.getExitSequence());
-		assertCall(
-				assertedSequence(assertedStateCase(_switch, _s4b).getStep()),
-				0, _s4b.getExitSequence());
+		assertedOrder(_effect, Lists.newArrayList(_s2b, _s3, _s4b),
+				Lists.newArrayList(new StepLeaf(_s2b.getExitSequence()),
+						new StepLeaf(_s3.getExitSequence()),
+						new StepLeaf(_s4b.getExitSequence())));
 
-		assertCall(_effect, 3, _s5.getEnterSequence());
+		assertCall(_effect, 1, _s5.getEnterSequence());
 	}
 
 	/**
@@ -688,33 +680,41 @@ public class ModelSequencerOrthogonalityTest extends ModelSequencerTest {
 		assertTrue(_t.isTransition());
 
 		Sequence _effect = (Sequence) _t.getEffect();
-		assertEquals(6, _effect.getSteps().size());
-
-		Step _switch = _effect.getSteps().get(0);
-		assertStateSwitch(_switch, _s2);
-		assertCall(assertedSequence(assertedStateCase(_switch, _s2).getStep()),
-				0, _s2.getExitSequence());
-
-		_switch = _effect.getSteps().get(1);
-		assertStateSwitch(_switch, _s3a);
-		assertCall(
-				assertedSequence(assertedStateCase(_switch, _s3a).getStep()),
-				0, _s3a.getExitSequence());
-
-		assertCall(_effect, 2, _s3b.getExitSequence());
-
-		_switch = _effect.getSteps().get(3);
-		assertStateSwitch(_switch, _s3c);
-		assertCall(
-				assertedSequence(assertedStateCase(_switch, _s3c).getStep()),
-				0, _s3c.getExitSequence());
+		assertEquals(2, _effect.getSteps().size());
 
-		_switch = _effect.getSteps().get(4);
-		assertStateSwitch(_switch, _s4);
-		assertCall(assertedSequence(assertedStateCase(_switch, _s4).getStep()),
-				0, _s4.getExitSequence());
+		assertedOrder(_effect, Lists.newArrayList(_s2, _s3a, _s3b, _s3c, _s4),
+				Lists.newArrayList(new StepLeaf(_s2.getExitSequence()),
+						new StepLeaf(_s3a.getExitSequence()),
+						new StepLeaf(_s3b.getExitSequence()),
+						new StepLeaf(_s3c.getExitSequence()),
+						new StepLeaf(_s4.getExitSequence())));
+		// Step _switch = _effect.getSteps().get(0);
+		// assertStateSwitch(_switch, _s2);
+		// assertCall(assertedSequence(assertedStateCase(_switch,
+		// _s2).getStep()),
+		// 0, _s2.getExitSequence());
+		//
+		// _switch = _effect.getSteps().get(1);
+		// assertStateSwitch(_switch, _s3a);
+		// assertCall(
+		// assertedSequence(assertedStateCase(_switch, _s3a).getStep()),
+		// 0, _s3a.getExitSequence());
+		//
+		// assertCall(_effect, 2, _s3b.getExitSequence());
+		//
+		// _switch = _effect.getSteps().get(3);
+		// assertStateSwitch(_switch, _s3c);
+		// assertCall(
+		// assertedSequence(assertedStateCase(_switch, _s3c).getStep()),
+		// 0, _s3c.getExitSequence());
+		//
+		// _switch = _effect.getSteps().get(4);
+		// assertStateSwitch(_switch, _s4);
+		// assertCall(assertedSequence(assertedStateCase(_switch,
+		// _s4).getStep()),
+		// 0, _s4.getExitSequence());
 
-		assertCall(_effect, 5, _s5.getEnterSequence());
+		assertCall(_effect, 1, _s5.getEnterSequence());
 	}
 
 	/**
@@ -820,24 +820,16 @@ public class ModelSequencerOrthogonalityTest extends ModelSequencerTest {
 		assertTrue(_t.isTransition());
 
 		Sequence _effect = (Sequence) _t.getEffect();
-		assertEquals("wrong steps: " + stepListAsString(_effect), 4, _effect
+		assertEquals("wrong steps: " + stepListAsString(_effect), 2, _effect
 				.getSteps().size());
 
-		Step _switch = _effect.getSteps().get(0);
-		assertStateSwitch(_switch, _s3a);
-		assertCall(
-				assertedSequence(assertedStateCase(_switch, _s3a).getStep()),
-				0, _s3a.getExitSequence());
-
-		assertCall(_effect, 1, _s3b2.getExitSequence());
-
-		_switch = _effect.getSteps().get(2);
-		assertStateSwitch(_switch, _s3c);
-		assertCall(
-				assertedSequence(assertedStateCase(_switch, _s3c).getStep()),
-				0, _s3c.getExitSequence());
+		assertedOrder(_effect, Lists.newArrayList(_s3a, _s3b2, _s3c),
+				Lists.newArrayList(new StepLeaf(_s3a.getExitSequence()),
+						new StepLeaf(_s3b2.getExitSequence()), new StepLeaf(
+								_s3c.getExitSequence()),
+						new StepLeaf(_s3z.getEnterSequence())));
 
-		assertCall(_effect, 3, _s3z.getEnterSequence());
+		assertCall(_effect, 1, _s3z.getEnterSequence());
 
 	}
 
@@ -1216,66 +1208,29 @@ public class ModelSequencerOrthogonalityTest extends ModelSequencerTest {
 
 		// check the exit sequence of _s
 		Sequence _exit = assertedSequence(_t.getEffect());
-		assertEquals("wrong steps: " + stepListAsString(_exit), 11, _exit
+		assertEquals("wrong steps: " + stepListAsString(_exit), 2, _exit
 				.getSteps().size());
 
-		StateSwitch _switch0 = assertedSwitch(_exit.getSteps().get(0));
-		assertStateSwitch(_switch0, _s1a1a1a);
-		assertSequenceSize(1, assertedStateCase(_switch0, _s1a1a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch0, _s1a1a1a)
-				.getStep()), 0, _s1a1a1a.getExitSequence());
-
-		assertCall(_exit, 1, _s1a1a2a.getExitSequence());
-		assertCall(_exit, 2, _s1a1a.getExitAction());
-
-		StateSwitch _switch2 = assertedSwitch(_exit.getSteps().get(3));
-		assertStateSwitch(_switch2, _s1a2a1a);
-		assertSequenceSize(1, assertedStateCase(_switch2, _s1a2a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch2, _s1a2a1a)
-				.getStep()), 0, _s1a2a1a.getExitSequence());
-
-		StateSwitch _switch3 = assertedSwitch(_exit.getSteps().get(4));
-		assertStateSwitch(_switch3, _s1a2a2a);
-		assertSequenceSize(3, assertedStateCase(_switch3, _s1a2a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch3, _s1a2a2a)
-				.getStep()), 0, _s1a2a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch3, _s1a2a2a)
-				.getStep()), 1, _s1a2a.getExitAction());
-		assertCall(assertedSequence(assertedStateCase(_switch3, _s1a2a2a)
-				.getStep()), 2, _s1a.getExitAction());
-
-		StateSwitch _switch4 = assertedSwitch(_exit.getSteps().get(5));
-		assertStateSwitch(_switch4, _s2a1a1a);
-		assertSequenceSize(1, assertedStateCase(_switch4, _s2a1a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch4, _s2a1a1a)
-				.getStep()), 0, _s2a1a1a.getExitSequence());
-
-		StateSwitch _switch5 = assertedSwitch(_exit.getSteps().get(6));
-		assertStateSwitch(_switch5, _s2a1a2a);
-		assertSequenceSize(2, assertedStateCase(_switch5, _s2a1a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch5, _s2a1a2a)
-				.getStep()), 0, _s2a1a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch5, _s2a1a2a)
-				.getStep()), 1, _s2a1a.getExitAction());
-
-		StateSwitch _switch6 = assertedSwitch(_exit.getSteps().get(7));
-		assertStateSwitch(_switch6, _s2a2a1a);
-		assertSequenceSize(1, assertedStateCase(_switch6, _s2a2a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch6, _s2a2a1a)
-				.getStep()), 0, _s2a2a1a.getExitSequence());
-
-		StateSwitch _switch7 = assertedSwitch(_exit.getSteps().get(8));
-		assertStateSwitch(_switch7, _s2a2a2a);
-		assertSequenceSize(3, assertedStateCase(_switch7, _s2a2a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch7, _s2a2a2a)
-				.getStep()), 0, _s2a2a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch7, _s2a2a2a)
-				.getStep()), 1, _s2a2a.getExitAction());
-		assertCall(assertedSequence(assertedStateCase(_switch7, _s2a2a2a)
-				.getStep()), 2, _s2a.getExitAction());
-
-		assertCall(_exit, 9, _s.getExitAction());
-		assertCall(_exit, 10, _b.getEnterSequence());
+		assertedOrder(_exit, Lists.newArrayList(_s1a1a1a, _s1a1a2a, _s1a2a1a,
+				_s1a2a2a, _s2a1a1a, _s2a1a2a, _s2a2a1a, _s2a2a2a),
+				Lists.newArrayList(new StepLeaf(_s1a1a1a.getExitSequence()),
+						new StepLeaf(_s1a1a2a.getExitSequence()), //
+						new StepLeaf(_s1a1a.getExitAction()), //
+						new StepLeaf(_s1a2a1a.getExitSequence()), //
+						new StepLeaf(_s1a2a2a.getExitSequence()), //
+						new StepLeaf(_s1a2a.getExitAction()), //
+						new StepLeaf(_s1a.getExitAction()), //
+						new StepLeaf(_s2a1a1a.getExitSequence()), //
+						new StepLeaf(_s2a1a2a.getExitSequence()), //
+						new StepLeaf(_s2a1a.getExitAction()), //
+						new StepLeaf(_s2a2a1a.getExitSequence()), //
+						new StepLeaf(_s2a2a2a.getExitSequence()),//
+						new StepLeaf(_s2a2a.getExitAction()), //
+						new StepLeaf(_s2a.getExitAction()), //
+						new StepLeaf(_s.getExitAction()), //
+						new StepLeaf(_b.getEnterSequence())));
+
+		assertCall(_exit, 1, _b.getEnterSequence());
 
 	}
 
@@ -1326,65 +1281,29 @@ public class ModelSequencerOrthogonalityTest extends ModelSequencerTest {
 
 		// check the exit sequence of _s
 		Sequence _exit = assertedSequence(_t.getEffect());
-		assertEquals("wrong steps: " + stepListAsString(_exit), 12, _exit
+		assertEquals("wrong steps: " + stepListAsString(_exit), 2, _exit
 				.getSteps().size());
 
-		StateSwitch _switch0 = assertedSwitch(_exit.getSteps().get(0));
-		assertStateSwitch(_switch0, _s1a1a1a);
-		assertSequenceSize(1, assertedStateCase(_switch0, _s1a1a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch0, _s1a1a1a)
-				.getStep()), 0, _s1a1a1a.getExitSequence());
-
-		StateSwitch _switch1 = assertedSwitch(_exit.getSteps().get(1));
-		assertStateSwitch(_switch1, _s1a1a2a);
-		assertSequenceSize(2, assertedStateCase(_switch1, _s1a1a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch1, _s1a1a2a)
-				.getStep()), 0, _s1a1a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch1, _s1a1a2a)
-				.getStep()), 1, _s1a1a.getExitAction());
-
-		StateSwitch _switch2 = assertedSwitch(_exit.getSteps().get(2));
-		assertStateSwitch(_switch2, _s1a2a1a);
-		assertSequenceSize(1, assertedStateCase(_switch2, _s1a2a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch2, _s1a2a1a)
-				.getStep()), 0, _s1a2a1a.getExitSequence());
-
-		StateSwitch _switch3 = assertedSwitch(_exit.getSteps().get(3));
-		assertStateSwitch(_switch3, _s1a2a2a);
-		assertSequenceSize(3, assertedStateCase(_switch3, _s1a2a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch3, _s1a2a2a)
-				.getStep()), 0, _s1a2a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch3, _s1a2a2a)
-				.getStep()), 1, _s1a2a.getExitAction());
-		assertCall(assertedSequence(assertedStateCase(_switch3, _s1a2a2a)
-				.getStep()), 2, _s1a.getExitAction());
-
-		StateSwitch _switch4 = assertedSwitch(_exit.getSteps().get(4));
-		assertStateSwitch(_switch4, _s2a1a1a);
-		assertSequenceSize(1, assertedStateCase(_switch4, _s2a1a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch4, _s2a1a1a)
-				.getStep()), 0, _s2a1a1a.getExitSequence());
-
-		StateSwitch _switch5 = assertedSwitch(_exit.getSteps().get(5));
-		assertStateSwitch(_switch5, _s2a1a2a);
-		assertSequenceSize(2, assertedStateCase(_switch5, _s2a1a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch5, _s2a1a2a)
-				.getStep()), 0, _s2a1a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch5, _s2a1a2a)
-				.getStep()), 1, _s2a1a.getExitAction());
-
-		StateSwitch _switch6 = assertedSwitch(_exit.getSteps().get(6));
-		assertStateSwitch(_switch6, _s2a2a1a);
-		assertSequenceSize(1, assertedStateCase(_switch6, _s2a2a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch6, _s2a2a1a)
-				.getStep()), 0, _s2a2a1a.getExitSequence());
-
-		assertCall(_exit, 7, _s2a2a2a.getExitSequence());
-		assertCall(_exit, 8, _s2a2a.getExitAction());
-		assertCall(_exit, 9, _s2a.getExitAction());
-		assertCall(_exit, 10, _s.getExitAction());
-
-		assertCall(_exit, 11, _b.getEnterSequence());
+		assertedOrder(_exit, Lists.newArrayList(_s1a1a1a, _s1a1a2a, _s1a2a1a,
+				_s1a2a2a, _s2a1a1a, _s2a1a2a, _s2a2a1a, _s2a2a2a),
+				Lists.newArrayList(new StepLeaf(_s1a1a1a.getExitSequence()),
+						new StepLeaf(_s1a1a2a.getExitSequence()), //
+						new StepLeaf(_s1a1a.getExitAction()), //
+						new StepLeaf(_s1a2a1a.getExitSequence()), //
+						new StepLeaf(_s1a2a2a.getExitSequence()), //
+						new StepLeaf(_s1a2a.getExitAction()), //
+						new StepLeaf(_s1a.getExitAction()), //
+						new StepLeaf(_s2a1a1a.getExitSequence()), //
+						new StepLeaf(_s2a1a2a.getExitSequence()), //
+						new StepLeaf(_s2a1a.getExitAction()), //
+						new StepLeaf(_s2a2a1a.getExitSequence()), //
+						new StepLeaf(_s2a2a2a.getExitSequence()),//
+						new StepLeaf(_s2a2a.getExitAction()), //
+						new StepLeaf(_s2a.getExitAction()), //
+						new StepLeaf(_s.getExitAction()), //
+						new StepLeaf(_b.getEnterSequence())));
+
+		assertCall(_exit, 1, _b.getEnterSequence());
 
 	}
 
@@ -1435,76 +1354,29 @@ public class ModelSequencerOrthogonalityTest extends ModelSequencerTest {
 
 		// check the exit sequence of _s
 		Sequence _exit = assertedSequence(_t.getEffect());
-		assertEquals("wrong steps: " + stepListAsString(_exit), 10, _exit
+		assertEquals("wrong steps: " + stepListAsString(_exit), 2, _exit
 				.getSteps().size());
 
-		StateSwitch _switch0 = assertedSwitch(_exit.getSteps().get(0));
-		assertStateSwitch(_switch0, _s1a1a1a);
-		assertSequenceSize(1, assertedStateCase(_switch0, _s1a1a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch0, _s1a1a1a)
-				.getStep()), 0, _s1a1a1a.getExitSequence());
-
-		StateSwitch _switch1 = assertedSwitch(_exit.getSteps().get(1));
-		assertStateSwitch(_switch1, _s1a1a2a);
-		assertSequenceSize(2, assertedStateCase(_switch1, _s1a1a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch1, _s1a1a2a)
-				.getStep()), 0, _s1a1a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch1, _s1a1a2a)
-				.getStep()), 1, _s1a1a.getExitAction());
-
-		assertCall(_exit, 2, _s1a2a.getExitSequence());
-		assertCall(_exit, 3, _s1a.getExitAction());
-
-		// StateSwitch _switch2 = assertedSwitch(_exit.getSteps().get(2));
-		// assertStateSwitch(_switch2, _s1a2a1a);
-		// assertSequenceSize(1, assertedStateCase(_switch2,
-		// _s1a2a1a).getStep());
-		// assertCall( assertedSequence(assertedStateCase(_switch2,
-		// _s1a2a1a).getStep()), 0, _s1a2a1a.getExitSequence());
-		//
-		// StateSwitch _switch3 = assertedSwitch(_exit.getSteps().get(3));
-		// assertStateSwitch(_switch3, _s1a2a2a);
-		// assertSequenceSize(3, assertedStateCase(_switch3,
-		// _s1a2a2a).getStep());
-		// assertCall( assertedSequence(assertedStateCase(_switch3,
-		// _s1a2a2a).getStep()), 0, _s1a2a2a.getExitSequence());
-		// assertCall( assertedSequence(assertedStateCase(_switch3,
-		// _s1a2a2a).getStep()), 1, _s1a2a.getExitAction());
-		// assertCall( assertedSequence(assertedStateCase(_switch3,
-		// _s1a2a2a).getStep()), 2, _s1a.getExitAction());
-
-		StateSwitch _switch4 = assertedSwitch(_exit.getSteps().get(4));
-		assertStateSwitch(_switch4, _s2a1a1a);
-		assertSequenceSize(1, assertedStateCase(_switch4, _s2a1a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch4, _s2a1a1a)
-				.getStep()), 0, _s2a1a1a.getExitSequence());
-
-		StateSwitch _switch5 = assertedSwitch(_exit.getSteps().get(5));
-		assertStateSwitch(_switch5, _s2a1a2a);
-		assertSequenceSize(2, assertedStateCase(_switch5, _s2a1a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch5, _s2a1a2a)
-				.getStep()), 0, _s2a1a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch5, _s2a1a2a)
-				.getStep()), 1, _s2a1a.getExitAction());
-
-		StateSwitch _switch6 = assertedSwitch(_exit.getSteps().get(6));
-		assertStateSwitch(_switch6, _s2a2a1a);
-		assertSequenceSize(1, assertedStateCase(_switch6, _s2a2a1a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch6, _s2a2a1a)
-				.getStep()), 0, _s2a2a1a.getExitSequence());
-
-		StateSwitch _switch7 = assertedSwitch(_exit.getSteps().get(7));
-		assertStateSwitch(_switch7, _s2a2a2a);
-		assertSequenceSize(3, assertedStateCase(_switch7, _s2a2a2a).getStep());
-		assertCall(assertedSequence(assertedStateCase(_switch7, _s2a2a2a)
-				.getStep()), 0, _s2a2a2a.getExitSequence());
-		assertCall(assertedSequence(assertedStateCase(_switch7, _s2a2a2a)
-				.getStep()), 1, _s2a2a.getExitAction());
-		assertCall(assertedSequence(assertedStateCase(_switch7, _s2a2a2a)
-				.getStep()), 2, _s2a.getExitAction());
-
-		assertCall(_exit, 8, _s.getExitAction());
-		assertCall(_exit, 9, _b.getEnterSequence());
+		assertedOrder(_exit, Lists.newArrayList(_s1a1a1a, _s1a1a2a, _s1a2a1a,
+				_s1a2a2a, _s2a1a1a, _s2a1a2a, _s2a2a1a, _s2a2a2a),
+				Lists.newArrayList(new StepLeaf(_s1a1a1a.getExitSequence()),
+						new StepLeaf(_s1a1a2a.getExitSequence()), //
+						new StepLeaf(_s1a1a.getExitAction()), //
+						new StepLeaf(_s1a2a1a.getExitSequence()), //
+						new StepLeaf(_s1a2a2a.getExitSequence()), //
+						new StepLeaf(_s1a2a.getExitAction()), //
+						new StepLeaf(_s1a.getExitAction()), //
+						new StepLeaf(_s2a1a1a.getExitSequence()), //
+						new StepLeaf(_s2a1a2a.getExitSequence()), //
+						new StepLeaf(_s2a1a.getExitAction()), //
+						new StepLeaf(_s2a2a1a.getExitSequence()), //
+						new StepLeaf(_s2a2a2a.getExitSequence()),//
+						new StepLeaf(_s2a2a.getExitAction()), //
+						new StepLeaf(_s2a.getExitAction()), //
+						new StepLeaf(_s.getExitAction()), //
+						new StepLeaf(_b.getEnterSequence())));
+
+		assertCall(_exit, 1, _b.getEnterSequence());
 
 	}