/** * */ package com.sap.furcas.runtime.parser.impl.context; import static com.sap.furcas.test.testutils.StringListHelper.list; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.List; 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.ModelElementProxy; /** * tests the ContextManager class. */ public class TestContextManager { @Test public void testAddRemove() throws Exception { ContextManager manager = new ContextManager(); IModelElementProxy proxy = new ModelElementProxy(list("test"), false); assertFalse(manager.hasInTextContext(proxy)); assertEquals(null, manager.getContextForElement(proxy)); manager.addRootContext(proxy, null); assertTrue(manager.hasInTextContext(proxy)); assertEquals(proxy, manager.getContextForElement(proxy)); } @Test public void testGetTaggedContextNullTag() throws Exception { ContextManager manager = new ContextManager(); assertEquals(null, manager.getTaggedContext(new Object(), null)); IModelElementProxy proxy = new ModelElementProxy(list("test"), false); manager.addRootContext(proxy, null); // no tag means proxy itself should be returned assertEquals(proxy, manager.getTaggedContext(proxy, null)); // context is only returned when passing in context objects Object someObject = new Object(); manager.addToContext(someObject, proxy); assertNull(manager.getTaggedContext(someObject, null)); } @Test public void testGetTaggedContextStringTag() throws Exception { ContextManager manager = new ContextManager(); assertEquals(null, manager.getTaggedContext(new Object(), "tag")); IModelElementProxy proxy = new ModelElementProxy(list("test"), false); manager.addRootContext(proxy, new String[]{"tag1", "tag2"}); // no tag means proxy itself should be returned assertEquals(proxy, manager.getTaggedContext(proxy, null)); assertEquals(proxy, manager.getTaggedContext(proxy, "tag1")); assertEquals(proxy, manager.getTaggedContext(proxy, "tag2")); assertEquals(null, manager.getTaggedContext(proxy, "tag3")); assertEquals(null, manager.getTaggedContext(null, "tag1")); Object someObject = new Object(); manager.addToContext(someObject, proxy); assertNull(manager.getTaggedContext(someObject, "tag1")); } @Test public void testGetTaggedContextStringTagDeep() throws Exception { // this is the real case for the usage of tags ContextManager manager = new ContextManager(); assertEquals(null, manager.getTaggedContext(new Object(), "tag")); IModelElementProxy proxy = new ModelElementProxy(list("test"), false); manager.addRootContext(proxy, new String[]{"tagRoot"}); IModelElementProxy proxy2 = new ModelElementProxy(list("test2"), false); manager.addContextChildFor(proxy, proxy2, new String[]{"foo", "bar"}); IModelElementProxy proxy3 = new ModelElementProxy(list("test3"), false); manager.addContextChildFor(proxy2, proxy3, new String[]{"leaf"}); // no tag means proxy itself should be returned assertEquals(proxy, manager.getTaggedContext(proxy3, "tagRoot")); assertEquals(proxy2, manager.getTaggedContext(proxy3, "foo")); assertEquals(proxy2, manager.getTaggedContext(proxy3, "bar")); assertEquals(proxy3, manager.getTaggedContext(proxy3, "leaf")); assertEquals(proxy3, manager.getTaggedContext(proxy3, null)); assertEquals(proxy, manager.getTaggedContext(proxy2, "tagRoot")); assertEquals(proxy2, manager.getTaggedContext(proxy2, "foo")); assertEquals(proxy2, manager.getTaggedContext(proxy2, "bar")); assertEquals(null, manager.getTaggedContext(proxy2, "leaf")); } @Test public void testProxyResolved() throws Exception { ContextManager manager = new ContextManager(); IModelElementProxy proxy = new ModelElementProxy(list("test"), false); assertFalse(manager.hasInTextContext(proxy)); assertEquals(null, manager.getContextForElement(proxy)); manager.addRootContext(proxy, null); assertTrue(manager.hasInTextContext(proxy)); assertEquals(proxy, manager.getContextForElement(proxy)); Object element = new Object(); assertFalse(manager.hasInTextContext(element)); assertEquals(null, manager.getContextForElement(element)); manager.notifyProxyResolvedWith(proxy, element, null); //now manager should recognize element and not recognize proxy anymore assertFalse(manager.hasInTextContext(proxy)); assertEquals(null, manager.getContextForElement(proxy)); assertTrue(manager.hasInTextContext(element)); assertEquals(element, manager.getContextForElement(element)); } @Test public void testGetParent() throws Exception { ContextManager manager = new ContextManager(); IModelElementProxy proxy = new ModelElementProxy(list("test"), false); manager.addRootContext(proxy, null); IModelElementProxy proxy2 = new ModelElementProxy(list("test2"), false); manager.addContextChildFor(proxy, proxy2, null); IModelElementProxy proxy3 = new ModelElementProxy(list("test3"), false); manager.addContextChildFor(proxy2, proxy3, null); assertTrue(manager.hasInTextContext(proxy)); assertEquals(proxy, manager.getContextForElement(proxy)); assertTrue(manager.hasInTextContext(proxy2)); assertEquals(proxy2, manager.getContextForElement(proxy2)); assertTrue(manager.hasInTextContext(proxy3)); assertEquals(proxy3, manager.getContextForElement(proxy3)); assertEquals(proxy2, manager.getContextParent(proxy3)); assertEquals(proxy, manager.getContextParent(proxy2)); assertEquals(null, manager.getContextParent(proxy)); } @Test public void testAddElementToContext() throws Exception { ContextManager manager = new ContextManager(); IModelElementProxy proxy = new ModelElementProxy(list("test"), false); manager.addRootContext(proxy, null); Object element = new Object(); manager.addToContext(proxy, element); assertTrue(manager.hasInTextContext(proxy)); assertEquals(proxy, manager.getContextForElement(proxy)); assertEquals(null, manager.getContextForElement(element)); // fake setup so that lookup finds element to be a candidate SimpleAdapterStub modelAdapter = new SimpleAdapterStub(); modelAdapter.feature = "test"; Object result = manager.findCandidatesInContext(modelAdapter, proxy, null, null, "test"); assertEquals(element, result); } class SimpleAdapterStub implements IModelElementInvestigator { public boolean isInstanceOf = true; public Object metatype = new Object(); public Object feature; /* (non-Javadoc) * @see com.sap.mi.textual.grammar.IModelElementInvestigator#get(java.lang.Object, java.lang.String) */ @Override public Object get(Object modelElement, String propertyName) throws ModelAdapterException { return feature; } /* (non-Javadoc) * @see com.sap.mi.textual.grammar.IModelElementInvestigator#getMetaType(java.util.List) */ @Override public Object getMetaType(List<String> typeName) throws ModelAdapterException { return metatype; } /* (non-Javadoc) * @see com.sap.mi.textual.grammar.IModelElementInvestigator#instanceOf(java.lang.Object, java.lang.Object) */ @Override public boolean instanceOf(Object instance, Object metaType) throws ModelAdapterException { return isInstanceOf; } } }