package com.sap.furcas.parsergenerator.tcs.grammar;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.util.Set;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.junit.BeforeClass;
import org.junit.Test;
import com.sap.furcas.modeladaptation.emf.lookup.QueryBasedEcoreMetaModelLookUp;
import com.sap.furcas.parsergenerator.GrammarGenerationSourceConfiguration;
import com.sap.furcas.parsergenerator.TCSSyntaxContainerBean;
import com.sap.furcas.parsergenerator.tcs.generator.SyntaxParser;
import com.sap.furcas.parsergenerator.tcs.t2m.ModelBasedTCSGrammarGenerator;
import com.sap.furcas.parsergenerator.tcs.t2m.grammar.ObservationDirectivesHelper;
import com.sap.furcas.runtime.parser.testbase.FailOnErrorErrorHandler;
import com.sap.furcas.runtime.common.util.FileResourceHelper;
import com.sap.furcas.test.fixture.ScenarioFixtureData;
import com.sap.furcas.test.testutils.ResourceTestHelper;
/**
* Simple test case that assures we can generate an ANTLR grammar from a given syntax definition.
*/
public class GrammarGenerationTest {
@BeforeClass
public static void setup() {
ObservationDirectivesHelper.doAddObserverParts = ObservationDirectivesHelper.NONE;
}
@Test
public void testBibTextGrammarGeneration() throws Exception {
// this test relies on the contents of the BibText sample file
File tcs = ScenarioFixtureData.BIBTEXT_TCS;
File[] metamodel = { ScenarioFixtureData.BIBTEXT_METAMODEL, ScenarioFixtureData.BIBTEXT1_METAMODEL };
ResourceSet resourceSet = FileResourceHelper.loadResourceSet(metamodel);
Set<URI> referenceScope = ResourceTestHelper.createEcoreReferenceScope();
OutputStream out = new ByteArrayOutputStream();
GrammarGenerationSourceConfiguration sourceConfiguration = new GrammarGenerationSourceConfiguration(resourceSet, referenceScope);
TCSSyntaxContainerBean syntaxBean = SyntaxParser.parse(sourceConfiguration, tcs, new FailOnErrorErrorHandler());
ModelBasedTCSGrammarGenerator modelBasedGenerator = new ModelBasedTCSGrammarGenerator(out,
new QueryBasedEcoreMetaModelLookUp(resourceSet, FileResourceHelper.getResourceSetAsScope(resourceSet)),
"generated", syntaxBean);
modelBasedGenerator.generateGrammar(resourceSet, referenceScope, null);
out.flush();
String grammar = out.toString();
assertTrue(grammar.indexOf("grammar Bibtext") > -1);
assertTrue(grammar.indexOf("package generated;") > -1);
assertTrue(grammar.indexOf("import com.sap.furcas.runtime.parser.ANTLR3LocationToken") > -1);
assertTrue(grammar.indexOf("main returns[Object ret2]") > -1);
assertTrue(grammar.indexOf("public com.sap.furcas.runtime.parser.IModelInjector ei = null;") > -1);
assertTrue(grammar.indexOf("identifier returns[Object ret2] @init{java.lang.Object ret=null;}") > -1);
out.close();
}
@Test
public void testExpressionGrammarGeneration() throws Exception {
// this test relies on the contents of the Expression sample file
File tcs = ScenarioFixtureData.EXPRESSION_TCS;
File[] metamodel = { ScenarioFixtureData.EXPRESSION_METAMODEL };
ResourceSet resourceSet = FileResourceHelper.loadResourceSet(metamodel);
Set<URI> referenceScope = ResourceTestHelper.createEcoreReferenceScope();
OutputStream out = new ByteArrayOutputStream();
GrammarGenerationSourceConfiguration sourceConfiguration = new GrammarGenerationSourceConfiguration(resourceSet, referenceScope);
TCSSyntaxContainerBean syntaxBean = SyntaxParser.parse(sourceConfiguration, tcs, new FailOnErrorErrorHandler());
ModelBasedTCSGrammarGenerator modelBasedGenerator = new ModelBasedTCSGrammarGenerator(out,
new QueryBasedEcoreMetaModelLookUp(resourceSet, FileResourceHelper.getResourceSetAsScope(resourceSet)),
"generated", syntaxBean);
modelBasedGenerator.generateGrammar(resourceSet, referenceScope, null);
out.flush();
String grammar = out.toString();
assertTrue(grammar.indexOf("grammar Expression;") > -1);
assertTrue(grammar.indexOf("package generated;") > -1);
assertTrue(grammar.indexOf("import com.sap.furcas.runtime.parser.ANTLR3LocationToken") > -1);
assertTrue(grammar.indexOf("main returns[Object ret2]") > -1);
assertTrue(grammar.indexOf("public com.sap.furcas.runtime.parser.IModelInjector ei = null;") > -1);
assertTrue(grammar
.indexOf("priority_0 returns[Object ret2] @init{java.lang.String opName=null; org.antlr.runtime.Token firstToken=input.LT(1); Object semRef=null;}") > -1);
assertTrue(grammar
.indexOf("priority_0 returns[Object ret2] @init{java.lang.String opName=null; org.antlr.runtime.Token firstToken=input.LT(1); Object semRef=null;}") > -1);
assertTrue(grammar.indexOf("primary_expression_expression returns[Object ret2]") > -1);
assertTrue(grammar.indexOf("(LPAREN ret=expression_expression RPAREN))") > -1);
out.close();
}
}