package com.sap.furcas.parser.tcs.scenario; import static org.junit.Assert.assertEquals; import java.io.File; import java.util.List; import org.junit.BeforeClass; import org.junit.Test; import com.sap.furcas.parsergenerator.TCSSyntaxContainerBean; import com.sap.furcas.runtime.common.util.QualifiedNamesHelper; import com.sap.furcas.runtime.parser.ParserFacade; import com.sap.furcas.runtime.parser.testbase.GeneratedParserBasedTest; import com.sap.furcas.runtime.parser.testbase.GeneratedParserTestConfiguration; import com.sap.furcas.runtime.parser.testbase.stubs.StubModelAdapter; import com.sap.furcas.runtime.parser.testbase.stubs.StubParsingHelper; import com.sap.furcas.test.fixture.ScenarioFixtureData; import com.sap.furcas.test.testutils.StringListHelper; /** * Tests generation of TCS Parsers. This is using an old obsolete implementation of TCS whithout direct links betweeen syntax * definition and Metamodel */ public class TestTCSObsolete extends GeneratedParserBasedTest { private static final String LANGUAGE = "TCSObsolete"; private static final File TCS = ScenarioFixtureData.TCS_OBSOLETE_TCS; private static final File[] METAMODELS = { ScenarioFixtureData.TCS_OBSOLETE_METAMODEL }; private static final String DSLSAMPLEDIR = "../com.sap.furcas.test/scenarioFixtures/"; private static StubParsingHelper parsingHelper; @BeforeClass public static void setupParser() throws Exception { GeneratedParserTestConfiguration testConfig = new GeneratedParserTestConfiguration(LANGUAGE, TCS, METAMODELS); TCSSyntaxContainerBean syntaxBean = parseSyntax(testConfig); ParserFacade facade = generateParserForLanguage(syntaxBean, testConfig, new ClassLookupImpl()); parsingHelper = new StubParsingHelper(facade); } @Test public void testSample1() throws Exception { String sample = "syntax mySyntax {\n" + " primitiveTemplate identifier for ->String default using NAME:\n" + " value = \"%token%\";\n" + " template ->ExpressionList main\n" + " : ->elements{separator=\",\"}\n" + " ;\n" + " \n" + "}"; StubModelAdapter stubModelHandler = parsingHelper.parseString(sample, 0); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(2, stubModelHandler.getElementsOfType("TCS::Sequence").size()); } @Test public void testSample2() throws Exception { // test for missing value after disambiguate results in one error after parsing. String sample = "syntax mySyntax {\n" + " template ->errortemplate :" + " (disambiguate = )" + ";" + "}"; parsingHelper.parseString(sample, 1); } @Test public void testBibTextTCS() throws Exception { StubModelAdapter stubModelHandler = getModifiedAdapterStub(); parsingHelper.parseFile("Bibtext.tcs", DSLSAMPLEDIR, 0, stubModelHandler); assertEquals(6, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(7, stubModelHandler.getElementsOfType("TCS::Sequence").size()); } @Test public void testBibTextLowerTCS() throws Exception { StubModelAdapter stubModelHandler = getModifiedAdapterStub(); parsingHelper.parseFile("BibtextForcedLower.tcs", DSLSAMPLEDIR, 0, stubModelHandler); assertEquals(6, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(7, stubModelHandler.getElementsOfType("TCS::Sequence").size()); } @Test public void testBibTextFunctionsTCS() throws Exception { StubModelAdapter stubModelHandler = getModifiedAdapterStub(); parsingHelper.parseFile("BibtextWithFunction.tcs", DSLSAMPLEDIR, 0, stubModelHandler); assertEquals(6, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(2, stubModelHandler.getElementsOfType("TCS::FunctionTemplate").size()); } @Test public void testEnumTCS() throws Exception { StubModelAdapter stubModelHandler = getModifiedAdapterStub(); parsingHelper.parseFile("EnumTest.tcs", DSLSAMPLEDIR, 0, stubModelHandler); assertEquals(4, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(4, stubModelHandler.getElementsOfType("TCS::Sequence").size()); } @Test public void testExpression() throws Exception { StubModelAdapter stubModelHandler = getModifiedAdapterStub(); parsingHelper.parseFile("Expression.tcs", DSLSAMPLEDIR, 0, stubModelHandler); assertEquals(6, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(2, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(12, stubModelHandler.getElementsOfType("TCS::Sequence").size()); } @Test public void testFPath() throws Exception { StubModelAdapter stubModelHandler = getModifiedAdapterStub(); parsingHelper.parseFile("FPath.tcs", DSLSAMPLEDIR, 0, stubModelHandler); assertEquals(10, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(3, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(13, stubModelHandler.getElementsOfType("TCS::Sequence").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::EnumerationTemplate").size()); } @Test public void testTCS() throws Exception { StubModelAdapter stubModelHandler = getModifiedAdapterStub(); parsingHelper.parseFile("TCSObsolete.tcs", DSLSAMPLEDIR, 0, stubModelHandler); assertEquals(69, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(5, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(171, stubModelHandler.getElementsOfType("TCS::Sequence").size()); } @Test public void testXPath() throws Exception { StubModelAdapter stubModelHandler = getModifiedAdapterStub(); parsingHelper.parseFile("XPath.tcs", DSLSAMPLEDIR, 0, stubModelHandler); assertEquals(28, stubModelHandler.getElementsOfType("TCS::ClassTemplate").size()); assertEquals(4, stubModelHandler.getElementsOfType("TCS::PrimitiveTemplate").size()); assertEquals(1, stubModelHandler.getElementsOfType("TCS::ConcreteSyntax").size()); assertEquals(36, stubModelHandler.getElementsOfType("TCS::Sequence").size()); } private static StubModelAdapter getModifiedAdapterStub() { return new StubModelAdapter() { @Override public Object createElement(List<String> typeName) { if (StringListHelper.list("TCS", "Symbol").equals(typeName)) { // Literal extends symbol, but StubModelHandler is unable to deal with Subtypes. return model.create("TCS::Literal"); } else { return model.create(QualifiedNamesHelper.getQualifiedString(typeName)); } } }; } }