/** * */ package com.sap.furcas.runtime.parser.impl; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.fail; import java.util.ArrayList; import java.util.List; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.RecognizerSharedState; import org.antlr.runtime.TokenStream; import org.junit.Test; import com.sap.furcas.runtime.common.exceptions.ModelAdapterException; import com.sap.furcas.runtime.common.interfaces.IModelElementInvestigator; import com.sap.furcas.runtime.common.interfaces.IModelElementProxy; import com.sap.furcas.runtime.parser.impl.context.AmbiguousLookupException; import com.sap.furcas.runtime.parser.impl.context.ContextManager; import com.sap.furcas.test.testutils.StringListHelper; import com.sap.furcas.test.testutils.StubTokenStream; /** * */ public class TestObservableInjectingParser { @Test public void testCreateModelElementProxyNoContext() throws Exception { GeneratedParser testParser = new GeneratedParser(new StubTokenStream(), null); testParser.createModelElementProxy(StringListHelper.list("test", "class"), false, false); } @Test public void testCreateModelElementProxyAddToContextException() throws Exception { GeneratedParser testParser = new GeneratedParser(new StubTokenStream(), null); boolean caught = false; try { testParser.createModelElementProxy(StringListHelper.list("test", "class"), false, true); } catch (RuntimeException e) { caught = true; } assertTrue("No exception despite entering context without root context", caught); } @Test public void testCreateModelElementProxyAddToContext() throws Exception { GeneratedParser testParser = new GeneratedParser(new StubTokenStream(), null); IModelElementProxy rootProxy = testParser.createModelElementProxy(StringListHelper.list("test", "class"), true, false); IModelElementProxy addedProxy = testParser.createModelElementProxy(StringListHelper.list("test", "class2"), false, true); assertNotNull(rootProxy); assertEquals(1, testParser.contextMock.rootElements.size()); assertEquals(rootProxy, testParser.contextMock.rootElements.get(0)); assertEquals(0, testParser.contextMock.subcontextLinks.size()); assertEquals(1, testParser.contextMock.inContextLinks.size()); assertEquals(rootProxy, testParser.contextMock.inContextLinks.get(0).contextElement); assertEquals(addedProxy, testParser.contextMock.inContextLinks.get(0).newElement); } @Test public void testCreateModelElementProxyIsRootContext() throws Exception { GeneratedParser testParser = new GeneratedParser(new StubTokenStream(), null); IModelElementProxy proxy = testParser.createModelElementProxy(StringListHelper.list("test", "class"), true, false); assertNotNull(proxy); assertEquals(1, testParser.contextMock.rootElements.size()); assertEquals(proxy, testParser.contextMock.rootElements.get(0)); } @Test public void testCreateModelElementProxyIsSubContext() throws Exception { GeneratedParser testParser = new GeneratedParser(new StubTokenStream(), null); IModelElementProxy proxy = testParser.createModelElementProxy(StringListHelper.list("test", "class"), true, false); IModelElementProxy subproxy = testParser.createModelElementProxy(StringListHelper.list("test", "class"), true, false); assertNotNull(subproxy); assertEquals(1, testParser.contextMock.rootElements.size()); assertEquals(proxy, testParser.contextMock.rootElements.get(0)); assertEquals(0, testParser.contextMock.inContextLinks.size()); assertEquals(1, testParser.contextMock.subcontextLinks.size()); assertEquals(proxy, testParser.contextMock.subcontextLinks.get(0).supercontextElement); assertEquals(subproxy, testParser.contextMock.subcontextLinks.get(0).subContextElement); } private class GeneratedParser extends ObservableInjectingParser { public ContextManagerMock contextMock; /** * @param input * @param newState */ public GeneratedParser(TokenStream input, RecognizerSharedState newState) { super(input, newState); } /* (non-Javadoc) * @see com.sap.mi.textual.grammar.impl.ObservableInjectingParser#main() */ @Override public Object main() throws RecognitionException { return null; } @Override protected ContextManager initContextManager() { contextMock = new ContextManagerMock(); return contextMock; } @Override public final IModelElementProxy createModelElementProxy( List<String> name, boolean context, boolean addToContext) { return super.createModelElementProxy(name, context, addToContext); } } class ContextManagerMock extends ContextManager { public List<IModelElementProxy> rootElements = new ArrayList<IModelElementProxy>(); public ArrayList<SimpleContextLink> inContextLinks = new ArrayList<SimpleContextLink>(); public ArrayList<SubContextLink> subcontextLinks = new ArrayList<SubContextLink>(); @Override public void addContextChildFor(IModelElementProxy parentContextElement, IModelElementProxy newChildElement, String[] tags) { SubContextLink contextLink = new SubContextLink(parentContextElement, newChildElement); subcontextLinks.add(contextLink); } @Override public void addRootContext(IModelElementProxy newChildElement, String[] tags) { rootElements.add(newChildElement); // super.addRootContext(newChildElement); } @Override public void addToContext(Object contextElement, Object newElement) { SimpleContextLink context = new SimpleContextLink(contextElement, newElement); inContextLinks.add(context); } @Override public void discardProxy(Object proxy, IModelElementProxy creationContextElement) { fail("not implemented yet."); super.discardProxy(proxy, creationContextElement); } @Override public Object findCandidatesInContext(IModelElementInvestigator modelAdapter, Object contextElement, List<String> valueTypeName, String keyName, Object keyValue) throws ModelAdapterException, AmbiguousLookupException { fail("not implemented yet."); return super.findCandidatesInContext(modelAdapter, contextElement, valueTypeName, keyName, keyValue); } @Override public Object getContextForElement(Object navigatedObject) { fail("not implemented yet."); return super.getContextForElement(navigatedObject); } @Override public Object getContextParent(Object contextElement) { fail("not implemented yet."); return super.getContextParent(contextElement); } @Override public Object getTaggedContext(Object contextElement, String tag) { fail("not implemented yet."); return super.getTaggedContext(contextElement, tag); } @Override public boolean hasInTextContext(Object navigatedContext) { fail("not implemented yet."); return super.hasInTextContext(navigatedContext); } @Override public void notifyProxyResolvedWith(IModelElementProxy proxy, Object realElement, IModelElementProxy creationContextElement) { fail("not implemented yet."); super.notifyProxyResolvedWith(proxy, realElement, creationContextElement); } @Override public void setContextImport(Object modelElement, Object realValue) { fail("not implemented yet."); super.setContextImport(modelElement, realValue); } } class SimpleContextLink { public Object contextElement; public Object newElement; /** * @param contextElement * @param newElement */ public SimpleContextLink(Object contextElement, Object newElement) { this.contextElement = contextElement; this.newElement = newElement; } } class SubContextLink { public Object supercontextElement; public Object subContextElement; /** * @param contextElement * @param newElement */ public SubContextLink(Object contextElement, Object newElement) { this.supercontextElement = contextElement; this.subContextElement = newElement; } } }