/** * */ package com.sap.furcas.parsergenerator.tcs.t2m.grammar; import static com.sap.furcas.parsergenerator.testutils.RuleComparisonHelper.tokens; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.HashSet; import java.util.Iterator; import java.util.List; import org.junit.Test; import com.sap.furcas.metamodel.FURCAS.TCS.Keyword; import com.sap.furcas.metamodel.FURCAS.TCS.stubs.LiteralStub; import com.sap.furcas.metamodel.FURCAS.TCS.stubs.PrimitiveTemplateStub; import com.sap.furcas.parsergenerator.tcs.t2m.grammar.handlerStub.ANTLR3WriterStub; import com.sap.furcas.parsergenerator.tcs.t2m.grammar.handlerStub.MetaModelElementResolutionHelperStub; import com.sap.furcas.parsergenerator.tcs.t2m.grammar.handlerStub.SyntaxLookupStub; import com.sap.furcas.parsergenerator.tcs.t2m.grammar.handlerStub.TemplateNamingHelperStub; import com.sap.furcas.parsergenerator.tcs.t2m.grammar.rules.AbstractAntlr3Rule; import com.sap.furcas.runtime.common.exceptions.MetaModelLookupException; import com.sap.furcas.runtime.parser.exceptions.SyntaxParsingException; import com.sap.furcas.runtime.tcs.TemplateNamingHelper; import com.sap.furcas.test.testutils.StringListHelper; /** * Probably one of the most important tests for DSL Engineering. */ public class TestPrimitiveTemplateHandler { @Test public void testAddElement() throws Exception { ANTLR3WriterStub writerStub = new ANTLR3WriterStub(); TemplateNamingHelper namingStub = new TemplateNamingHelperStub(); MetaModelElementResolutionHelperStub metaLookupStub = new MetaModelElementResolutionHelperStub(); // Class under test PrimitiveTemplateHandler primHandler = new PrimitiveTemplateHandler(writerStub, namingStub, null, null, metaLookupStub); PrimitiveTemplateStub template = new PrimitiveTemplateStub(); template.names = StringListHelper.list("functionName"); // in real code, templateName would be used, but NamingHelperStub is dull. // template.templateName = "templateName"; primHandler.addTemplate(template); assertTrue(writerStub.rules.size() == 1); AbstractAntlr3Rule result = writerStub.rules.get(0); String expected = "functionName returns[Object ret2] @init{java.lang.Object ret=null;} : (ast=null {ret = ast.getText(); }) { ret2=ret; } ;"; List tokens = tokens( expected); List tokens2 = tokens( result.toString()); assertEquals(expected + "\n!=\n" + result +'\n', tokens, tokens2); } /** * tests using a value, handler should do a replace of %token% * @throws MetaModelLookupException * @throws SyntaxParsingException */ @Test public void testAddElementValue() throws Exception { ANTLR3WriterStub writerStub = new ANTLR3WriterStub(); TemplateNamingHelper namingStub = new TemplateNamingHelperStub(); MetaModelElementResolutionHelperStub metaLookupStub = new MetaModelElementResolutionHelperStub(); // Class under test PrimitiveTemplateHandler primHandler = new PrimitiveTemplateHandler(writerStub, namingStub, null, null, metaLookupStub); PrimitiveTemplateStub template = new PrimitiveTemplateStub(); template.names = StringListHelper.list("functionName"); // template.value = "test1%token%2test"; primHandler.addTemplate(template); assertTrue(writerStub.rules.size() == 1); AbstractAntlr3Rule result = writerStub.rules.get(0); String expected = "functionName returns[Object ret2] @init{java.lang.Object ret=null;} : (ast=null {ret = test1 ast.getText()2test; }) { ret2=ret; } ;"; List tokens = tokens( expected); List tokens2 = tokens( result.toString()); assertEquals(expected + "\n!=\n" + result +'\n', tokens, tokens2); } @Test public void testAddElementOrKeywordZero() throws Exception { ANTLR3WriterStub writerStub = new ANTLR3WriterStub(); TemplateNamingHelper namingStub = new TemplateNamingHelperStub(); SyntaxLookupStub syntaxStub = new SyntaxLookupStub(); MetaModelElementResolutionHelperStub metaLookupStub = new MetaModelElementResolutionHelperStub(); // Class under test PrimitiveTemplateHandler primHandler = new PrimitiveTemplateHandler(writerStub, namingStub, syntaxStub, null, metaLookupStub ); PrimitiveTemplateStub template = new PrimitiveTemplateStub(); template.names = StringListHelper.list("functionName"); template.isOrkeyword = true; syntaxStub.keywords = new HashSet<Keyword>(); primHandler.addTemplate(template); assertTrue(writerStub.rules.size() == 1); AbstractAntlr3Rule result = writerStub.rules.get(0); String expected = "functionName returns[Object ret2] @init{java.lang.Object ret=null;} : (ast=null {ret = ast.getText(); }) { ret2=ret; } ;"; List tokens = tokens( expected); List tokens2 = tokens( result.toString()); assertEquals(expected + "\n!=\n" + result +'\n', tokens, tokens2); } @Test public void testAddElementOrKeywordOne() throws Exception { ANTLR3WriterStub writerStub = new ANTLR3WriterStub(); TemplateNamingHelper namingStub = new TemplateNamingHelperStub(); SyntaxLookupStub syntaxStub = new SyntaxLookupStub(); MetaModelElementResolutionHelperStub metaLookupStub = new MetaModelElementResolutionHelperStub(); // Class under test PrimitiveTemplateHandler primHandler = new PrimitiveTemplateHandler(writerStub, namingStub, syntaxStub, null, metaLookupStub ); PrimitiveTemplateStub template = new PrimitiveTemplateStub(); template.names = StringListHelper.list("functionName"); template.isOrkeyword = true; syntaxStub.keywords = new HashSet<Keyword>(); KeywordStub keyStub = new KeywordStub(); keyStub.name = "keyName"; keyStub.value = "keyValue"; syntaxStub.keywords.add(keyStub); primHandler.addTemplate(template); assertTrue(writerStub.rules.size() == 1); AbstractAntlr3Rule result = writerStub.rules.get(0); String expected = "functionName returns[Object ret2] @init{java.lang.Object ret=null;} " + " : (ast=null {ret = ast.getText(); } " + " | \'keyName\' {ret = \"keyValue\";}) " + "{ " + "ret2=ret; " + "}" + " ;"; List tokens = tokens( expected); List tokens2 = tokens( result.toString()); assertEquals(expected + "\n!=\n" + result +'\n', tokens, tokens2); } /** * should use value both times * @throws MetaModelLookupException * @throws SyntaxParsingException */ @Test public void testAddElementOrKeywordOneNullName() throws Exception { ANTLR3WriterStub writerStub = new ANTLR3WriterStub(); TemplateNamingHelper namingStub = new TemplateNamingHelperStub(); SyntaxLookupStub syntaxStub = new SyntaxLookupStub(); MetaModelElementResolutionHelperStub metaLookupStub = new MetaModelElementResolutionHelperStub(); // Class under test PrimitiveTemplateHandler primHandler = new PrimitiveTemplateHandler(writerStub, namingStub, syntaxStub, null, metaLookupStub ); PrimitiveTemplateStub template = new PrimitiveTemplateStub(); template.names = StringListHelper.list("functionName"); template.isOrkeyword = true; syntaxStub.keywords = new HashSet<Keyword>(); KeywordStub keyStub = new KeywordStub(); keyStub.name = null; keyStub.value = "keyValue"; syntaxStub.keywords.add(keyStub); primHandler.addTemplate(template); assertTrue(writerStub.rules.size() == 1); AbstractAntlr3Rule result = writerStub.rules.get(0); String expected = "functionName returns[Object ret2] @init{java.lang.Object ret=null;} " + " : (ast=null {ret = ast.getText(); } " + " | \'keyValue\' {ret = \"keyValue\";}) " + " { " + "ret2=ret; " + "}" + " ;"; List tokens = tokens( expected); List tokens2 = tokens( result.toString()); assertEquals(expected + "\n!=\n" + result +'\n', tokens, tokens2); } @Test public void testAddElementOrKeywordTwo() throws Exception { ANTLR3WriterStub writerStub = new ANTLR3WriterStub(); TemplateNamingHelper namingStub = new TemplateNamingHelperStub(); SyntaxLookupStub syntaxStub = new SyntaxLookupStub(); MetaModelElementResolutionHelperStub metaLookupStub = new MetaModelElementResolutionHelperStub(); // Class under test PrimitiveTemplateHandler primHandler = new PrimitiveTemplateHandler(writerStub, namingStub, syntaxStub, null, metaLookupStub); PrimitiveTemplateStub template = new PrimitiveTemplateStub(); template.names = StringListHelper.list("functionName"); template.isOrkeyword = true; final KeywordStub keyStub = new KeywordStub(); keyStub.name = "keyName"; keyStub.value = "keyValue"; final KeywordStub keyStub2 = new KeywordStub(); keyStub2.name = "keyName2"; keyStub2.value = "keyValue2"; syntaxStub.keywords = new HashSet<Keyword>() { @Override public Iterator<Keyword> iterator() { return new Iterator<Keyword>() { int counter = 3; @Override public boolean hasNext() { return counter > 1; } @Override public Keyword next() { counter--; if (counter == 2) { return keyStub; } if (counter == 1) { return keyStub2; } return null; } @Override public void remove() {}}; } }; primHandler.addTemplate(template); assertTrue(writerStub.rules.size() == 1); AbstractAntlr3Rule result = writerStub.rules.get(0); String expected = "functionName returns[Object ret2] @init{java.lang.Object ret=null;} " + " : (ast=null {ret = ast.getText(); } " + " | \'keyName\' {ret = \"keyValue\";} " + "| \'keyName2\' {ret = \"keyValue2\";}) " + "{ " + "ret2=ret; " + "}" + " ;"; List tokens = tokens( expected); List tokens2 = tokens( result.toString()); assertEquals(expected + "\n!=\n" + result +'\n', tokens, tokens2); } private class KeywordStub extends LiteralStub implements Keyword { } }