Browse Source

Fix EventDriven Simulation behavior (#1913)

* Fix EventDriven Simulation behavior

Prior to this change, out events are not raised when evaluated in the same
RunCycle, because they are put in the internalEventQueue and then ignored.

Furthermore, out events should not start a RunCycle, because that is not useful
and OutEvents are cleared on the beginning of a RunCycle.

* Add new test model for event driven out event handling

* Add test class for eventDrivenoutEvents

* Add test properly as sctunit generated test

* Fix test setup for eventdriven tests
Rene Beckmann 7 years ago
parent
commit
4d62bc146a

+ 11 - 8
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/EventDrivenSimulationEngine.java

@@ -6,7 +6,7 @@
  * http://www.eclipse.org/legal/epl-v10.html
  * Contributors:
  * 	committers of YAKINDU - initial API and implementation
- * 
+ *
  */
 
 package org.yakindu.sct.simulation.core.sexec.container;
@@ -14,6 +14,7 @@ package org.yakindu.sct.simulation.core.sexec.container;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.util.EContentAdapter;
 import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.model.sruntime.EventDirection;
 import org.yakindu.sct.model.sruntime.ExecutionEvent;
 import org.yakindu.sct.model.sruntime.SRuntimePackage;
 import org.yakindu.sct.simulation.core.engine.ISimulationEngine;
@@ -21,9 +22,9 @@ import org.yakindu.sct.simulation.core.sexec.interpreter.IExecutionFlowInterpret
 
 /**
  * Event Driven implementation of the {@link ISimulationEngine}.
- * 
+ *
  * @author andreas muelder - Initial contribution and API
- * 
+ *
  */
 public class EventDrivenSimulationEngine extends AbstractExecutionFlowSimulationEngine {
 
@@ -74,8 +75,7 @@ public class EventDrivenSimulationEngine extends AbstractExecutionFlowSimulation
 	}
 
 	public static class EventDrivenCycleAdapter extends EContentAdapter {
-
-		
+
 		private IExecutionFlowInterpreter interpreter;
 
 		private boolean suspended = false;
@@ -85,13 +85,15 @@ public class EventDrivenSimulationEngine extends AbstractExecutionFlowSimulation
 			this.interpreter = interpreter;
 		}
 
+		@Override
 		public void notifyChanged(Notification notification) {
 			super.notifyChanged(notification);
 			if (notification.getNotifier() instanceof ExecutionEvent
 					&& notification.getFeature() == SRuntimePackage.Literals.EXECUTION_EVENT__RAISED) {
+				ExecutionEvent event = (ExecutionEvent) notification.getNotifier();
 				if (notification.getNewBooleanValue() != notification.getOldBooleanValue()) {
-					if (notification.getNewBooleanValue()) {
-						if (!suspended) 
+					if (notification.getNewBooleanValue() && event.getDirection() != EventDirection.OUT) {
+						if (!suspended)
 							interpreter.runCycle();
 						else {
 							cycleAfterResume = true;
@@ -101,7 +103,8 @@ public class EventDrivenSimulationEngine extends AbstractExecutionFlowSimulation
 			}
 
 		}
-		
+
+		@Override
 		public boolean isAdapterForType(Object type) {
 			return type == EventDrivenCycleAdapter.class;
 		}

+ 2 - 1
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/interpreter/DefaultExecutionFlowInterpreter.xtend

@@ -19,6 +19,7 @@ import java.util.Queue
 import org.eclipse.emf.ecore.util.EcoreUtil
 import org.eclipse.xtend.lib.annotations.Data
 import org.yakindu.base.expressions.interpreter.IExpressionInterpreter
+import org.yakindu.base.types.Direction
 import org.yakindu.base.types.typesystem.ITypeValueProvider
 import org.yakindu.sct.model.sexec.Call
 import org.yakindu.sct.model.sexec.Check
@@ -302,7 +303,7 @@ class DefaultExecutionFlowInterpreter implements IExecutionFlowInterpreter, IEve
 	}
 
 	override raise(ExecutionEvent ev, Object value) {
-		if (useInternalEventQueue) {
+		if (useInternalEventQueue && ev.direction == Direction::LOCAL) {
 			internalEventQueue.add(new Event(ev, value));
 
 		} else {

+ 7 - 0
test-plugins/org.yakindu.sct.simulation.core.sexec.test/model/test.eventdriven.sgen

@@ -24,6 +24,13 @@ GeneratorModel for sctunit::interpreter {
 		}			
 	}
 	
+	test EventDrivenOutEvents {
+		feature Outlet{ 
+			targetProject = "org.yakindu.sct.simulation.core.sexec.test" 
+			targetFolder = "test-gen/org/yakindu/sct/simulation/core/sexec/test"
+		}	
+	}
+	
 	
 	
 }

+ 24 - 6
test-plugins/org.yakindu.sct.simulation.core.sexec.test/src/org/yakindu/sct/model/sexec/interpreter/test/util/AbstractExecutionFlowTest.java

@@ -23,8 +23,10 @@ import org.yakindu.sct.model.sgraph.RegularState;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sruntime.ExecutionContext;
 import org.yakindu.sct.model.sruntime.ExecutionVariable;
+import org.yakindu.sct.model.stext.lib.StatechartAnnotations;
 import org.yakindu.sct.model.stext.stext.ArgumentedAnnotation;
 import org.yakindu.sct.simulation.core.sexec.container.IExecutionContextInitializer;
+import org.yakindu.sct.simulation.core.sexec.interpreter.IEventRaiser;
 import org.yakindu.sct.simulation.core.sexec.interpreter.IExecutionFlowInterpreter;
 import org.yakindu.sct.simulation.core.util.ExecutionContextExtensions;
 import org.yakindu.sct.test.models.SCTUnitTestModels;
@@ -32,9 +34,9 @@ import org.yakindu.sct.test.models.SCTUnitTestModels;
 import com.google.inject.Inject;
 
 /**
- * 
+ *
  * @author andreas muelder - Initial contribution and API
- * 
+ *
  */
 public abstract class AbstractExecutionFlowTest {
 	@Inject
@@ -61,8 +63,12 @@ public abstract class AbstractExecutionFlowTest {
 	}
 
 	protected void initInterpreter(ExecutionFlow flow) {
+		initInterpreter(flow, false);
+	}
+
+	protected void initInterpreter(ExecutionFlow flow, boolean useInternalEventQueue) {
 		initializer.initialize(context, flow);
-		interpreter.initialize(flow, context, false);
+		interpreter.initialize(flow, context, useInternalEventQueue);
 		this.flow = flow;
 	}
 
@@ -125,12 +131,19 @@ public abstract class AbstractExecutionFlowTest {
 	}
 
 	protected void raiseEvent(String eventName) {
-		context().getEvent(eventName).setRaised(true);
+		raiseEvent(eventName, null);
 	}
 
 	protected void raiseEvent(String eventName, Object value) {
-		context().getEvent(eventName).setValue(value);
-		context().getEvent(eventName).setRaised(true);
+		if (interpreter instanceof IEventRaiser) {
+			((IEventRaiser) interpreter).raise(context().getEvent(eventName), value);
+		} else {
+			context().getEvent(eventName).setValue(value);
+			context().getEvent(eventName).setRaised(true);
+		}
+		if (isEventDriven()) {
+			interpreter.runCycle();
+		}
 
 	}
 
@@ -138,6 +151,11 @@ public abstract class AbstractExecutionFlowTest {
 		return context().getEvent(eventName).isRaised();
 	}
 
+	protected boolean isEventDriven() {
+		StatechartAnnotations annotations = new StatechartAnnotations();
+		return annotations.isEventDriven((Statechart) this.flow.getSourceElement());
+	}
+
 	protected long getCyclePeriod() {
 		ArgumentedAnnotation annotation = (ArgumentedAnnotation) ((Statechart) flow.getSourceElement())
 				.getAnnotationOfType(CYCLE_BASED_ANNOTATION);

+ 1 - 0
test-plugins/org.yakindu.sct.simulation.core.sexec.test/test-gen/org/yakindu/sct/simulation/core/sexec/test/AllTests.java

@@ -33,6 +33,7 @@ import org.junit.runners.Suite.SuiteClasses;
 	// EventDrivenInternalEvent.class,
 	// EventDrivenTriggeredByEvent.class,
 	// EventDrivenTriggeredByTimeEvent.class,
+	EventDrivenOutEvents.class,
 	ExitOnSelfTransition.class,
 	ExitState.class,
 	FeatureCalls.class,

+ 35 - 0
test-plugins/org.yakindu.sct.simulation.core.sexec.test/test-gen/org/yakindu/sct/simulation/core/sexec/test/EventDrivenOutEvents.java

@@ -0,0 +1,35 @@
+/* Generated by YAKINDU Statechart Tools code generator. */
+package org.yakindu.sct.simulation.core.sexec.test;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.xtext.junit4.InjectWith;
+import org.eclipse.xtext.junit4.XtextRunner;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.yakindu.sct.model.sexec.ExecutionFlow;
+import org.yakindu.sct.model.sexec.interpreter.test.util.AbstractExecutionFlowTest;
+import org.yakindu.sct.model.sexec.interpreter.test.util.SExecInjectionProvider;
+/**
+ * Unit TestCase for EventDrivenOutEvents
+ */
+@SuppressWarnings("all")
+@RunWith(XtextRunner.class)
+@InjectWith(SExecInjectionProvider.class)
+public class EventDrivenOutEvents extends AbstractExecutionFlowTest {
+	@Before
+	public void setup() throws Exception {
+		ExecutionFlow flow = models.loadExecutionFlowFromResource("EventDrivenOutEvents.sct");
+		initInterpreter(flow, true);
+	}
+	@Test
+	public void test() throws Exception {
+		interpreter.enter();
+		assertTrue(isStateActive("StateA"));
+		assertTrue(isStateActive("StateC"));
+		raiseEvent("e1");
+		assertTrue(isStateActive("StateB"));
+		assertTrue(isStateActive("StateD"));
+		interpreter.exit();
+	}
+}

+ 5 - 3
test-plugins/org.yakindu.sct.test.models/src/org/yakindu/sct/test/models/SCTUnitTestModels.java

@@ -20,9 +20,9 @@ import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 
 /**
- * 
+ *
  * @author andreas muelder - Initial contribution and API
- * 
+ *
  */
 public class SCTUnitTestModels extends AbstractTestModelsUtil {
 
@@ -42,6 +42,7 @@ public class SCTUnitTestModels extends AbstractTestModelsUtil {
 	public static final String DYNAMIC_CHOICE = "DynamicChoice.sct";
 	public static final String ENTER_STATE = "EnterState.sct";
 	public static final String ENTRY_CHOICE = "EntryChoice.sct";
+	public static final String EVENT_DRIVEN_OUT_EVENTS = "EventDrivenOutEvents.sct";
 	public static final String EXIT_ON_SELF_TRANSITION = "ExitOnSelfTransition.sct";
 	public static final String EXIT_STATE = "ExitState.sct";
 	public static final String EXIT_STATECHART = "ExitStatechart.sct /* don't test currently */";
@@ -91,7 +92,7 @@ public class SCTUnitTestModels extends AbstractTestModelsUtil {
 	}
 
 	public List<Statechart> loadAllStatecharts() throws Exception {
-		List<Statechart> result = new ArrayList<Statechart>();
+		List<Statechart> result = new ArrayList<>();
 		Field[] fields = getClass().getFields();
 		for (Field field : fields) {
 			String value = (String) field.get(this);
@@ -105,6 +106,7 @@ public class SCTUnitTestModels extends AbstractTestModelsUtil {
 		SCTUnitTestModels models = new SCTUnitTestModels();
 		List<Statechart> all = models.loadAllStatecharts();
 		return Iterables.transform(all, new Function<Statechart, Object[]>() {
+			@Override
 			public Object[] apply(Statechart input) {
 				return new Object[]{input};
 			}

+ 188 - 0
test-plugins/org.yakindu.sct.test.models/testmodels/SCTUnit/EventDrivenOutEvents.sct

@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:sgraph="http://www.yakindu.org/sct/sgraph/2.0.0">
+  <sgraph:Statechart xmi:id="_Z1uNIBe2EeimCJvyl8XbKA" specification="@EventDriven&#xA;interface:&#xA;in event e1&#xA;out event e2" name="EventDrivenOutEvents">
+    <regions xmi:id="_Z1wpYBe2EeimCJvyl8XbKA" name="main region">
+      <vertices xsi:type="sgraph:Entry" xmi:id="_Z16aYRe2EeimCJvyl8XbKA">
+        <outgoingTransitions xmi:id="_Z2AhARe2EeimCJvyl8XbKA" target="_Z18Pkxe2EeimCJvyl8XbKA"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_Z18Pkxe2EeimCJvyl8XbKA" name="StateA" incomingTransitions="_Z2AhARe2EeimCJvyl8XbKA">
+        <outgoingTransitions xmi:id="_dA-BIBe2EeimCJvyl8XbKA" specification="e1" target="_b_RTkBe2EeimCJvyl8XbKA"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_b_RTkBe2EeimCJvyl8XbKA" specification="entry / raise e2" name="StateB" incomingTransitions="_dA-BIBe2EeimCJvyl8XbKA"/>
+    </regions>
+    <regions xmi:id="_bBmxcBe2EeimCJvyl8XbKA" name="second region">
+      <vertices xsi:type="sgraph:Entry" xmi:id="_bBmxcRe2EeimCJvyl8XbKA">
+        <outgoingTransitions xmi:id="_bBmxche2EeimCJvyl8XbKA" target="_bBnYgBe2EeimCJvyl8XbKA"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_bBnYgBe2EeimCJvyl8XbKA" name="StateC" incomingTransitions="_bBmxche2EeimCJvyl8XbKA">
+        <outgoingTransitions xmi:id="_diL30Be2EeimCJvyl8XbKA" specification="e2" target="_ccFycBe2EeimCJvyl8XbKA"/>
+      </vertices>
+      <vertices xsi:type="sgraph:State" xmi:id="_ccFycBe2EeimCJvyl8XbKA" specification="" name="StateD" incomingTransitions="_diL30Be2EeimCJvyl8XbKA"/>
+    </regions>
+  </sgraph:Statechart>
+  <notation:Diagram xmi:id="_Z1wCUBe2EeimCJvyl8XbKA" type="org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor" element="_Z1uNIBe2EeimCJvyl8XbKA" measurementUnit="Pixel">
+    <children xmi:id="_Z1060Be2EeimCJvyl8XbKA" type="Region" element="_Z1wpYBe2EeimCJvyl8XbKA">
+      <children xsi:type="notation:DecorationNode" xmi:id="_Z15MQBe2EeimCJvyl8XbKA" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_Z15MQRe2EeimCJvyl8XbKA"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_Z15MQhe2EeimCJvyl8XbKA"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_Z15zUBe2EeimCJvyl8XbKA" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xmi:id="_Z17BcBe2EeimCJvyl8XbKA" type="Entry" element="_Z16aYRe2EeimCJvyl8XbKA">
+          <children xmi:id="_Z17ogBe2EeimCJvyl8XbKA" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_Z17ogxe2EeimCJvyl8XbKA" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_Z18PkBe2EeimCJvyl8XbKA"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_Z18PkRe2EeimCJvyl8XbKA"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_Z17ogRe2EeimCJvyl8XbKA" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Z17oghe2EeimCJvyl8XbKA"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_Z17BcRe2EeimCJvyl8XbKA" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_Z17Bche2EeimCJvyl8XbKA" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Z18Pkhe2EeimCJvyl8XbKA" x="70" y="20"/>
+        </children>
+        <children xmi:id="_Z19dsBe2EeimCJvyl8XbKA" type="State" element="_Z18Pkxe2EeimCJvyl8XbKA">
+          <children xsi:type="notation:DecorationNode" xmi:id="_Z1-EwBe2EeimCJvyl8XbKA" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_Z1-EwRe2EeimCJvyl8XbKA"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_Z1-Ewhe2EeimCJvyl8XbKA"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_Z1-r0Be2EeimCJvyl8XbKA" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_Z1-r0Re2EeimCJvyl8XbKA" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Z1-r0he2EeimCJvyl8XbKA"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_Z1_S4Be2EeimCJvyl8XbKA" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_Z19dsRe2EeimCJvyl8XbKA" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_Z19dshe2EeimCJvyl8XbKA"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_Z1_58Be2EeimCJvyl8XbKA" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Z2AhABe2EeimCJvyl8XbKA" x="40" y="80"/>
+        </children>
+        <children xmi:id="_b_Tv0Be2EeimCJvyl8XbKA" type="State" element="_b_RTkBe2EeimCJvyl8XbKA">
+          <children xsi:type="notation:DecorationNode" xmi:id="_b_U98Be2EeimCJvyl8XbKA" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_b_U98Re2EeimCJvyl8XbKA"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_b_U98he2EeimCJvyl8XbKA"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_b_U98xe2EeimCJvyl8XbKA" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_b_VlABe2EeimCJvyl8XbKA" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_b_VlARe2EeimCJvyl8XbKA"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_b_WMEBe2EeimCJvyl8XbKA" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_b_Tv0Re2EeimCJvyl8XbKA" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_b_Tv0he2EeimCJvyl8XbKA"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_b_WMERe2EeimCJvyl8XbKA" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_b_Tv0xe2EeimCJvyl8XbKA" x="51" y="249"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Z15zURe2EeimCJvyl8XbKA"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_Z1060Re2EeimCJvyl8XbKA" fontName="Verdana" fillColor="15790320" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Z16aYBe2EeimCJvyl8XbKA" x="220" y="10" width="400" height="400"/>
+    </children>
+    <children xsi:type="notation:Shape" xmi:id="_Z2FZgBe2EeimCJvyl8XbKA" type="StatechartText" fontName="Verdana" lineColor="4210752">
+      <children xsi:type="notation:DecorationNode" xmi:id="_Z2GAkBe2EeimCJvyl8XbKA" type="StatechartName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_Z2GAkRe2EeimCJvyl8XbKA"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_Z2GAkhe2EeimCJvyl8XbKA"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_Z2GAkxe2EeimCJvyl8XbKA" type="StatechartTextExpression" fontName="Verdana" lineColor="4210752">
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Z2GAlBe2EeimCJvyl8XbKA"/>
+      </children>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_Z2GnoBe2EeimCJvyl8XbKA" x="10" y="10" width="200" height="400"/>
+    </children>
+    <children xmi:id="_bBljUBe2EeimCJvyl8XbKA" type="Region" element="_bBmxcBe2EeimCJvyl8XbKA">
+      <children xsi:type="notation:DecorationNode" xmi:id="_bBljURe2EeimCJvyl8XbKA" type="RegionName">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_bBljUhe2EeimCJvyl8XbKA"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_bBljUxe2EeimCJvyl8XbKA"/>
+      </children>
+      <children xsi:type="notation:Shape" xmi:id="_bBljVBe2EeimCJvyl8XbKA" type="RegionCompartment" fontName="Verdana" lineColor="4210752">
+        <children xmi:id="_bBljVRe2EeimCJvyl8XbKA" type="Entry" element="_bBmxcRe2EeimCJvyl8XbKA">
+          <children xmi:id="_bBljVhe2EeimCJvyl8XbKA" type="BorderItemLabelContainer">
+            <children xsi:type="notation:DecorationNode" xmi:id="_bBljVxe2EeimCJvyl8XbKA" type="BorderItemLabel">
+              <styles xsi:type="notation:ShapeStyle" xmi:id="_bBljWBe2EeimCJvyl8XbKA"/>
+              <layoutConstraint xsi:type="notation:Location" xmi:id="_bBljWRe2EeimCJvyl8XbKA"/>
+            </children>
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_bBljWhe2EeimCJvyl8XbKA" fontName="Verdana" lineColor="4210752"/>
+            <layoutConstraint xsi:type="notation:Bounds" xmi:id="_bBljWxe2EeimCJvyl8XbKA"/>
+          </children>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_bBljXBe2EeimCJvyl8XbKA" fontName="Verdana" fillColor="0" lineColor="16777215"/>
+          <styles xsi:type="notation:NamedStyle" xmi:id="_bBljXRe2EeimCJvyl8XbKA" name="allowColors"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_bBljXhe2EeimCJvyl8XbKA" x="70" y="20"/>
+        </children>
+        <children xmi:id="_bBljXxe2EeimCJvyl8XbKA" type="State" element="_bBnYgBe2EeimCJvyl8XbKA">
+          <children xsi:type="notation:DecorationNode" xmi:id="_bBljYBe2EeimCJvyl8XbKA" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_bBljYRe2EeimCJvyl8XbKA"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_bBljYhe2EeimCJvyl8XbKA"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_bBljYxe2EeimCJvyl8XbKA" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_bBljZBe2EeimCJvyl8XbKA" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_bBljZRe2EeimCJvyl8XbKA"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_bBljZhe2EeimCJvyl8XbKA" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_bBljZxe2EeimCJvyl8XbKA" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_bBljaBe2EeimCJvyl8XbKA"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_bBljaRe2EeimCJvyl8XbKA" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_bBljahe2EeimCJvyl8XbKA" x="40" y="80"/>
+        </children>
+        <children xmi:id="_ccHnoBe2EeimCJvyl8XbKA" type="State" element="_ccFycBe2EeimCJvyl8XbKA">
+          <children xsi:type="notation:DecorationNode" xmi:id="_ccI1wBe2EeimCJvyl8XbKA" type="StateName">
+            <styles xsi:type="notation:ShapeStyle" xmi:id="_ccI1wRe2EeimCJvyl8XbKA"/>
+            <layoutConstraint xsi:type="notation:Location" xmi:id="_ccI1whe2EeimCJvyl8XbKA"/>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_ccKD4Be2EeimCJvyl8XbKA" type="StateTextCompartment">
+            <children xsi:type="notation:Shape" xmi:id="_ccKq8Be2EeimCJvyl8XbKA" type="StateTextCompartmentExpression" fontName="Verdana" lineColor="4210752">
+              <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ccKq8Re2EeimCJvyl8XbKA"/>
+            </children>
+          </children>
+          <children xsi:type="notation:Compartment" xmi:id="_ccKq8he2EeimCJvyl8XbKA" type="StateFigureCompartment"/>
+          <styles xsi:type="notation:ShapeStyle" xmi:id="_ccHnoRe2EeimCJvyl8XbKA" fontName="Verdana" fillColor="15981773" lineColor="12632256"/>
+          <styles xsi:type="notation:FontStyle" xmi:id="_ccHnohe2EeimCJvyl8XbKA"/>
+          <styles xsi:type="notation:BooleanValueStyle" xmi:id="_ccLSABe2EeimCJvyl8XbKA" name="isHorizontal" booleanValue="true"/>
+          <layoutConstraint xsi:type="notation:Bounds" xmi:id="_ccHnoxe2EeimCJvyl8XbKA" x="69" y="254"/>
+        </children>
+        <layoutConstraint xsi:type="notation:Bounds" xmi:id="_bBljaxe2EeimCJvyl8XbKA"/>
+      </children>
+      <styles xsi:type="notation:ShapeStyle" xmi:id="_bBljbBe2EeimCJvyl8XbKA" fontName="Verdana" fillColor="15790320" lineColor="12632256"/>
+      <layoutConstraint xsi:type="notation:Bounds" xmi:id="_bBljbRe2EeimCJvyl8XbKA" x="680" y="10" width="400" height="400"/>
+    </children>
+    <styles xsi:type="notation:BooleanValueStyle" xmi:id="_Z1wCURe2EeimCJvyl8XbKA" name="inlineDefinitionSection" booleanValue="true"/>
+    <styles xsi:type="notation:DiagramStyle" xmi:id="_Z1wCUhe2EeimCJvyl8XbKA"/>
+    <edges xmi:id="_Z2DkUBe2EeimCJvyl8XbKA" type="Transition" element="_Z2AhARe2EeimCJvyl8XbKA" source="_Z17BcBe2EeimCJvyl8XbKA" target="_Z19dsBe2EeimCJvyl8XbKA">
+      <children xsi:type="notation:DecorationNode" xmi:id="_Z2EycBe2EeimCJvyl8XbKA" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_Z2EycRe2EeimCJvyl8XbKA"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_Z2Eyche2EeimCJvyl8XbKA" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_Z2DkURe2EeimCJvyl8XbKA" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_Z2ELYBe2EeimCJvyl8XbKA" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_Z2DkUhe2EeimCJvyl8XbKA" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+    </edges>
+    <edges xmi:id="_bBpNsBe2EeimCJvyl8XbKA" type="Transition" element="_bBmxche2EeimCJvyl8XbKA" source="_bBljVRe2EeimCJvyl8XbKA" target="_bBljXxe2EeimCJvyl8XbKA">
+      <children xsi:type="notation:DecorationNode" xmi:id="_bBpNsRe2EeimCJvyl8XbKA" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_bBpNshe2EeimCJvyl8XbKA"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_bBpNsxe2EeimCJvyl8XbKA" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_bBpNtBe2EeimCJvyl8XbKA" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_bBpNtRe2EeimCJvyl8XbKA" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_bBpNthe2EeimCJvyl8XbKA" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+    </edges>
+    <edges xmi:id="_dA_PQBe2EeimCJvyl8XbKA" type="Transition" element="_dA-BIBe2EeimCJvyl8XbKA" source="_Z19dsBe2EeimCJvyl8XbKA" target="_b_Tv0Be2EeimCJvyl8XbKA">
+      <children xsi:type="notation:DecorationNode" xmi:id="_dA_PRBe2EeimCJvyl8XbKA" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_dA_PRRe2EeimCJvyl8XbKA"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_dA_PRhe2EeimCJvyl8XbKA" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_dA_PQRe2EeimCJvyl8XbKA" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_dA_PQxe2EeimCJvyl8XbKA" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_dA_PQhe2EeimCJvyl8XbKA" points="[3, 10, -31, -124]$[38, 131, 4, -3]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_dBBEcBe2EeimCJvyl8XbKA" id="(0.421875,0.8113207547169812)"/>
+      <targetAnchor xsi:type="notation:IdentityAnchor" xmi:id="_dBBEcRe2EeimCJvyl8XbKA" id="(0.6710526315789473,0.07547169811320754)"/>
+    </edges>
+    <edges xmi:id="_diNtABe2EeimCJvyl8XbKA" type="Transition" element="_diL30Be2EeimCJvyl8XbKA" source="_bBljXxe2EeimCJvyl8XbKA" target="_ccHnoBe2EeimCJvyl8XbKA">
+      <children xsi:type="notation:DecorationNode" xmi:id="_diNtBBe2EeimCJvyl8XbKA" type="TransitionExpression">
+        <styles xsi:type="notation:ShapeStyle" xmi:id="_diNtBRe2EeimCJvyl8XbKA"/>
+        <layoutConstraint xsi:type="notation:Location" xmi:id="_diNtBhe2EeimCJvyl8XbKA" y="10"/>
+      </children>
+      <styles xsi:type="notation:ConnectorStyle" xmi:id="_diNtARe2EeimCJvyl8XbKA" routing="Rectilinear" lineColor="4210752"/>
+      <styles xsi:type="notation:FontStyle" xmi:id="_diNtAxe2EeimCJvyl8XbKA" fontName="Verdana"/>
+      <bendpoints xsi:type="notation:RelativeBendpoints" xmi:id="_diNtAhe2EeimCJvyl8XbKA" points="[3, 10, -35, -150]$[40, 136, 2, -24]"/>
+      <sourceAnchor xsi:type="notation:IdentityAnchor" xmi:id="_diQJQBe2EeimCJvyl8XbKA" id="(0.453125,0.8113207547169812)"/>
+    </edges>
+  </notation:Diagram>
+</xmi:XMI>

+ 1 - 0
test-plugins/org.yakindu.sct.test.models/tests/AllTests.sctunit

@@ -30,6 +30,7 @@ testsuite AllTests {
 //	EventDrivenInternalEvent,
 	EventDrivenTriggeredByEvent,
 	EventDrivenTriggeredByTimeEvent,
+	EventDrivenOutEvents,
 
 	ExitOnSelfTransition, 
 	ExitState,

+ 13 - 0
test-plugins/org.yakindu.sct.test.models/tests/EventDrivenOutEvents.sctunit

@@ -0,0 +1,13 @@
+testclass EventDrivenOutEvents for statechart EventDrivenOutEvents {
+	
+	@Test
+	operation test() {
+		enter
+		assert active(EventDrivenOutEvents.main_region.StateA)
+		assert active(EventDrivenOutEvents.second_region.StateC)
+		raise e1
+		assert active(EventDrivenOutEvents.main_region.StateB)
+		assert active(EventDrivenOutEvents.second_region.StateD)
+		exit
+	}
+}