package com.sap.furcas.parsergenerator.tcs.injection;
import static com.sap.furcas.test.testutils.StringListHelper.list;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.List;
import org.junit.BeforeClass;
import org.junit.Test;
import com.sap.furcas.metamodel.FURCAS.TCS.Block;
import com.sap.furcas.metamodel.FURCAS.TCS.ClassTemplate;
import com.sap.furcas.metamodel.FURCAS.TCS.LiteralRef;
import com.sap.furcas.metamodel.FURCAS.TCS.PrimitiveTemplate;
import com.sap.furcas.metamodel.FURCAS.TCS.Property;
import com.sap.furcas.metamodel.FURCAS.TCS.PropertyArg;
import com.sap.furcas.metamodel.FURCAS.TCS.RefersToPArg;
import com.sap.furcas.metamodel.FURCAS.TCS.Sequence;
import com.sap.furcas.metamodel.FURCAS.TCS.SequenceElement;
import com.sap.furcas.metamodel.FURCAS.TCS.Symbol;
import com.sap.furcas.metamodel.FURCAS.TCS.Template;
import com.sap.furcas.metamodel.FURCAS.TCS.Token;
import com.sap.furcas.runtime.common.exceptions.ModelAdapterException;
import com.sap.furcas.runtime.tcs.TcsUtil;
import com.sap.furcas.test.fixture.ScenarioFixtureData;
public class TestBibTextSample extends AbstractTCSInjectionTest {
@BeforeClass
public static void doSetUp() throws Exception {
setup(ScenarioFixtureData.BIBTEXT_TCS, ScenarioFixtureData.BIBTEXT_METAMODEL, ScenarioFixtureData.BIBTEXT1_METAMODEL);
}
@Test
public void testSyntax() {
// now check the generated model is okay
assertNotNull(syntax);
assertEquals("Bibtext", syntax.getName());
assertEquals(0, modelParsingResult.getErrors().size());
}
@Test
public void testPrimitiveTemplate() {
List<Template> templates = syntax.getTemplates();
assertNotNull(templates);
assertEquals(7, templates.size());
// have to assume order of templates to keep testing code simple
Template identifier = templates.get(0);
assertNotNull(identifier.getNames());
assertNotNull(identifier.getMetaReference());
PrimitiveTemplate idtemp = (PrimitiveTemplate) identifier;
assertEquals("NAME", idtemp.getTokenName());
assertEquals("identifier", idtemp.getTemplateName());
assertEquals("unescapeString(%token%)", idtemp.getValue());
assertEquals(syntax, idtemp.getConcreteSyntax());
}
@Test
public void testTemplates() {
List<Template> templates = syntax.getTemplates();
assertNotNull(templates);
assertEquals(7, templates.size());
}
@Test
public void testBibTextFileTemplate() {
List<Template> templates = syntax.getTemplates();
// have to assume order of templates to keep testing code simple
Template file = templates.get(1);
assertEquals(list("BibText", "BibTextFile"), TcsUtil.getQualifiedName(file));
ClassTemplate filetemp = (ClassTemplate) file;
assertEquals(true, filetemp.isIsMain());
assertEquals(true, filetemp.isIsContext());
assertEquals(false, filetemp.isIsAbstract());
Sequence seq = filetemp.getTemplateSequence();
assertNull(seq.getFunctionContainer());
assertNull(seq.getElseContainer());
assertNull(seq.getSeparatorContainer());
assertEquals(1, seq.getElements().size());
SequenceElement blocks = seq.getElements().get(0);
assertEquals(1, blocks.getElementSequence().getElements().size());
Block block = (Block) blocks.getElementSequence().getElements().get(0);
SequenceElement entries = block.getBlockSequence().getElements().get(0);
Property property = (Property) entries;
assertEquals("entries", property.getPropertyReference().getStrucfeature().getName());
assertEquals(0, property.getPropertyArgs().size());
}
@Test
public void testBibTextEntryTemplate() {
List<Template> templates = syntax.getTemplates();
// have to assume order of templates to keep testing code simple
Template entry = templates.get(2);
assertEquals(list("BibText", "BibTextEntry"), TcsUtil.getQualifiedName(entry));
ClassTemplate entrytemp = (ClassTemplate) entry;
assertEquals(false, entrytemp.isIsMain());
assertEquals(false, entrytemp.isIsContext());
assertEquals(true, entrytemp.isIsAbstract());
assertNull(entrytemp.getTemplateSequence());
assertNull(entrytemp.getOperatorList());
// assertEquals(0, entrytemp.getModifiers().size());
}
@Test
public void testArticleTemplate() {
List<Template> templates = syntax.getTemplates();
// have to assume order of templates to keep testing code simple
Template art = templates.get(3);
assertEquals(list("BibText", "Article"), TcsUtil.getQualifiedName(art));
ClassTemplate arttemp = (ClassTemplate) art;
assertEquals(false, arttemp.isIsMain());
assertEquals(false, arttemp.isIsContext());
assertEquals(false, arttemp.isIsAbstract());
assertEquals(4, arttemp.getTemplateSequence().getElements().size());
assertNull(arttemp.getOperatorList());
// assertEquals(0, arttemp.getModifiers().size());
}
/**
* Tests contents which should be: /** "article" "{" [ key "," author{refersTo=name} "," attributes{separator = ","} ] "}"
*/
@Test
public void testArticleTemplateInterior() {
// used to check setting of references
List<Symbol> symbols = syntax.getSymbols();
Symbol lcurly = symbols.get(1);
Symbol coma = symbols.get(0);
List<Template> templates = syntax.getTemplates();
// have to assume order of templates to keep testing code simple
Template art = templates.get(3);
ClassTemplate arttemp = (ClassTemplate) art;
List<SequenceElement> templateSequence = arttemp.getTemplateSequence().getElements();
LiteralRef keyword = (LiteralRef) templateSequence.get(0);
assertNotNull(keyword.getReferredLiteral());
LiteralRef lcurlyRef = (LiteralRef) templateSequence.get(1);
assertEquals(lcurly, lcurlyRef.getReferredLiteral());
LiteralRef rcurlyRef = (LiteralRef) templateSequence.get(3);
assertNotNull(rcurlyRef.getReferredLiteral());
Block sequence = (Block) templateSequence.get(2);
List<SequenceElement> seqElements = sequence.getBlockSequence().getElements();
assertEquals(5, seqElements.size());
Property key = (Property) seqElements.get(0);
assertEquals("key", key.getPropertyReference().getStrucfeature().getName());
LiteralRef litRef = (LiteralRef) seqElements.get(1);
assertEquals(coma, litRef.getReferredLiteral());
Property author = (Property) seqElements.get(2);
assertEquals("author", author.getPropertyReference().getStrucfeature().getName());
List<PropertyArg> propargs = author.getPropertyArgs();
assertEquals(1, propargs.size());
PropertyArg refersTo = propargs.get(0);
RefersToPArg refersToP = (RefersToPArg) refersTo;
assertEquals("name", refersToP.getPropertyName());
}
// public void testPrimitiveTemplate() {
// ConcreteSyntax syntax = (ConcreteSyntax) syntaxSet.iterator().next();
//
// List<Template> templates = syntax.getTemplates();
// assertNotNull(templates);
// assertEquals(7, templates.size());
//
// // have to assume order of templates to keep testing code simple
// Template identifier = templates.get(0);
// assertEquals("identifier", identifier.getName());
// PrimitiveTemplate idtemp = (PrimitiveTemplate) identifier;
// assertEquals("NAME", idtemp.getTokenName());
// assertEquals("String", idtemp.getTypeName());
// assertEquals("%token%", idtemp.getValue());
// assertEquals(syntax, idtemp.getConcreteSyntax());
// }
// assertContainsOnce(templates, "identifier", "String", true, "NAME", "%token");
@Test
public void testSymbols() {
List<Symbol> symbols = syntax.getSymbols();
assertNotNull(symbols);
assertEquals(3, symbols.size());
// have to assume order of symbols to keep testing easy
Symbol coma = symbols.get(0);
assertEquals("coma", coma.getName());
assertEquals(",", coma.getValue());
Symbol lcurly = symbols.get(1);
assertEquals("lcurly", lcurly.getName());
assertEquals("{", lcurly.getValue());
Symbol rcurly = symbols.get(2);
assertEquals("rcurly", rcurly.getName());
assertEquals("}", rcurly.getValue());
}
/**
* Expects: <TCS:Keyword location="26:5-26:14" literalRefs="/0/@templates.3/@templateSequence/@elements.0" value="article"/>
* <TCS:Keyword location="36:5-36:13" literalRefs="/0/@templates.5/@templateSequence/@elements.0" value="author"/>
* <TCS:Keyword location="36:14-36:17"
* literalRefs="/0/@templates.5/@templateSequence/@elements.1 /0/@templates.6/@templateSequence/@elements.1" value="="/>
* <TCS:Keyword location="36:23-36:26" literalRefs="/0/@templates.5/@templateSequence/@elements.3" value="."/> <TCS:Keyword
* location="40:5-40:11" literalRefs="/0/@templates.6/@templateSequence/@elements.0" value="year"/>
*
* @throws ModelAdapterException
*/
@Test
public void testKeywords() throws ModelAdapterException {
assertEquals(5, syntax.getKeywords().size());
}
@Test
public void testTokens() {
List<Token> tokens = syntax.getTokens();
assertNotNull(tokens);
assertEquals(1, tokens.size());
}
}