package com.arondor.common.reflection.gwt.client.presenter; 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 static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import com.arondor.common.reflection.bean.config.ObjectConfigurationFactoryBean; import com.arondor.common.reflection.catalog.SimpleAccessibleClassCatalog; import com.arondor.common.reflection.gwt.client.presenter.ClassTreeNodePresenter.ClassDisplay; import com.arondor.common.reflection.gwt.client.presenter.fields.PrimitiveTreeNodePresenter; import com.arondor.common.reflection.gwt.client.testclasses.ParentTestClass; import com.arondor.common.reflection.gwt.client.testclasses.TestClass; import com.arondor.common.reflection.gwt.client.testclasses.TestInterface; import com.arondor.common.reflection.model.config.ElementConfiguration; import com.arondor.common.reflection.model.config.ObjectConfiguration; import com.arondor.common.reflection.model.config.ObjectConfigurationFactory; import com.arondor.common.reflection.parser.java.JavaAccessibleClassParser; import com.arondor.common.reflection.parser.java.JavaClassPathAccessibleClassProvider; import com.arondor.common.reflection.service.DefaultReflectionService; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; public class TestClassTreeNodePresenter { private MockGWTReflectionServiceAsync rpcService; private ObjectConfigurationFactory factory = new ObjectConfigurationFactoryBean(); @Before public void init() { DefaultReflectionService reflectionService = new DefaultReflectionService(); reflectionService.setAccessibleClassCatalog(new SimpleAccessibleClassCatalog()); reflectionService.setAccessibleClassParser(new JavaAccessibleClassParser()); JavaClassPathAccessibleClassProvider provider = new JavaClassPathAccessibleClassProvider(); List<String> packagePrefixes = new ArrayList<String>(); packagePrefixes.add(ParentTestClass.class.getPackage().getName()); provider.setPackagePrefixes(packagePrefixes); provider.provideClasses(reflectionService.getAccessibleClassCatalog()); rpcService = new MockGWTReflectionServiceAsync(reflectionService); } private ClassTreeNodePresenter.ClassDisplay mockClassTreeNodePresenterDisplay() { ClassTreeNodePresenter.ClassDisplay nodeView = mock(ClassTreeNodePresenter.ClassDisplay.class); ImplementingClassPresenter.Display implView = mock(ImplementingClassPresenter.Display.class); when(nodeView.getImplementingClassDisplay()).thenReturn(implView); doAnswer(new Answer<Void>() { public Void answer(InvocationOnMock invocation) throws Throwable { System.err.println("selectImplementingClass(" + invocation.getArguments()[0] + ")"); return null; } }).when(implView).selectImplementingClass(anyString()); when(nodeView.createPrimitiveChild(anyString())).thenAnswer( new Answer<PrimitiveTreeNodePresenter.PrimitiveDisplay>() { public PrimitiveTreeNodePresenter.PrimitiveDisplay answer(InvocationOnMock invocation) throws Throwable { return mock(PrimitiveTreeNodePresenter.PrimitiveDisplay.class); } }); when(nodeView.createClassChild()).thenAnswer(new Answer<ClassTreeNodePresenter.ClassDisplay>() { public ClassDisplay answer(InvocationOnMock invocation) throws Throwable { return mockClassTreeNodePresenterDisplay(); } }); return nodeView; } @Test public void testChangeBaseClassName() { ClassTreeNodePresenter.ClassDisplay nodeView = mockClassTreeNodePresenterDisplay(); final List<ValueChangeHandler<String>> changeHandlers = new ArrayList<ValueChangeHandler<String>>(); when(nodeView.getImplementingClassDisplay().addValueChangeHandler(any(ValueChangeHandler.class))).then( new Answer<HandlerRegistration>() { public HandlerRegistration answer(InvocationOnMock invocation) throws Throwable { changeHandlers.add((ValueChangeHandler<String>) invocation.getArguments()[0]); return mock(HandlerRegistration.class); } }); ClassTreeNodePresenter nodePresenter = new ClassTreeNodePresenter(rpcService, null, TestInterface.class.getName(), nodeView); assertEquals(TestInterface.class.getName(), nodePresenter.getBaseClassName()); assertNull(nodePresenter.getImplementingClass().getName()); verify(nodeView.getImplementingClassDisplay()).setBaseClassName(TestInterface.class.getName()); ValueChangeEvent<String> valueChangeEvent = mock(ValueChangeEvent.class); when(valueChangeEvent.getValue()).thenReturn(TestClass.class.getName()); for (ValueChangeHandler<String> changeHandler : changeHandlers) { changeHandler.onValueChange(valueChangeEvent); } /* * We shall not call selectImplementingClass because it's the widget * that selected the class */ verify(nodeView.getImplementingClassDisplay(), atLeastOnce()).selectImplementingClass(anyString()); assertEquals(TestClass.class.getName(), nodePresenter.getImplementingClass().getName()); } @Test public void testChangeBaseClassNameFromObjectConfiguration() { ClassTreeNodePresenter.ClassDisplay nodeView = mockClassTreeNodePresenterDisplay(); ClassTreeNodePresenter nodePresenter = new ClassTreeNodePresenter(rpcService, null, TestInterface.class.getName(), nodeView); assertEquals(TestInterface.class.getName(), nodePresenter.getBaseClassName()); assertNotNull(nodePresenter.getImplementingClass()); assertNull(nodePresenter.getImplementingClass().getName()); verify(nodeView.getImplementingClassDisplay()).setBaseClassName(TestInterface.class.getName()); ObjectConfiguration objectConfiguration = factory.createObjectConfiguration(); objectConfiguration.setFields(new HashMap<String, ElementConfiguration>()); objectConfiguration.setClassName(TestClass.class.getName()); nodePresenter.setElementConfiguration(objectConfiguration); verify(nodeView.getImplementingClassDisplay(), atLeastOnce()).selectImplementingClass(anyString()); assertEquals(TestClass.class.getName(), nodePresenter.getImplementingClass().getName()); ElementConfiguration elementConfiguration = nodePresenter.getElementConfiguration(factory); assertNotNull(elementConfiguration); assertTrue(elementConfiguration instanceof ObjectConfiguration); ObjectConfiguration createdObjectConfiguration = (ObjectConfiguration) elementConfiguration; assertEquals(TestClass.class.getName(), createdObjectConfiguration.getClassName()); } }