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

ModelSequencer now processes 'oncycle' and 'always' triggers. ( YAKHMI-260 )

terfloth@itemis.de 14 лет назад
Родитель
Сommit
37e1e2e287

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

@@ -236,7 +236,15 @@ class ModelSequencer {
 			state.localReactions
 				.filter( typeof( LocalReaction ))
 				// ignore all reaction that are just entry or exit actions
-				.filter(lr | (lr.trigger as ReactionTrigger).triggers.empty || ! (lr.trigger as ReactionTrigger).triggers.filter( t | t instanceof RegularEventSpec || t instanceof TimeEventSpec).toList.empty)
+				.filter(lr | 
+					(lr.trigger as ReactionTrigger).triggers.empty 
+					|| ! (lr.trigger as ReactionTrigger).triggers.filter( t | 
+						t instanceof RegularEventSpec 
+						|| t instanceof TimeEventSpec 
+						|| t instanceof OnCycleEvent 
+						|| t instanceof AlwaysEvent
+					).toList.empty
+				)
 				.map(t | t.mapReaction)
 		)
 		return _state

+ 13 - 1
plugins/org.yakindu.sct.model.sexec/xtend-gen/org/yakindu/sct/model/sexec/transformation/ModelSequencer.java

@@ -361,10 +361,22 @@ public class ModelSequencer {
               final Function1<EventSpec,Boolean> _function_1 = new Function1<EventSpec,Boolean>() {
                   public Boolean apply(final EventSpec t) {
                     boolean _operator_or_1 = false;
+                    boolean _operator_or_2 = false;
+                    boolean _operator_or_3 = false;
                     if ((t instanceof org.yakindu.sct.model.stext.stext.RegularEventSpec)) {
+                      _operator_or_3 = true;
+                    } else {
+                      _operator_or_3 = BooleanExtensions.operator_or((t instanceof org.yakindu.sct.model.stext.stext.RegularEventSpec), (t instanceof org.yakindu.sct.model.stext.stext.TimeEventSpec));
+                    }
+                    if (_operator_or_3) {
+                      _operator_or_2 = true;
+                    } else {
+                      _operator_or_2 = BooleanExtensions.operator_or(_operator_or_3, (t instanceof org.yakindu.sct.model.stext.stext.OnCycleEvent));
+                    }
+                    if (_operator_or_2) {
                       _operator_or_1 = true;
                     } else {
-                      _operator_or_1 = BooleanExtensions.operator_or((t instanceof org.yakindu.sct.model.stext.stext.RegularEventSpec), (t instanceof org.yakindu.sct.model.stext.stext.TimeEventSpec));
+                      _operator_or_1 = BooleanExtensions.operator_or(_operator_or_2, (t instanceof org.yakindu.sct.model.stext.stext.AlwaysEvent));
                     }
                     return ((Boolean)_operator_or_1);
                   }

+ 55 - 0
test-plugins/org.yakindu.sct.model.sexec.test/src/org/yakindu/sct/model/sexec/transformation/test/ModelSequencerStateReactionTest.java

@@ -34,6 +34,7 @@ import org.yakindu.sct.model.stext.stext.NumericalMultiplyDivideExpression;
 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.StextFactory;
 import org.yakindu.sct.model.stext.stext.TimeEventType;
 import org.yakindu.sct.model.stext.stext.TimeUnit;
 import org.yakindu.sct.model.stext.stext.Type;
@@ -286,5 +287,59 @@ public class ModelSequencerStateReactionTest extends ModelSequencerTest {
 	}
 	
 
+	/**
+	 * Local reactions must be created for behavior with 'oncycle' trigger
+	 */
+	@Test public void testOncycleLocalReaction() {
+		
+		Statechart sc = _createStatechart("test");
+		Scope scope = _createInterfaceScope("interface", sc);
+		VariableDefinition v1 = _createVariableDefinition("v1", Type.INTEGER, scope);
+		Region r = _createRegion("main", sc);
+		State s= _createState("s", r);
+
+		
+		LocalReaction timeTriggeredReaction = _createLocalReaction(s, StextFactory.eINSTANCE.createOnCycleEvent());
+		Assignment assign = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue("42"), (ReactionEffect) timeTriggeredReaction.getEffect());
+		
+		ExecutionFlow flow = sequencer.transform(sc);
+		
+		ExecutionState _s = flow.getStates().get(0);
+
+		// assert that a local reaction is created
+		Reaction reaction = _s.getReactions().get(0);
+		PrimitiveValueExpression pve = (PrimitiveValueExpression) reaction.getCheck().getCondition();
+		assertSame("true", pve.getValue());
+		
+	}
+	
+	
+	/**
+	 * Local reactions must be created for behavior with 'always' trigger
+	 */
+	@Test public void testAlwaysLocalReaction() {
+		
+		Statechart sc = _createStatechart("test");
+		Scope scope = _createInterfaceScope("interface", sc);
+		VariableDefinition v1 = _createVariableDefinition("v1", Type.INTEGER, scope);
+		Region r = _createRegion("main", sc);
+		State s= _createState("s", r);
+
+		
+		LocalReaction timeTriggeredReaction = _createLocalReaction(s, StextFactory.eINSTANCE.createAlwaysEvent());
+		Assignment assign = _createVariableAssignment(v1, AssignmentOperator.ASSIGN, _createValue("42"), (ReactionEffect) timeTriggeredReaction.getEffect());
+		
+		ExecutionFlow flow = sequencer.transform(sc);
+		
+		ExecutionState _s = flow.getStates().get(0);
+
+		// assert that a local reaction is created
+		Reaction reaction = _s.getReactions().get(0);
+		PrimitiveValueExpression pve = (PrimitiveValueExpression) reaction.getCheck().getCondition();
+		assertSame("true", pve.getValue());
+		
+	}
+	
+
 	
 }