/**
* Copyright (c) 2015 committers of YAKINDU and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributors:
* committers of YAKINDU - initial API and implementation
*
*/
package org.yakindu.sct.model.sexec.transformation.test;
import static org.yakindu.sct.model.sgraph.test.util.SGraphTestFactory._createEntry;
import static org.yakindu.sct.model.sgraph.test.util.SGraphTestFactory._createRegion;
import static org.yakindu.sct.model.sgraph.test.util.SGraphTestFactory._createState;
import static org.yakindu.sct.model.sgraph.test.util.SGraphTestFactory._createStatechart;
import static org.yakindu.sct.model.sgraph.test.util.SGraphTestFactory._createTransition;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createBooleanType;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createEventDefinition;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createIntegerType;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createInterfaceScope;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createReactionTrigger;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createRealType;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createRegularEventSpec;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createStringType;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createValue;
import static org.yakindu.sct.model.stext.test.util.StextTestFactory._createVariableDefinition;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.EcoreUtil2;
import org.yakindu.base.types.Type;
import org.yakindu.sct.model.sexec.Sequence;
import org.yakindu.sct.model.sexec.Step;
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.EventDefinition;
import org.yakindu.sct.model.stext.stext.InterfaceScope;
import org.yakindu.sct.model.stext.stext.ReactionTrigger;
import org.yakindu.sct.model.stext.stext.VariableDefinition;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
public class SCTTestUtil {
public static Type TYPE_INTEGER = _createIntegerType("integer");
public static List<Step> flattenSequenceStepsAsList(Step step) {
return flattenSequenceStepsAsList(step, new LinkedList<Step>());
}
public static List<Step> flattenSequenceStepsAsList(Step step,
List<Step> result) {
if (step instanceof Sequence) {
Sequence sequence = (Sequence) step;
for (Step s : sequence.getSteps()) {
flattenSequenceStepsAsList(s, result);
}
} else {
result.add(step);
}
return result;
}
public static State findState(Statechart sc, final String name) {
Collection<EObject> states = Collections2.filter(
EcoreUtil2.eAllContentsAsList(sc), new Predicate<Object>() {
public boolean apply(Object obj) {
// TODO Auto-generated method stub
return obj != null && obj instanceof State
&& name.equals(((State) obj).getName());
}
});
return (states.size() > 0) ? (State) states.iterator().next() : null;
}
public static State findStateFullyQualified(Statechart sc, final String name) {
Collection<EObject> states = Collections2.filter(
EcoreUtil2.eAllContentsAsList(sc), new Predicate<Object>() {
public boolean apply(Object obj) {
// TODO Auto-generated method stub
return obj != null && obj instanceof State
&& name.equals(fqn((State) obj));
}
});
return (states.size() > 0) ? (State) states.iterator().next() : null;
}
public static final String fqn(State state) {
return fqn(state.getParentRegion()) + "." + state.getName();
}
public static final String fqn(Region region) {
if (region.getComposite() instanceof State)
return fqn((State) region.getComposite()) + "." + region.getName();
return ((Statechart) region.getComposite()).getName() + "."
+ region.getName();
}
public static class MinimalTSC {
public Statechart sc = _createStatechart("test");
public InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
public EventDefinition e1 = _createEventDefinition("e1", s_scope);
public Region r = _createRegion("main", sc);
public Entry entry = _createEntry(EntryKind.INITIAL, null, r);
public State s1 = _createState("S1", r);
public Transition t0 = _createTransition(entry, s1);
public MinimalTSC() {
}
}
public static class InitializingTSC {
public Statechart sc = _createStatechart("test");
public InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
public VariableDefinition e1 = _createVariableDefinition("e1",
_createBooleanType("boolean"), s_scope, _createValue(true));
public InitializingTSC() {
}
}
public static class InitializingWithoutDefaultTSC {
public Statechart sc = _createStatechart("test");
public InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
public VariableDefinition b = _createVariableDefinition("b",
_createBooleanType("boolean"), s_scope, null);
public VariableDefinition i = _createVariableDefinition("i",
_createIntegerType("integer"), s_scope, null);
public VariableDefinition r = _createVariableDefinition("r",
_createRealType("real"), s_scope, null);
public VariableDefinition s = _createVariableDefinition("s",
_createStringType("string"), s_scope, null);
public InitializingWithoutDefaultTSC() {
}
}
public static class SimpleFlatTSC {
public Statechart sc = _createStatechart("test");
public InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
public EventDefinition e1 = _createEventDefinition("e1", s_scope);
public Region r = _createRegion("main", sc);
public Entry entry = _createEntry(EntryKind.INITIAL, null, r);
public State s1 = _createState("S1", r);
public State s2 = _createState("S2", r);
public Transition t0 = _createTransition(entry, s1);
public Transition t1 = _createTransition(s1, s2);
public ReactionTrigger tr1 = _createReactionTrigger(t1);
public SimpleFlatTSC() {
_createRegularEventSpec(e1, tr1);
}
}
public static class OrthogonalFlatTSC {
public Statechart sc = _createStatechart("test");
public InterfaceScope s_scope = _createInterfaceScope("Interface", sc);
public EventDefinition e1 = _createEventDefinition("e1", s_scope);
public EventDefinition e2 = _createEventDefinition("e2", s_scope);
public Region r1 = _createRegion("first", sc);
public Entry entry_r1 = _createEntry(EntryKind.INITIAL, null, r1);
public State s1 = _createState("S1", r1);
public State s2 = _createState("S2", r1);
public Transition t0 = _createTransition(entry_r1, s1);
public Transition t1 = _createTransition(s1, s2);
public ReactionTrigger r1_tr1 = _createReactionTrigger(t1);
public Region r2 = _createRegion("second", sc);
public Entry entry_r2 = _createEntry(EntryKind.INITIAL, null, r2);
public State s3 = _createState("S3", r2);
public State s4 = _createState("S4", r2);
public Transition t0_r2 = _createTransition(entry_r2, s3);
public Transition t1_r2 = _createTransition(s3, s4);
public Transition t2_r2 = _createTransition(s3, s4);
public ReactionTrigger r2_tr1 = _createReactionTrigger(t1_r2);
public ReactionTrigger r2_tr2 = _createReactionTrigger(t2_r2);
public OrthogonalFlatTSC() {
_createRegularEventSpec(e1, r1_tr1);
_createRegularEventSpec(e1, r2_tr1);
_createRegularEventSpec(e2, r2_tr2);
}
}
}