blob: b5894a8fb45fd2f4f0b6cf7ae4d3b98926a4777e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 EclipseSource Muenchen GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Eugen Neufeld - initial API and implementation
******************************************************************************/
package org.eclipse.emf.ecp.view.internal.core.swt.renderer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.ecp.test.common.DefaultRealm;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.model.VContainedElement;
import org.eclipse.emf.ecp.view.spi.model.VElement;
import org.eclipse.emf.ecp.view.spi.model.VView;
import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
import org.eclipse.emfforms.spi.common.locale.EMFFormsLocaleProvider;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.emfforms.spi.swt.core.AbstractSWTRenderer;
import org.eclipse.emfforms.spi.swt.core.EMFFormsNoRendererException;
import org.eclipse.emfforms.spi.swt.core.EMFFormsRendererFactory;
import org.eclipse.emfforms.spi.swt.core.layout.GridDescriptionFactory;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
public class ViewRenderer_PTest {
private ViewSWTRenderer viewRenderer;
private VView view;
private ViewModelContext context;
private Shell shell;
private EMFFormsRendererFactory rendererFactory;
private DefaultRealm realm;
@BeforeClass
public static void setupClass() {
}
@Before
public void setUp() {
realm = new DefaultRealm();
final ReportService reportService = mock(ReportService.class);
rendererFactory = mock(EMFFormsRendererFactory.class);
final EMFFormsLocaleProvider localeProvider = mock(EMFFormsLocaleProvider.class);
view = Mockito.mock(VView.class);
context = Mockito.mock(ViewModelContext.class);
shell = new Shell();
viewRenderer = new ViewSWTRenderer(view, context, reportService, rendererFactory,
localeProvider);
viewRenderer.init();
}
@After
public void tearDown() {
realm.dispose();
shell.dispose();
}
@Test
public void testGridDescription() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption {
final SWTGridDescription gridDescription = viewRenderer.getGridDescription(GridDescriptionFactory.INSTANCE
.createEmptyGridDescription());
assertEquals(1, gridDescription.getColumns());
assertEquals(1, gridDescription.getRows());
}
@Test
public void testEmptyView() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption {
when(view.getChildren())
.thenReturn(new BasicEList<VContainedElement>());
final Control render = viewRenderer.render(new SWTGridCell(0, 0, viewRenderer), shell);
assertTrue(Composite.class.isInstance(render));
assertEquals(0, Composite.class.cast(render).getChildren().length);
}
@Test
public void testMultipleSimpleCompositeView() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, EMFFormsNoRendererException {
final BasicEList<VContainedElement> basicEList = new BasicEList<VContainedElement>();
final VContainedElement control1 = mock(VContainedElement.class);
final VContainedElement control2 = mock(VContainedElement.class);
basicEList.add(control1);
basicEList.add(control2);
when(view.getChildren()).thenReturn(basicEList);
final AbstractSWTRenderer<VElement> mockRenderer1 = createCompositeMockRenderer(control1, 1);
final AbstractSWTRenderer<VElement> mockRenderer2 = createCompositeMockRenderer(control2, 1);
when(rendererFactory.getRendererInstance(control1, context)).thenReturn(mockRenderer1);
when(rendererFactory.getRendererInstance(control2, context)).thenReturn(mockRenderer2);
final Control render = viewRenderer.render(new SWTGridCell(0, 0, viewRenderer), shell);
assertTrue(Composite.class.isInstance(render));
assertEquals(2, Composite.class.cast(render).getChildren().length);
assertTrue(GridData.class.isInstance(Composite.class.cast(render).getChildren()[0].getLayoutData()));
assertTrue(GridData.class.isInstance(Composite.class.cast(render).getChildren()[1].getLayoutData()));
assertEquals(1,
GridData.class.cast(Composite.class.cast(render).getChildren()[0].getLayoutData()).horizontalSpan);
assertEquals(1,
GridData.class.cast(Composite.class.cast(render).getChildren()[1].getLayoutData()).horizontalSpan);
}
@Test
public void testMultipleComplexGridDescriptionView() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, EMFFormsNoRendererException {
final BasicEList<VContainedElement> basicEList = new BasicEList<VContainedElement>();
final VContainedElement control1 = mock(VContainedElement.class);
final VContainedElement control2 = mock(VContainedElement.class);
final VContainedElement control3 = mock(VContainedElement.class);
basicEList.add(control1);
basicEList.add(control2);
basicEList.add(control3);
when(view.getChildren()).thenReturn(basicEList);
final AbstractSWTRenderer<VElement> mockRenderer1 = createCompositeMockRenderer(control1, 1);
final AbstractSWTRenderer<VElement> mockRenderer2 = createCompositeMockRenderer(control2, 3);
final AbstractSWTRenderer<VElement> mockRenderer3 = createCompositeMockRenderer(control3, 2);
when(rendererFactory.getRendererInstance(control1, context)).thenReturn(mockRenderer1);
when(rendererFactory.getRendererInstance(control2, context)).thenReturn(mockRenderer2);
when(rendererFactory.getRendererInstance(control3, context)).thenReturn(mockRenderer3);
final Control render = viewRenderer.render(new SWTGridCell(0, 0, viewRenderer), shell);
assertTrue(Composite.class.isInstance(render));
assertEquals(6, Composite.class.cast(render).getChildren().length);
for (int i = 0; i < 6; i++) {
assertTrue(GridData.class.isInstance(Composite.class.cast(render).getChildren()[i].getLayoutData()));
}
assertEquals(3,
GridData.class.cast(Composite.class.cast(render).getChildren()[0].getLayoutData()).horizontalSpan);
assertEquals(2,
GridData.class.cast(Composite.class.cast(render).getChildren()[5].getLayoutData()).horizontalSpan);
}
private AbstractSWTRenderer<VElement> createCompositeMockRenderer(
VContainedElement control1, int numColumns) throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
@SuppressWarnings("unchecked")
final AbstractSWTRenderer<VElement> mockRenderer = mock(AbstractSWTRenderer.class);
final SWTGridDescription gd = GridDescriptionFactory.INSTANCE.createSimpleGrid(1, numColumns, mockRenderer);
when(mockRenderer.getGridDescription(any(SWTGridDescription.class))).thenAnswer(
new Answer<SWTGridDescription>() {
@Override
public SWTGridDescription answer(InvocationOnMock invocation)
throws Throwable {
final Object[] args = invocation.getArguments();
final SWTGridDescription desc = (SWTGridDescription) args[0];
if (desc.getColumns() == 0 && desc.getRows() == 0 && desc.getGrid() == null) {
return gd;
}
return null;
}
});
when(mockRenderer.render(any(SWTGridCell.class), any(Composite.class))).thenAnswer(new Answer<Control>() {
@Override
public Control answer(InvocationOnMock invocation) throws Throwable {
final Object[] args = invocation.getArguments();
return new Composite((Composite) args[1], SWT.NONE);
}
});
return mockRenderer;
}
}