Skip to content

Content of file AbstractControlSWTRenderer_PTest.java

/*******************************************************************************
 * Copyright (c) 2011-2017 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:
 * Johannes Faltermeier - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.view.spi.core.swt;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertSame;
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 java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
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.LabelAlignment;
import org.eclipse.emf.ecp.view.spi.model.VControl;
import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
import org.eclipse.emf.ecp.view.template.model.VTStyleProperty;
import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
import org.eclipse.emf.ecp.view.template.style.alignment.model.AlignmentType;
import org.eclipse.emf.ecp.view.template.style.alignment.model.VTAlignmentFactory;
import org.eclipse.emf.ecp.view.template.style.alignment.model.VTControlLabelAlignmentStyleProperty;
import org.eclipse.emf.ecp.view.template.style.wrap.model.VTLabelWrapStyleProperty;
import org.eclipse.emf.ecp.view.template.style.wrap.model.VTWrapFactory;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
import org.eclipse.emfforms.spi.core.services.label.NoLabelFoundException;
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.emfforms.spi.swt.core.ui.SWTValidationHelper;
import org.eclipse.emfforms.spi.swt.core.ui.SWTValidationUiService;
import org.eclipse.emfforms.swt.common.test.AbstractControl_PTest.TestObservableValue;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

public class AbstractControlSWTRenderer_PTest {

	private DefaultRealm realm;
	private Shell shell;

	private VControl vControl;
	private ViewModelContext viewModelContext;
	private ReportService reportService;
	private EMFFormsDatabinding emfFormsDatabinding;
	private EMFFormsLabelProvider emfFormsLabelProvider;
	private VTViewTemplateProvider viewTemplateProvider;

	private TestAbstractControlSWTRenderer renderer;

	private SWTGridCell swtGridCell;

	@Before
	public void before() throws DatabindingFailedException, NoLabelFoundException {
		realm = new DefaultRealm();
		shell = new Shell();

		vControl = Mockito.mock(VControl.class);
		Mockito.when(vControl.getLabelAlignment()).thenReturn(LabelAlignment.LEFT);

		viewModelContext = Mockito.mock(ViewModelContext.class);
		reportService = Mockito.mock(ReportService.class);

		emfFormsDatabinding = Mockito.mock(EMFFormsDatabinding.class);
		final TestObservableValue mockedObservableValue = mock(TestObservableValue.class);
		Mockito.when(mockedObservableValue.getRealm()).thenReturn(realm);
		final EObject mockedEObject = mock(EObject.class);
		Mockito.when(mockedEObject.eIsSet(any(EStructuralFeature.class))).thenReturn(true);
		Mockito.when(mockedObservableValue.getObserved()).thenReturn(mockedEObject);
		final EStructuralFeature mockedEStructuralFeature = EcorePackage.eINSTANCE.getENamedElement_Name();
		Mockito.when(mockedObservableValue.getValueType()).thenReturn(mockedEStructuralFeature);
		Mockito.when(emfFormsDatabinding.getObservableValue(
			any(VDomainModelReference.class),
			any(EObject.class)))
			.thenReturn(mockedObservableValue);
		final IValueProperty valueProperty = Mockito.mock(IValueProperty.class);
Mockito.when(valueProperty.getValueType()).thenReturn(mockedEStructuralFeature); Mockito.when(emfFormsDatabinding.getValueProperty( any(VDomainModelReference.class), any(EObject.class))) .thenReturn(valueProperty); emfFormsLabelProvider = Mockito.mock(EMFFormsLabelProvider.class); Mockito.when(emfFormsLabelProvider.getDisplayName( any(VDomainModelReference.class), any(EObject.class))) .thenReturn(Observables.constantObservableValue("I am display name", String.class)); //$NON-NLS-1$ Mockito.when(emfFormsLabelProvider.getDescription( any(VDomainModelReference.class), any(EObject.class))) .thenReturn(Observables.constantObservableValue("I am description", String.class)); //$NON-NLS-1$ viewTemplateProvider = Mockito.mock(VTViewTemplateProvider.class); renderer = new TestAbstractControlSWTRenderer( vControl, viewModelContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, viewTemplateProvider); renderer.init(); } @After public void tearDown() { shell.dispose(); realm.dispose(); } @Test public void testDefaultLabelStyleBits() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* act */ final Control render = renderer.renderControl(swtGridCell, shell); /* assert */ assertTrue(Label.class.isInstance(render)); assertEquals(SWT.LEFT, Label.class.cast(render).getAlignment()); } @Test public void testDefaultLabelStyleBitsLeft() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* setup */ final VTControlLabelAlignmentStyleProperty property = VTAlignmentFactory.eINSTANCE .createControlLabelAlignmentStyleProperty(); property.setType(AlignmentType.LEFT); final Set<VTStyleProperty> properties = Collections.<VTStyleProperty> singleton(property); Mockito.when(viewTemplateProvider.getStyleProperties(vControl, viewModelContext)).thenReturn(properties); /* act */ final Control render = renderer.renderControl(swtGridCell, shell); /* assert */ assertTrue(Label.class.isInstance(render)); assertEquals(SWT.LEFT, Label.class.cast(render).getAlignment()); } @Test public void testLabelWrapStylePropertyNull() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* act */ final Control render = renderer.renderControl(swtGridCell, shell); /* assert */ assertTrue(Label.class.isInstance(render)); assertEquals(0, render.getStyle() & SWT.WRAP); } @Test public void testLabelWrapStylePropertyNonWrapping() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* setup */ final VTLabelWrapStyleProperty labelWrapStyleProperty = VTWrapFactory.eINSTANCE.createLabelWrapStyleProperty(); labelWrapStyleProperty.setWrapLabel(false); final Set<VTStyleProperty> properties = Collections.<VTStyleProperty> singleton(labelWrapStyleProperty); Mockito.when(viewTemplateProvider.getStyleProperties(vControl, viewModelContext)).thenReturn(properties); /* act */ final Control render = renderer.renderControl(swtGridCell, shell); /* assert */ assertTrue(Label.class.isInstance(render)); assertEquals(0, render.getStyle() & SWT.WRAP); } @Test public void testLabelWrapStylePropertyWrapping() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* setup */ final VTLabelWrapStyleProperty labelWrapStyleProperty = VTWrapFactory.eINSTANCE.createLabelWrapStyleProperty(); labelWrapStyleProperty.setWrapLabel(true); final Set<VTStyleProperty> properties = Collections.<VTStyleProperty> singleton(labelWrapStyleProperty); Mockito.when(viewTemplateProvider.getStyleProperties(vControl, viewModelContext)).thenReturn(properties); /* act */ final Control render = renderer.renderControl(swtGridCell, shell); /* assert */ assertTrue(Label.class.isInstance(render)); assertNotEquals(0, render.getStyle() & SWT.WRAP); } @Test public void testMixedStylePropertiesInfluencingStyleBits() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* setup */ final VTControlLabelAlignmentStyleProperty alignProperty = VTAlignmentFactory.eINSTANCE .createControlLabelAlignmentStyleProperty(); alignProperty.setType(AlignmentType.RIGHT); final VTLabelWrapStyleProperty labelWrapStyleProperty = VTWrapFactory.eINSTANCE.createLabelWrapStyleProperty(); labelWrapStyleProperty.setWrapLabel(true); final Set<VTStyleProperty> properties = new LinkedHashSet<>(); properties.add(alignProperty); properties.add(labelWrapStyleProperty); Mockito.when(viewTemplateProvider.getStyleProperties(vControl, viewModelContext)).thenReturn(properties); /* act */ final Control render = renderer.renderControl(swtGridCell, shell); /* assert */ assertTrue(Label.class.isInstance(render)); assertNotEquals(0, render.getStyle() & SWT.WRAP); assertEquals(SWT.RIGHT, Label.class.cast(render).getAlignment()); } @SuppressWarnings("deprecation") @Test public void testgetValidationBackgroundColorLegacy() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* setup */ final SWTValidationHelper validationHelper = Mockito.mock(SWTValidationHelper.class); renderer = new TestAbstractControlSWTRenderer( vControl, viewModelContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, viewTemplateProvider, validationHelper); renderer.init(); final List<Integer> severityList = createListOfSeverities(); // Create a list of sample colors final List<Color> colorList0 = createColorList(0, severityList); mockBackGroundColorSet(validationHelper, severityList, colorList0); // Check that all colors are retrieved correctly on the first run int i = 0; for (final Integer severity : severityList) { final Color validationBackgroundColor = renderer.getValidationBackgroundColor(severity); assertEquals(colorList0.get(i), validationBackgroundColor); i++; } // change the colors in the validation helper mock final List<Color> colorList1 = createColorList(1, severityList); mockBackGroundColorSet(validationHelper, severityList, colorList1); // Check that still color set 0 is returned i = 0; for (final Integer severity : severityList) { final Color validationBackgroundColor = renderer.getValidationBackgroundColor(severity); assertEquals(colorList0.get(i), validationBackgroundColor); i++; } } @SuppressWarnings("deprecation") @Test public void testgetValidationForeGroundColorLegacy() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* setup */ final SWTValidationHelper validationHelper = Mockito.mock(SWTValidationHelper.class); renderer = new TestAbstractControlSWTRenderer( vControl, viewModelContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, viewTemplateProvider, validationHelper); renderer.init(); final List<Integer> severityList = createListOfSeverities(); // Create a list of sample colors final List<Color> colorList0 = createColorList(0, severityList); mockForeGroundColorSet(validationHelper, severityList, colorList0); // Check that all colors are retrieved correctly on the first run int i = 0; for (final Integer severity : severityList) { final Color validationBackgroundColor = renderer.getValidationForegroundColor(severity); assertEquals(colorList0.get(i), validationBackgroundColor); i++; } // change the colors in the validation helper mock final List<Color> colorList1 = createColorList(1, severityList); mockForeGroundColorSet(validationHelper, severityList, colorList1); // Check that still color set 0 is returned i = 0; for (final Integer severity : severityList) { final Color validationBackgroundColor = renderer.getValidationForegroundColor(severity); assertEquals(colorList0.get(i), validationBackgroundColor); i++; } } @SuppressWarnings("deprecation") @Test public void testgetValidationIconLegacy() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* setup */ final SWTValidationHelper validationHelper = Mockito.mock(SWTValidationHelper.class); renderer = new TestAbstractControlSWTRenderer( vControl, viewModelContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, viewTemplateProvider, validationHelper); renderer.init(); final List<Integer> severityList = createListOfSeverities(); // Create a list of sample Icons final List<Image> iconList0 = createIconList(0, severityList); mockIconList(validationHelper, severityList, iconList0); // Check that all icons are retrieved correctly on the first run int i = 0; for (final Integer severity : severityList) { final Image validationIcon = renderer.getValidationIcon(severity); assertEquals(iconList0.get(i), validationIcon); i++; } // change the icons in the validation helper mock final List<Image> iconList1 = createIconList(1, severityList); mockIconList(validationHelper, severityList, iconList1); // Check that still icon set 0 is returned i = 0; for (final Integer severity : severityList) { final Image validationIcon = renderer.getValidationIcon(severity); assertEquals(iconList0.get(i), validationIcon); i++; } } /** * @param i * @param severityList * @return */ private List<Image> createIconList(int index, List<Integer> severityList) { final List<Image> imageList = new ArrayList<>(); for (final Integer severity : severityList) { // Shifting index by 1, as 0 size images are not allowed imageList.add(new Image(Display.getCurrent(), index + 1, severity + 1)); } return imageList; } /** * @param validationHelper * @param severityList * @param colorList1 */ private void mockForeGroundColorSet(SWTValidationHelper validationHelper, List<Integer> severityList, List<Color> colorList1) { int i = 0; for (final Integer severity : severityList) { Mockito.when(validationHelper.getValidationForegroundColor(severity, vControl, viewModelContext)) .thenReturn(colorList1.get(i)); i++; } } /** * @param validationHelper * @param severityList * @param colorList1 */ private void mockIconList(SWTValidationHelper validationHelper, List<Integer> severityList, List<Image> imageList) { int i = 0; for (final Integer severity : severityList) { Mockito.when(validationHelper.getValidationIcon(severity, vControl, viewModelContext)) .thenReturn(imageList.get(i)); i++; } } /** * @param validationHelper * @param severityList * @param colorList1 */ private void mockBackGroundColorSet(SWTValidationHelper validationHelper, List<Integer> severityList, List<Color> colorList1) { int i = 0; for (final Integer severity : severityList) { Mockito.when(validationHelper.getValidationBackgroundColor(severity, vControl, viewModelContext)) .thenReturn(colorList1.get(i)); i++; } } /** * @param severityList * @return */ private List<Color> createColorList(int index, List<Integer> severityList) { final List<Color> colorList = new ArrayList<>(); for (final Integer severity : severityList) { colorList.add(new Color(Display.getCurrent(), 0, index, severity)); } return colorList; } /** * @return */ private List<Integer> createListOfSeverities() { final List<Integer> listOfSeverties = new ArrayList<>(); listOfSeverties.add(Diagnostic.OK); listOfSeverties.add(Diagnostic.WARNING); listOfSeverties.add(Diagnostic.ERROR); listOfSeverties.add(Diagnostic.INFO); listOfSeverties.add(Diagnostic.CANCEL); return listOfSeverties; } @Test public void testDefaultLabelStyleBitsRight() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { /* setup */ final VTControlLabelAlignmentStyleProperty property = VTAlignmentFactory.eINSTANCE .createControlLabelAlignmentStyleProperty(); property.setType(AlignmentType.RIGHT); final Set<VTStyleProperty> properties = Collections.<VTStyleProperty> singleton(property); Mockito.when(viewTemplateProvider.getStyleProperties(vControl, viewModelContext)).thenReturn(properties); /* act */ final Control render = renderer.renderControl(swtGridCell, shell); /* assert */ assertTrue(Label.class.isInstance(render)); assertEquals(SWT.RIGHT, Label.class.cast(render).getAlignment()); } /** Verify retrieving the validation icon for a VElement is forwarded to the {@link SWTValidationUiService}. */ @Test public void getValidationIcon() { final SWTValidationUiService validationUiService = mock(SWTValidationUiService.class); renderer = new TestAbstractControlSWTRenderer( vControl, viewModelContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, viewTemplateProvider, validationUiService); renderer.init(); final Image expected = new Image(Display.getCurrent(), 1, 1); when(validationUiService.getValidationIcon(vControl, viewModelContext)).thenReturn(expected); final Image result = renderer.getValidationIcon(); assertSame(expected, result); } /** * Verify retrieving the validation foreground color for a VElement is forwarded to the * {@link SWTValidationUiService}. */ @Test public void getValidationForegroundColor() { final SWTValidationUiService validationUiService = mock(SWTValidationUiService.class); renderer = new TestAbstractControlSWTRenderer( vControl, viewModelContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, viewTemplateProvider, validationUiService); renderer.init(); final Color expected = new Color(Display.getCurrent(), 1, 2, 3); when(validationUiService.getValidationForegroundColor(vControl, viewModelContext)).thenReturn(expected); final Color result = renderer.getValidationForegroundColor(); assertSame(expected, result); } /** * Verify retrieving the validation background color for a VElement is forwarded to the * {@link SWTValidationUiService}. */ @Test public void getValidationBackgroundColor() { final SWTValidationUiService validationUiService = mock(SWTValidationUiService.class); renderer = new TestAbstractControlSWTRenderer( vControl, viewModelContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, viewTemplateProvider, validationUiService); renderer.init(); final Color expected = new Color(Display.getCurrent(), 1, 2, 3); when(validationUiService.getValidationBackgroundColor(vControl, viewModelContext)).thenReturn(expected); final Color result = renderer.getValidationBackgroundColor(); assertSame(expected, result); } /** * Test that the {@link SWTValidationUiService} implementation is retrieved from the view model context if it is not * given in the constructor. */ @Test public void validationUiServiceRetrieval() { final SWTValidationUiService customService = mock(SWTValidationUiService.class); final Image expected = new Image(Display.getCurrent(), 1, 1); when(customService.getValidationIcon(vControl, viewModelContext)).thenReturn(expected); when(viewModelContext.getService(SWTValidationUiService.class)).thenReturn(customService); renderer = new TestAbstractControlSWTRenderer( vControl, viewModelContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, viewTemplateProvider); renderer.init(); final Image result = renderer.getValidationIcon(); assertSame(expected, result); } private class TestAbstractControlSWTRenderer extends AbstractControlSWTRenderer<VControl> { TestAbstractControlSWTRenderer( VControl vElement, ViewModelContext viewContext, ReportService reportService, EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider, VTViewTemplateProvider vtViewTemplateProvider) { super( vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider); } TestAbstractControlSWTRenderer( VControl vElement, ViewModelContext viewContext, ReportService reportService, EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider, VTViewTemplateProvider vtViewTemplateProvider, SWTValidationHelper swtValidationHelper) { super( vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider, swtValidationHelper); } TestAbstractControlSWTRenderer( VControl vElement, ViewModelContext viewContext, ReportService reportService, EMFFormsDatabinding emfFormsDatabinding, EMFFormsLabelProvider emfFormsLabelProvider, VTViewTemplateProvider vtViewTemplateProvider, SWTValidationUiService validationUiService) { super( vElement, viewContext, reportService, emfFormsDatabinding, emfFormsLabelProvider, vtViewTemplateProvider, validationUiService); } @Override public SWTGridDescription getGridDescription(SWTGridDescription gridDescription) { final SWTGridDescription simpleGrid = GridDescriptionFactory.INSTANCE.createSimpleGrid(1, 1, this); swtGridCell = simpleGrid.getGrid().get(0); return simpleGrid; } @Override protected Control renderControl(SWTGridCell cell, Composite parent) throws NoRendererFoundException, NoPropertyDescriptorFoundExeption { return createLabel(parent); } } }