|
@@ -0,0 +1,135 @@
|
|
|
+package org.yakindu.sct.model.sexec.transformation.test;
|
|
|
+
|
|
|
+import static org.junit.Assert.fail;
|
|
|
+import static org.junit.Assert.assertEquals;
|
|
|
+import static org.junit.Assert.assertNotNull;
|
|
|
+import static org.junit.Assert.assertNull;
|
|
|
+import static org.junit.Assert.assertTrue;
|
|
|
+import static org.junit.Assert.assertFalse;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.TYPE_INTEGER;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createEntry;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createEntryAssignment;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createInterfaceScope;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createRegion;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createState;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createStatechart;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createTransition;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil._createVariableDefinition;
|
|
|
+import static org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.findState;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+
|
|
|
+import org.eclipse.emf.common.util.EList;
|
|
|
+import org.eclipse.emf.common.util.TreeIterator;
|
|
|
+import org.eclipse.emf.ecore.EObject;
|
|
|
+import org.junit.Test;
|
|
|
+import org.yakindu.sct.model.sexec.Call;
|
|
|
+import org.yakindu.sct.model.sexec.ExecutionEntry;
|
|
|
+import org.yakindu.sct.model.sexec.ExecutionFlow;
|
|
|
+import org.yakindu.sct.model.sexec.ExecutionNode;
|
|
|
+import org.yakindu.sct.model.sexec.ExecutionRegion;
|
|
|
+import org.yakindu.sct.model.sexec.ExecutionState;
|
|
|
+import org.yakindu.sct.model.sexec.HistoryEntry;
|
|
|
+import org.yakindu.sct.model.sexec.Reaction;
|
|
|
+import org.yakindu.sct.model.sexec.SaveHistory;
|
|
|
+import org.yakindu.sct.model.sexec.Sequence;
|
|
|
+import org.yakindu.sct.model.sexec.Step;
|
|
|
+import org.yakindu.sct.model.sexec.transformation.FlowOptimizer;
|
|
|
+import org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.MinimalTSC;
|
|
|
+import org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.InitializingTSC;
|
|
|
+import org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.OrthogonalFlatTSC;
|
|
|
+import org.yakindu.sct.model.sexec.transformation.test.SCTTestUtil.SimpleFlatTSC;
|
|
|
+import org.yakindu.sct.model.sgraph.Entry;
|
|
|
+import org.yakindu.sct.model.sgraph.EntryKind;
|
|
|
+import org.yakindu.sct.model.sgraph.Region;
|
|
|
+import org.yakindu.sct.model.sgraph.State;
|
|
|
+import org.yakindu.sct.model.sgraph.Statechart;
|
|
|
+import org.yakindu.sct.model.sgraph.Transition;
|
|
|
+import org.yakindu.sct.model.stext.stext.AssignmentOperator;
|
|
|
+import org.yakindu.sct.model.stext.stext.InterfaceScope;
|
|
|
+import org.yakindu.sct.model.stext.stext.VariableDefinition;
|
|
|
+
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.google.common.collect.Sets;
|
|
|
+import com.google.inject.Inject;
|
|
|
+
|
|
|
+public class FlowOptimizer_ExecutionEntryTest extends ModelSequencerTest {
|
|
|
+
|
|
|
+ @Inject
|
|
|
+ FlowOptimizer optimizer;
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testNoNullCall() {
|
|
|
+ Statechart sc = _createStatechart("sc");
|
|
|
+ {
|
|
|
+ InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
|
|
|
+ VariableDefinition v1 = _createVariableDefinition("v1",
|
|
|
+ TYPE_INTEGER, s_scope);
|
|
|
+ Region r = _createRegion("r", sc);
|
|
|
+ {
|
|
|
+ Entry r_entry = _createEntry(EntryKind.INITIAL, null, r);
|
|
|
+ State s1 = _createState("s1", r);
|
|
|
+ State s2 = _createState("s2", r);
|
|
|
+ {
|
|
|
+ _createEntryAssignment(v1, s2, 3);
|
|
|
+ Region r2 = _createRegion("r2", s2);
|
|
|
+ {
|
|
|
+ Entry e = _createEntry(EntryKind.INITIAL, null, r2);
|
|
|
+ Entry history = _createEntry(EntryKind.SHALLOW_HISTORY,
|
|
|
+ "history", r2);
|
|
|
+
|
|
|
+ State s3 = _createState("s3", r2);
|
|
|
+ {
|
|
|
+ _createEntryAssignment(v1, s3, 4);
|
|
|
+ }
|
|
|
+ State s4 = _createState("s4", r2);
|
|
|
+ {
|
|
|
+ Region r4 = _createRegion("r4", s4);
|
|
|
+ {
|
|
|
+ Entry e4 = _createEntry(EntryKind.INITIAL,
|
|
|
+ null, r2);
|
|
|
+ State s5 = _createState("s5", r4);
|
|
|
+ _createTransition(e4, s5);
|
|
|
+ _createTransition(s5, s1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ _createTransition(e, s3);
|
|
|
+ _createTransition(history, s3);
|
|
|
+ _createTransition(s3, s4);
|
|
|
+ _createTransition(s1, history);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ _createTransition(r_entry, s1);
|
|
|
+ _createTransition(s1, s2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ExecutionFlow flow = sequencer.transform(sc);
|
|
|
+
|
|
|
+ optimizer.inlineChoices(true);
|
|
|
+ optimizer.inlineEnterSequences(true);
|
|
|
+ optimizer.inlineEntryActions(true);
|
|
|
+ optimizer.inlineExitActions(true);
|
|
|
+ optimizer.inlineExitRegion(true);
|
|
|
+ optimizer.inlineExitSequences(true);
|
|
|
+ optimizer.inlineReactions(true);
|
|
|
+ optimizer.inlineEntries(true);
|
|
|
+ optimizer.transform(flow);
|
|
|
+
|
|
|
+ TreeIterator<EObject> iter = flow.eAllContents();
|
|
|
+ while (iter.hasNext()) {
|
|
|
+ EObject child = iter.next();
|
|
|
+ if (child instanceof Call) {
|
|
|
+ Call childCall = (Call) child;
|
|
|
+ if (childCall.getStep() == null) {
|
|
|
+ if (childCall.eContainer() instanceof Sequence) {
|
|
|
+ Sequence sequence = (Sequence) childCall.eContainer();
|
|
|
+ fail(sequence.getName() + ": " + sequence.getComment());
|
|
|
+ } else {
|
|
|
+ fail("Call of null-Step in " + childCall.eContainer());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|