/**
*
*/
package com.sap.furcas.parsergenerator.tcs.t2m.grammar;
import static com.sap.furcas.test.testutils.ResolutionBeanHelper.refE;
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 static org.junit.Assert.assertTrue;
import java.util.Set;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.junit.Test;
import com.sap.furcas.metamodel.FURCAS.TCS.Keyword;
import com.sap.furcas.metamodel.FURCAS.TCS.OperatorList;
import com.sap.furcas.metamodel.FURCAS.TCS.Symbol;
import com.sap.furcas.metamodel.FURCAS.TCS.Template;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.ClassTemplateStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.ConcreteSyntaxStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.LiteralStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.OperatorListStub;
import com.sap.furcas.metamodel.FURCAS.TCS.stubs.PrimitiveTemplateStub;
import com.sap.furcas.parsergenerator.tcs.t2m.grammar.handlerStub.MetaModelElementResolutionHelperStub;
import com.sap.furcas.runtime.common.exceptions.MetaModelLookupException;
import com.sap.furcas.runtime.common.exceptions.SyntaxElementException;
import com.sap.furcas.runtime.parser.exceptions.SyntaxParsingException;
import com.sap.furcas.runtime.tcs.MetamodelNameResolvingException;
import com.sap.furcas.runtime.tcs.SyntaxLookup;
/**
*
*/
public class TestSyntaxLookup {
/**
* Test method for {@link com.sap.furcas.textual.tcs.tcs.util.tcs.util.SyntaxLookup#getDefaultPrimitiveTemplateRule(java.util.List)}.
* @throws SyntaxParsingException
*/
@Test
public void testGetDefaultPrimitiveTemplateRule() throws SyntaxElementException {
MetaModelElementResolutionHelperStub namingHelper = new MetaModelElementResolutionHelperStub();
ConcreteSyntaxStub syntax = new ConcreteSyntaxStub();
SyntaxLookup lookup = new SyntaxLookup(syntax, namingHelper);
// no primitive templates defined in SyntaxStub, so null should be returned
assertNull(lookup.getDefaultPrimitiveTemplateRule(refE("test")));
syntax.templates = new BasicEList<Template>();
PrimitiveTemplateStub pStub = new PrimitiveTemplateStub();
pStub.names = list("error");
syntax.templates.add(pStub);
lookup = new SyntaxLookup(syntax, namingHelper);
// template names don't match, so still return null
assertNull(lookup.getDefaultPrimitiveTemplateRule(refE("test")));
ClassTemplateStub cStub = new ClassTemplateStub();
cStub.names = list("test");
syntax.templates.add(pStub);
lookup = new SyntaxLookup(syntax, namingHelper);
// template names match, but is not primitive, so still return null
assertNull(lookup.getDefaultPrimitiveTemplateRule(refE("test")));
pStub = new PrimitiveTemplateStub();
pStub.names = list("test");
syntax.templates.add(pStub);
lookup = new SyntaxLookup(syntax, namingHelper);
assertEquals(pStub, lookup.getDefaultPrimitiveTemplateRule(refE("test")));
// qualified names now
assertNull(lookup.getDefaultPrimitiveTemplateRule(refE("package", "test")));
pStub = new PrimitiveTemplateStub();
pStub.names = list("package", "test");
syntax.templates.add(pStub);
lookup = new SyntaxLookup(syntax, namingHelper);
assertEquals(pStub, lookup.getDefaultPrimitiveTemplateRule(refE("package", "test")));
}
/**
* Test method for {@link com.sap.furcas.textual.tcs.tcs.util.tcs.util.SyntaxLookup#getSymbolRule(java.lang.String)}.
*/
@Test
public void testGetSymbolRule() {
MetaModelElementResolutionHelperStub namingHelper = new MetaModelElementResolutionHelperStub();
ConcreteSyntaxStub syntax = new ConcreteSyntaxStub();
SyntaxLookup lookup = new SyntaxLookup(syntax, namingHelper);
// no symbols defined in SyntaxStub, so symbol is returned in hyphons
assertEquals("'test'", lookup.getSymbolRule("test"));
syntax.symbols = new BasicEList<Symbol>();
// no change, as no symbols present
assertEquals("'test'", lookup.getSymbolRule("test"));
LiteralStub symbol = new LiteralStub();
syntax.symbols.add(symbol );
// no change, as no symbols has no name
assertEquals("'test'", lookup.getSymbolRule("test"));
symbol.value = "error";
// no change, as no symbols has wrong name
assertEquals("'test'", lookup.getSymbolRule("test"));
symbol.value = "test";
symbol.name = "name";
// no change, as no symbols has wrong name
assertEquals(" NAME ", lookup.getSymbolRule("test"));
symbol.value = "othertest";
symbol.name = "othername";
// no change, as no symbols has wrong name
assertEquals(" OTHERNAME ", lookup.getSymbolRule("othertest"));
}
/**
* Test method for {@link com.sap.furcas.textual.tcs.tcs.util.tcs.util.SyntaxLookup#getTCSTemplate(java.util.List)}.
* @throws SyntaxElementException
* @throws MetamodelNameResolvingException
* @throws MetaModelLookupException
*/
@Test
public void testGetTCSTemplate() throws MetamodelNameResolvingException, SyntaxElementException, MetaModelLookupException {
MetaModelElementResolutionHelperStub namingHelper = new MetaModelElementResolutionHelperStub();
ConcreteSyntaxStub syntax = new ConcreteSyntaxStub();
SyntaxLookup lookup = new SyntaxLookup(syntax, namingHelper);
assertEquals(0, lookup.getTCSTemplate(refE("test"), null).size());
PrimitiveTemplateStub pStub = new PrimitiveTemplateStub();
pStub.names = list("match");
syntax.templates = new BasicEList<Template>();
syntax.templates.add(pStub);
// template names don't match, so still return null
assertEquals(pStub, lookup.getTCSTemplate(refE("match"), null).iterator().next());
}
/**
* tests that a qualified or unqualified reference to a template with an unqualified reference works
* @throws MetamodelNameResolvingException
* @throws SyntaxElementException
* @throws MetaModelLookupException
*/
@Test
public void testGetTCSTemplateResolve() throws MetamodelNameResolvingException, SyntaxElementException, MetaModelLookupException {
MetaModelElementResolutionHelperStub namingHelper = new MetaModelElementResolutionHelperStub();
ConcreteSyntaxStub syntax = new ConcreteSyntaxStub();
SyntaxLookup lookup = new SyntaxLookup(syntax, namingHelper);
assertEquals(0, lookup.getTCSTemplate(refE("test"), null).size());
PrimitiveTemplateStub pStub = new PrimitiveTemplateStub();
pStub.names = list("package", "test");
syntax.templates = new BasicEList<Template>();
syntax.templates.add(pStub);
assertEquals(pStub, lookup.getTCSTemplate(refE("package", "test"), null).iterator().next());
}
/**
* Test method for {@link com.sap.furcas.textual.tcs.tcs.util.tcs.util.SyntaxLookup#getAnonymousOperatorList()}.
*/
@Test
public void testGetAnonymousOperatorList() {
MetaModelElementResolutionHelperStub namingHelper = new MetaModelElementResolutionHelperStub();
ConcreteSyntaxStub syntax = new ConcreteSyntaxStub();
SyntaxLookup lookup = new SyntaxLookup(syntax, namingHelper);
assertNull(lookup.getAnonymousOperatorList());
syntax.operatorListList = new BasicEList<OperatorList>();
assertNull(lookup.getAnonymousOperatorList());
OperatorListStub opList = new OperatorListStub();
opList.name = "error";
syntax.operatorListList.add(opList );
// return null, as this one has a name, and we want the anonymous one.
assertNull(lookup.getAnonymousOperatorList());
opList = new OperatorListStub();
opList.name = "";
syntax.operatorListList.add(opList );
assertEquals(opList, lookup.getAnonymousOperatorList());
}
@Test
public void testGetAllKeywords() {
MetaModelElementResolutionHelperStub namingHelper = new MetaModelElementResolutionHelperStub();
EList<Keyword> keywordList = new BasicEList<Keyword>();
Keyword keyStub1 = new KeywordStub();
keyStub1.setValue("ONE");
keywordList.add(keyStub1 );
ConcreteSyntaxStub syntax = new ConcreteSyntaxStub();
Keyword keyStub2 = new KeywordStub();
keywordList.add(keyStub2 );
keyStub2.setValue("TWO");
syntax.keywords = keywordList;
SyntaxLookup lookup = new SyntaxLookup(syntax, namingHelper);
Set<Keyword> result = lookup.getAllKeywords();
assertNotNull(result);
assertEquals(2, result.size());
assertTrue(result.contains(keyStub1));
assertTrue(result.contains(keyStub2));
}
private class KeywordStub extends LiteralStub implements Keyword {
}
}