package com.sap.furcas.runtime.tcs.testbase;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.naming.NameNotFoundException;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.junit.Before;
import com.sap.furcas.metamodel.FURCAS.TCS.Alternative;
import com.sap.furcas.metamodel.FURCAS.TCS.Block;
import com.sap.furcas.metamodel.FURCAS.TCS.ClassTemplate;
import com.sap.furcas.metamodel.FURCAS.TCS.ConditionalElement;
import com.sap.furcas.metamodel.FURCAS.TCS.CustomSeparator;
import com.sap.furcas.metamodel.FURCAS.TCS.FunctionCall;
import com.sap.furcas.metamodel.FURCAS.TCS.FunctionTemplate;
import com.sap.furcas.metamodel.FURCAS.TCS.Keyword;
import com.sap.furcas.metamodel.FURCAS.TCS.LiteralRef;
import com.sap.furcas.metamodel.FURCAS.TCS.ModePArg;
import com.sap.furcas.metamodel.FURCAS.TCS.Property;
import com.sap.furcas.metamodel.FURCAS.TCS.PropertyReference;
import com.sap.furcas.metamodel.FURCAS.TCS.Sequence;
import com.sap.furcas.metamodel.FURCAS.TCS.SequenceInAlternative;
import com.sap.furcas.metamodel.FURCAS.TCS.Symbol;
import com.sap.furcas.metamodel.FURCAS.TCS.TCSFactory;
import com.sap.furcas.test.testutils.ResourceTestHelper;
public class TCSFixtureTestBase {
protected Resource resource = ResourceTestHelper.createTransientResource(new ResourceSetImpl());
protected TCSFactory modelFactory;
protected Keyword keywordA;
protected Keyword keywordB;
protected Symbol symbolA;
protected Symbol symbolB;
protected FunctionTemplate funcTemplate;
protected Sequence funcTemplateSeq;
protected LiteralRef funcTemplateLit;
protected ClassTemplate abstractSequenceTemplate;
protected ClassTemplate functionTemplateTemplateMode1;
protected Sequence functionTemplateTemplateSeqMode1;
protected LiteralRef functionTemplateTemplateLitMode1;
protected ClassTemplate functionTemplateTemplateMode2;
protected Sequence functionTemplateTemplateSeqMode2;
protected LiteralRef functionTemplateTemplateLitMode2;
protected ClassTemplate main;
protected Sequence mainSeq;
protected LiteralRef main1Lit;
protected ConditionalElement main2Cond;
protected Sequence main2CondThenSeq;
protected LiteralRef main2CondThenLit;
protected Property main3Prop;
protected Alternative main4Alt;
protected SequenceInAlternative main4AltCase1Seq;
protected LiteralRef main4AltCase1Lit;
protected CustomSeparator main4AltCase1CustomSeparator;
protected SequenceInAlternative main4AltCase2Seq;
protected LiteralRef main4AltCase2Lit;
protected Block main5Block;
protected Sequence main5BlockSeq;
protected Property main5BlockProp;
protected FunctionCall main6Call;
protected LiteralRef main7Lit;
protected FunctionCall main8Call;
protected LiteralRef main9Lit;
protected Map<List<String>, Map<String, ClassTemplate>> classTemplateMap;
/**
* Initialize the fixture before each test is run.
*
* @throws NameNotFoundException
* @throws JmiException
*/
@Before
public void initFixture() {
modelFactory = TCSFactory.eINSTANCE;
createFixtureElements();
initFixtureStructure();
initClassTemplateMap();
}
private void createFixtureElements() {
keywordA = modelFactory.createKeyword();
keywordB = modelFactory.createKeyword();
symbolA = modelFactory.createSymbol();
symbolB = modelFactory.createSymbol();
funcTemplate = modelFactory.createFunctionTemplate();
funcTemplateSeq = modelFactory.createSequence();
funcTemplateLit = modelFactory.createLiteralRef();
abstractSequenceTemplate = modelFactory.createClassTemplate();
functionTemplateTemplateMode1 = modelFactory.createClassTemplate();
functionTemplateTemplateSeqMode1 = modelFactory.createSequence();
functionTemplateTemplateLitMode1 = modelFactory.createLiteralRef();
functionTemplateTemplateMode2 = modelFactory.createClassTemplate();
functionTemplateTemplateSeqMode2 = modelFactory.createSequence();
functionTemplateTemplateLitMode2 = modelFactory.createLiteralRef();
main = modelFactory.createClassTemplate();
mainSeq = modelFactory.createSequence();
main1Lit = modelFactory.createLiteralRef();
main2Cond = modelFactory.createConditionalElement();
main2CondThenSeq = modelFactory.createSequence();
main2CondThenLit = modelFactory.createLiteralRef();
main3Prop = modelFactory.createProperty();
main4Alt = modelFactory.createAlternative();
main4AltCase1Seq = modelFactory.createSequenceInAlternative();
main4AltCase1Lit = modelFactory.createLiteralRef();
main4AltCase1CustomSeparator = modelFactory.createCustomSeparator();
main4AltCase2Seq = modelFactory.createSequenceInAlternative();
main4AltCase2Lit = modelFactory.createLiteralRef();
main5Block = modelFactory.createBlock();
main5BlockSeq = modelFactory.createSequence();
main5BlockProp = modelFactory.createProperty();
main6Call = modelFactory.createFunctionCall();
main7Lit = modelFactory.createLiteralRef();
main8Call = modelFactory.createFunctionCall();
main9Lit = modelFactory.createLiteralRef();
}
private void initFixtureStructure() {
// funcTemplate
// - funcTemplateSeq
// - - funcTemplateLit
// abstractTemplateTemplate -> for TCS.Template
// functionTemplateTemplateMode1 #mode1 : abstractSequenceTemplate ->
// for
// TCS.FunctionTemplate
// - functionTemplateTemplateSeqMode1
// - - functionTemplateTemplateLitMode1
// functionTemplateTemplateMode2 #mode2: abstractSequenceTemplate -> for
// TCS.FunctionTemplate
// - functionTemplateTemplateSeqMode2
// - - functionTemplateTemplateLitMode2
// main
// - mainSeq
// - - main1Lit
// - - - ref: keywordA
// - - main2Cond
// - - - main2CondThenSeq
// - - - - main2CondThenLit
// - - - null
// - - main3Prop -> TCS.Property.propertyReference.name (atomic)
// - - main4Alt
// - - - main4AltCase1Seq
// - - - - main4AltCase1Lit
// - - - - main4AltCase1CustomSeparator
// - - - main4AltCase2Seq
// - - - - main4AltCase2Lit
// - - main5Block
// - - - main5BlockSeq
// - - - - main5BlockProp #mode2 -> TCS.ConcreteSyntax.templates (not
// atomic)
// - - main6Call
// - - - ref:funcTemplate
// - - main7Lit
// - - main8Call
// - - - ref:funcTemplate
// - - main9Lit
main.setIsMain(true);
resource.getContents().add(main);
funcTemplate.setFunctionSequence(funcTemplateSeq);
funcTemplateSeq.getElements().add(funcTemplateLit);
resource.getContents().add(funcTemplate);
abstractSequenceTemplate.getNames().add("Template");
abstractSequenceTemplate.setIsAbstract(true);
resource.getContents().add(abstractSequenceTemplate);
// look up through names
functionTemplateTemplateMode1.getNames().add("FunctionTemplate");
functionTemplateTemplateMode1.setMode("mode1");
functionTemplateTemplateMode1.setTemplateSequence(functionTemplateTemplateSeqMode1);
functionTemplateTemplateSeqMode1.getElements().add(functionTemplateTemplateLitMode1);
resource.getContents().add(functionTemplateTemplateMode1);
// look up through metaReference.qualifiedName
EClass metaReference = EcoreFactory.eINSTANCE.createEClass();
metaReference.setName("FunctionTemplate");
functionTemplateTemplateMode2.setMetaReference(metaReference);
functionTemplateTemplateMode2.setMode("mode2");
functionTemplateTemplateMode2.setTemplateSequence(functionTemplateTemplateSeqMode2);
functionTemplateTemplateSeqMode2.getElements().add(functionTemplateTemplateLitMode2);
resource.getContents().add(functionTemplateTemplateMode2);
main.setTemplateSequence(mainSeq);
mainSeq.getElements().add(main1Lit);
mainSeq.getElements().add(main2Cond);
main2Cond.setThenSequence(main2CondThenSeq);
main2CondThenSeq.getElements().add(main2CondThenLit);
main2Cond.setElseSequence(null);
mainSeq.getElements().add(main3Prop);
mainSeq.getElements().add(main4Alt);
main4Alt.getSequences().add(main4AltCase1Seq);
main4AltCase1Seq.getElements().add(main4AltCase1Lit);
main4AltCase1Seq.getElements().add(main4AltCase1CustomSeparator);
main4Alt.getSequences().add(main4AltCase2Seq);
main4AltCase2Seq.getElements().add(main4AltCase2Lit);
mainSeq.getElements().add(main5Block);
main5Block.setBlockSequence(main5BlockSeq);
main5BlockSeq.getElements().add(main5BlockProp);
mainSeq.getElements().add(main6Call);
main6Call.setCalledFunction(funcTemplate);
mainSeq.getElements().add(main7Lit);
mainSeq.getElements().add(main8Call);
main8Call.setCalledFunction(funcTemplate);
mainSeq.getElements().add(main9Lit);
keywordA.setValue("keywordA");
keywordB.setValue("keywordB");
symbolA.setValue("symbolA");
symbolB.setValue("symbolB");
funcTemplateLit.setReferredLiteral(keywordA);
functionTemplateTemplateLitMode1.setReferredLiteral(symbolA);
functionTemplateTemplateLitMode2.setReferredLiteral(symbolB);
main1Lit.setReferredLiteral(keywordA);
main2CondThenLit.setReferredLiteral(keywordA);
main4AltCase1Lit.setReferredLiteral(keywordB);
main4AltCase2Lit.setReferredLiteral(symbolB);
main7Lit.setReferredLiteral(keywordA);
main9Lit.setReferredLiteral(keywordB);
// link main3Prop to TCS.Property.propertyReference.name attribute
EClass propReferenceClass = modelFactory.createPropertyReference().eClass();
setStrucfeature(main3Prop, propReferenceClass.getEStructuralFeature("name"));
// link main5BlockProp to TCS.ConcreteSyntax.templates reference
EClass concreteSyntaxClass = modelFactory.createConcreteSyntax().eClass();
setStrucfeature(main5BlockProp, concreteSyntaxClass.getEStructuralFeature("templates"));
// add modearg of main5BlockProp to "mode2"
ModePArg modeArg = modelFactory.createModePArg();
modeArg.setMode("mode2");
main5BlockProp.getPropertyArgs().add(modeArg);
}
/**
* @param main3Prop2
* @param eStructuralFeature
*/
protected void setStrucfeature(Property prop, EStructuralFeature eStructuralFeature) {
PropertyReference propRef = modelFactory.createPropertyReference();
prop.setPropertyReference(propRef);
propRef.setStrucfeature(eStructuralFeature);
}
private void initClassTemplateMap() {
classTemplateMap = new HashMap<List<String>, Map<String, ClassTemplate>>();
Map<String, ClassTemplate> modeMap = new HashMap<String, ClassTemplate>();
List<String> key = new ArrayList<String>();
key.add("TCS");
key.add("Template");
modeMap.put(null, abstractSequenceTemplate);
classTemplateMap.put(key, modeMap);
modeMap = new HashMap<String, ClassTemplate>();
key = new ArrayList<String>();
key.add("TCS");
key.add("FunctionTemplate");
modeMap.put("mode1", functionTemplateTemplateMode1);
modeMap.put("mode2", functionTemplateTemplateMode2);
classTemplateMap.put(key, modeMap);
}
}