/**
* Copyright (c) 2012 itemis AG 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:
* itemis AG - initial API and implementation
*
*/
package org.yakindu.sct.model.stext.test.util;
import org.yakindu.base.base.NamedElement;
import org.yakindu.base.expressions.expressions.AssignmentExpression;
import org.yakindu.base.expressions.expressions.AssignmentOperator;
import org.yakindu.base.expressions.expressions.BoolLiteral;
import org.yakindu.base.expressions.expressions.ElementReferenceExpression;
import org.yakindu.base.expressions.expressions.Expression;
import org.yakindu.base.expressions.expressions.ExpressionsFactory;
import org.yakindu.base.expressions.expressions.FeatureCall;
import org.yakindu.base.expressions.expressions.IntLiteral;
import org.yakindu.base.expressions.expressions.PrimitiveValueExpression;
import org.yakindu.base.types.Type;
import org.yakindu.base.types.TypeSpecifier;
import org.yakindu.base.types.TypesFactory;
import org.yakindu.sct.model.sgraph.Reaction;
import org.yakindu.sct.model.sgraph.Scope;
import org.yakindu.sct.model.sgraph.ScopedElement;
import org.yakindu.sct.model.sgraph.State;
import org.yakindu.sct.model.sgraph.Statechart;
import org.yakindu.sct.model.stext.stext.AlwaysEvent;
import org.yakindu.sct.model.stext.stext.EventDefinition;
import org.yakindu.sct.model.stext.stext.EventSpec;
import org.yakindu.sct.model.stext.stext.Guard;
import org.yakindu.sct.model.stext.stext.InterfaceScope;
import org.yakindu.sct.model.stext.stext.InternalScope;
import org.yakindu.sct.model.stext.stext.LocalReaction;
import org.yakindu.sct.model.stext.stext.OperationDefinition;
import org.yakindu.sct.model.stext.stext.ReactionEffect;
import org.yakindu.sct.model.stext.stext.ReactionTrigger;
import org.yakindu.sct.model.stext.stext.RegularEventSpec;
import org.yakindu.sct.model.stext.stext.SimpleScope;
import org.yakindu.sct.model.stext.stext.StextFactory;
import org.yakindu.sct.model.stext.stext.TimeEventSpec;
import org.yakindu.sct.model.stext.stext.TimeEventType;
import org.yakindu.sct.model.stext.stext.TimeUnit;
import org.yakindu.sct.model.stext.stext.VariableDefinition;
import org.yakindu.sct.model.stext.stext.impl.StextFactoryImpl;
public class StextTestFactory extends StextFactoryImpl {
StextTestFactory eINSTANCE = new StextTestFactory();
public static EventDefinition _createEventDefinition(String name,
Scope scope) {
EventDefinition e = StextFactory.eINSTANCE.createEventDefinition();
e.setName(name);
if (scope != null)
scope.getDeclarations().add(e);
return e;
}
public static OperationDefinition _createOperation(String name, Scope scope) {
OperationDefinition e = StextFactory.eINSTANCE
.createOperationDefinition();
e.setName(name);
if (scope != null)
scope.getDeclarations().add(e);
return e;
}
public static VariableDefinition _createVariableDefinition(String name,
Type type, Scope scope, Expression initialValue) {
VariableDefinition definition = _createVariableDefinition(name, type,
scope);
definition.setInitialValue(initialValue);
return definition;
}
public static VariableDefinition _createVariableDefinition(String name,
Type type, Scope scope) {
VariableDefinition v = StextFactory.eINSTANCE
.createVariableDefinition();
v.setName(name);
TypeSpecifier typeSpecifier = TypesFactory.eINSTANCE.createTypeSpecifier();
typeSpecifier.setType(type);
v.setTypeSpecifier(typeSpecifier);
if (scope != null)
scope.getDeclarations().add(v);
return v;
}
public static Type _createIntegerType(String name) {
Type t = TypesFactory.eINSTANCE.createPrimitiveType();
t.setName(name);
return t;
}
public static Type _createRealType(String name) {
Type t = TypesFactory.eINSTANCE.createPrimitiveType();
t.setName(name);
return t;
}
public static Type _createBooleanType(String name) {
Type t = TypesFactory.eINSTANCE.createPrimitiveType();
t.setName(name);
return t;
}
public static Type _createStringType(String name) {
Type t = TypesFactory.eINSTANCE.createPrimitiveType();
t.setName(name);
return t;
}
public static Type _createVoidType(String name) {
Type t = TypesFactory.eINSTANCE.createPrimitiveType();
t.setName(name);
return t;
}
public static RegularEventSpec _createRegularEventSpec(EventDefinition e1,
ReactionTrigger rt) {
RegularEventSpec e1Spec = StextFactory.eINSTANCE
.createRegularEventSpec();
e1Spec.setEvent(_createElementReferenceExpression(e1));
if (rt != null)
rt.getTriggers().add(e1Spec);
return e1Spec;
}
public static ElementReferenceExpression _createElementReferenceExpression(
NamedElement target) {
ElementReferenceExpression referenceExpression = ExpressionsFactory.eINSTANCE
.createElementReferenceExpression();
referenceExpression.setReference(target);
return referenceExpression;
}
// public static OnCycleEvent _createOncycleEventSpec(ReactionTrigger rt) {
// OnCycleEvent oce = StextFactory.eINSTANCE.createOnCycleEvent();
// if (rt != null)
// rt.getTriggers().add(oce);
// return oce;
// }
public static AlwaysEvent _createAlwaysEventSpec(ReactionTrigger rt) {
AlwaysEvent always = StextFactory.eINSTANCE.createAlwaysEvent();
if (rt != null)
rt.getTriggers().add(always);
return always;
}
public static ReactionTrigger _createReactionTrigger(Reaction reaction) {
ReactionTrigger rt = StextFactory.eINSTANCE.createReactionTrigger();
if (reaction != null)
reaction.setTrigger(rt);
return rt;
}
public static InterfaceScope _createInterfaceScope(String name,
ScopedElement owner) {
InterfaceScope scope = StextFactory.eINSTANCE.createInterfaceScope();
scope.setName(name);
if (owner != null)
owner.getScopes().add(scope);
return scope;
}
public static InternalScope _createInternalScope(ScopedElement owner) {
InternalScope scope = StextFactory.eINSTANCE.createInternalScope();
if (owner != null)
owner.getScopes().add(scope);
return scope;
}
public static ReactionEffect _createReactionEffect(Reaction reaction) {
ReactionEffect effect = StextFactory.eINSTANCE.createReactionEffect();
if (reaction != null)
reaction.setEffect(effect);
return effect;
}
public static TimeEventSpec _createTimeEventSpec(TimeEventType type,
Expression value, TimeUnit unit, ReactionTrigger rt) {
TimeEventSpec timeTrigger = StextFactory.eINSTANCE
.createTimeEventSpec();
timeTrigger.setType(type);
timeTrigger.setValue(value);
timeTrigger.setUnit(unit);
if (rt != null)
rt.getTriggers().add(timeTrigger);
return timeTrigger;
}
public static LocalReaction _createEntryAction(State parent) {
return _createLocalReaction(parent,
StextFactory.eINSTANCE.createEntryEvent());
}
public static LocalReaction _createEntryAction(Statechart parent) {
return _createLocalReaction(parent,
StextFactory.eINSTANCE.createEntryEvent());
}
public static LocalReaction _createExitAction(State parent) {
return _createLocalReaction(parent,
StextFactory.eINSTANCE.createExitEvent());
}
public static LocalReaction _createExitAction(Statechart parent) {
return _createLocalReaction(parent,
StextFactory.eINSTANCE.createExitEvent());
}
public static Guard createGuardExpression(Expression expression) {
Guard guard = StextFactory.eINSTANCE.createGuard();
guard.setExpression(expression);
return guard;
}
public static LocalReaction _createTimeTriggeredReaction(State parent,
TimeEventType type, Expression value, TimeUnit unit) {
// TimeEventSpec timeTrigger =
// StextFactory.eINSTANCE.createTimeEventSpec();
// timeTrigger.setType(type);
// timeTrigger.setValue(value);
// timeTrigger.setUnit(unit);
return _createLocalReaction(parent,
_createTimeEventSpec(type, value, unit, null));
}
public static LocalReaction _createLocalReaction(State parent,
EventSpec triggerEvent) {
LocalReaction reaction = _createLocalReaction(triggerEvent);
Scope scope = getOrCreateSimpleScope(parent);
scope.getReactions().add(reaction);
return reaction;
}
public static LocalReaction _createLocalReaction(Statechart parent,
EventSpec triggerEvent) {
LocalReaction reaction = _createLocalReaction(triggerEvent);
Scope scope = getOrCreateInternalScope(parent);
scope.getReactions().add(reaction);
return reaction;
}
public static SimpleScope getOrCreateSimpleScope(State state) {
for (Scope scope : state.getScopes()) {
if (scope instanceof SimpleScope) {
return (SimpleScope) scope;
}
}
SimpleScope scope = StextFactory.eINSTANCE.createSimpleScope();
state.getScopes().add(scope);
return scope;
}
public static InternalScope getOrCreateInternalScope(Statechart sc) {
for (Scope scope : sc.getScopes()) {
if (scope instanceof InternalScope) {
return (InternalScope) scope;
}
}
return _createInternalScope(sc);
}
public static LocalReaction _createLocalReaction(EventSpec triggerEvent) {
LocalReaction reaction = StextFactory.eINSTANCE.createLocalReaction();
ReactionTrigger trigger = StextFactory.eINSTANCE
.createReactionTrigger();
_createReactionEffect(reaction);
if (triggerEvent != null)
trigger.getTriggers().add(triggerEvent);
reaction.setTrigger(trigger);
return reaction;
}
public static void _createExitAssignment(VariableDefinition v1, State s1,
int value) {
LocalReaction exitAction = _createExitAction(s1);
_createVariableAssignment(v1, AssignmentOperator.ASSIGN,
_createValue(value), (ReactionEffect) exitAction.getEffect());
}
public static void _createEntryAssignment(VariableDefinition v1, State s1,
int value) {
LocalReaction entryAction = _createEntryAction(s1);
_createVariableAssignment(v1, AssignmentOperator.ASSIGN,
_createValue(value), (ReactionEffect) entryAction.getEffect());
}
public static AssignmentExpression _createVariableAssignment(
VariableDefinition v, AssignmentOperator op, Expression expression,
ReactionEffect e) {
AssignmentExpression assignment = ExpressionsFactory.eINSTANCE
.createAssignmentExpression();
assignment.setVarRef(_createElementReferenceExpression(v));
assignment.setOperator(op);
assignment.setExpression(expression);
if (e != null)
e.getActions().add(assignment);
return assignment;
}
public static FeatureCall _createOperationCall(OperationDefinition o) {
// TODO add owner as TypedElementExpression
FeatureCall oc = ExpressionsFactory.eINSTANCE.createFeatureCall();
oc.setFeature(o);
oc.setOperationCall(true);
return oc;
}
public static PrimitiveValueExpression _createValue(int i) {
PrimitiveValueExpression assignment = ExpressionsFactory.eINSTANCE
.createPrimitiveValueExpression();
IntLiteral intLit = ExpressionsFactory.eINSTANCE.createIntLiteral();
intLit.setValue(i);
assignment.setValue(intLit);
return assignment;
}
public static PrimitiveValueExpression _createValue(boolean b) {
PrimitiveValueExpression pve = ExpressionsFactory.eINSTANCE.createPrimitiveValueExpression();
BoolLiteral boolLit = ExpressionsFactory.eINSTANCE.createBoolLiteral();
boolLit.setValue(b);
pve.setValue(boolLit);
return pve;
}
}