blob: 9d897b2b90bde903b9ff17e76bb0b8cd381e06a9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2018 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eugen Neufeld - initial API and implementation
******************************************************************************/
package org.eclipse.emf.ecp.view.spi.table.swt;
import static org.junit.Assert.assertFalse;
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.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
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.model.VViewFactory;
import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
import org.eclipse.emf.ecp.view.test.common.swt.spi.DatabindingClassRunner;
import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTViewTestHelper;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.emfforms.spi.core.services.databinding.emf.EMFFormsDatabindingEMF;
import org.eclipse.emfforms.spi.core.services.editsupport.EMFFormsEditSupport;
import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
import org.eclipse.swt.widgets.Shell;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Unit tests for the {@link TableControlDetailPanelRenderer}.
*
* @author Eugen Neufeld
*
*/
@RunWith(DatabindingClassRunner.class)
public class TableControlDetailPanelRenderer_PTest {
private Shell shell;
@Before
public void setUp() {
shell = SWTViewTestHelper.createShell();
}
@After
public void tearDown() {
shell.dispose();
}
@Test
public void testGetView() {
final TableControlDetailPanelRenderer renderer = new TableControlDetailPanelRenderer(mock(VTableControl.class),
mock(ViewModelContext.class), mock(ReportService.class), mock(EMFFormsDatabindingEMF.class),
mock(EMFFormsLabelProvider.class), mock(VTViewTemplateProvider.class), mock(ImageRegistryService.class),
mock(EMFFormsEditSupport.class));
final EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute();
final EReference eReference = EcoreFactory.eINSTANCE.createEReference();
final VView viewAttribute1 = renderer.getView(eAttribute);
final VView viewReference = renderer.getView(eReference);
assertFalse(EcoreUtil.equals(viewAttribute1, viewReference));
final VView viewAttribute2 = renderer.getView(eAttribute);
assertTrue(EcoreUtil.equals(viewAttribute1, viewAttribute2));
}
/**
* If the detail view is not configured as readonly, the table sets it to read only when the table is disabled.
* Furthermore, the detail's readonly state is resetted when the table is enabled again.
*/
@Test
public void testEnabledChangeAppliedToDetailView_OriginalReadonlyFalse() {
final VTableControl control = mock(VTableControl.class);
final VView detailView = VViewFactory.eINSTANCE.createView();
detailView.setReadonly(false);
when(control.getDetailView()).thenReturn(detailView);
when(control.isEffectivelyEnabled()).thenReturn(true);
when(control.isEffectivelyReadonly()).thenReturn(false);
final EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute();
final ViewModelContext context = mockViewModelContext(detailView, eAttribute);
final TableControlDetailPanelRenderer renderer = new TableControlDetailPanelRenderer(control,
context, mock(ReportService.class), mock(EMFFormsDatabindingEMF.class),
mock(EMFFormsLabelProvider.class), mock(VTViewTemplateProvider.class), mock(ImageRegistryService.class),
mock(EMFFormsEditSupport.class));
renderer.renderSelectedObject(shell, eAttribute);
assertFalse(detailView.isReadonly());
when(control.isEffectivelyEnabled()).thenReturn(false);
renderer.applyEnable();
assertTrue(detailView.isReadonly());
when(control.isEffectivelyEnabled()).thenReturn(true);
renderer.applyEnable();
assertFalse(detailView.isReadonly());
}
/** If the detail view is configured as readonly, it must always stay readonly. */
@Test
public void testEnabledChangeAppliedToDetailView_OriginalReadonlyTrue() {
final VTableControl control = mock(VTableControl.class);
final VView detailView = VViewFactory.eINSTANCE.createView();
detailView.setReadonly(true);
when(control.getDetailView()).thenReturn(detailView);
when(control.isEffectivelyEnabled()).thenReturn(false);
when(control.isEffectivelyReadonly()).thenReturn(false);
final EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute();
final ViewModelContext context = mockViewModelContext(detailView, eAttribute);
final TableControlDetailPanelRenderer renderer = new TableControlDetailPanelRenderer(control,
context, mock(ReportService.class), mock(EMFFormsDatabindingEMF.class),
mock(EMFFormsLabelProvider.class), mock(VTViewTemplateProvider.class), mock(ImageRegistryService.class),
mock(EMFFormsEditSupport.class));
renderer.renderSelectedObject(shell, eAttribute);
assertTrue(detailView.isReadonly());
when(control.isEffectivelyEnabled()).thenReturn(true);
renderer.applyEnable();
assertTrue(detailView.isReadonly());
}
/**
* If the table is read only, enabling it must not set the detail's readonly flag to false.
*/
@Test
public void testEnabledChangeAppliedToDetailView_DoesNotOverrideReadonlyTrue() {
final VTableControl control = mock(VTableControl.class);
final VView detailView = VViewFactory.eINSTANCE.createView();
detailView.setReadonly(false);
when(control.getDetailView()).thenReturn(detailView);
when(control.isEffectivelyEnabled()).thenReturn(false);
when(control.isEffectivelyReadonly()).thenReturn(true);
final EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute();
final ViewModelContext context = mockViewModelContext(detailView, eAttribute);
final TableControlDetailPanelRenderer renderer = new TableControlDetailPanelRenderer(control,
context, mock(ReportService.class), mock(EMFFormsDatabindingEMF.class),
mock(EMFFormsLabelProvider.class), mock(VTViewTemplateProvider.class), mock(ImageRegistryService.class),
mock(EMFFormsEditSupport.class));
renderer.renderSelectedObject(shell, eAttribute);
assertTrue(detailView.isReadonly());
when(control.isEffectivelyEnabled()).thenReturn(true);
renderer.applyEnable();
assertTrue(detailView.isReadonly());
}
/**
* If the detail view is not configured as readonly, the table sets it to read only when the table is set to
* readonly.
*/
@Test
public void testReadonlyChangeAppliedToDetailView_OriginalReadonlyFalse() {
final VTableControl control = mock(VTableControl.class);
final VView detailView = VViewFactory.eINSTANCE.createView();
detailView.setReadonly(false);
when(control.getDetailView()).thenReturn(detailView);
when(control.isEffectivelyEnabled()).thenReturn(true);
when(control.isEffectivelyReadonly()).thenReturn(false);
final EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute();
final ViewModelContext context = mockViewModelContext(detailView, eAttribute);
final TableControlDetailPanelRenderer renderer = new TableControlDetailPanelRenderer(control,
context, mock(ReportService.class), mock(EMFFormsDatabindingEMF.class),
mock(EMFFormsLabelProvider.class), mock(VTViewTemplateProvider.class), mock(ImageRegistryService.class),
mock(EMFFormsEditSupport.class));
renderer.renderSelectedObject(shell, eAttribute);
assertFalse(detailView.isReadonly());
when(control.isEffectivelyReadonly()).thenReturn(true);
renderer.applyReadOnly();
assertTrue(detailView.isReadonly());
}
/** If the detail view is configured as readonly, it must always stay readonly. */
@Test
public void testReadonlyChangeAppliedToDetailView_OriginalReadonlyTrue() {
final VTableControl control = mock(VTableControl.class);
final VView detailView = VViewFactory.eINSTANCE.createView();
detailView.setReadonly(true);
when(control.getDetailView()).thenReturn(detailView);
when(control.isEffectivelyEnabled()).thenReturn(true);
when(control.isEffectivelyReadonly()).thenReturn(true);
final EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute();
final ViewModelContext context = mockViewModelContext(detailView, eAttribute);
final TableControlDetailPanelRenderer renderer = new TableControlDetailPanelRenderer(control,
context, mock(ReportService.class), mock(EMFFormsDatabindingEMF.class),
mock(EMFFormsLabelProvider.class), mock(VTViewTemplateProvider.class), mock(ImageRegistryService.class),
mock(EMFFormsEditSupport.class));
renderer.renderSelectedObject(shell, eAttribute);
assertTrue(detailView.isReadonly());
when(control.isEffectivelyReadonly()).thenReturn(false);
renderer.applyEnable();
assertTrue(detailView.isReadonly());
}
/**
* If the table is disabled, setting its read only flag to false, must not set the detail's readonly flag to false.
*/
@Test
public void testReadonlyChangeAppliedToDetailView_DoesNotOverrideEnabledFalse() {
final VTableControl control = mock(VTableControl.class);
final VView detailView = VViewFactory.eINSTANCE.createView();
detailView.setReadonly(false);
when(control.getDetailView()).thenReturn(detailView);
when(control.isEffectivelyEnabled()).thenReturn(false);
when(control.isEffectivelyReadonly()).thenReturn(true);
final EAttribute eAttribute = EcoreFactory.eINSTANCE.createEAttribute();
final ViewModelContext context = mockViewModelContext(detailView, eAttribute);
final TableControlDetailPanelRenderer renderer = new TableControlDetailPanelRenderer(control,
context, mock(ReportService.class), mock(EMFFormsDatabindingEMF.class),
mock(EMFFormsLabelProvider.class), mock(VTViewTemplateProvider.class), mock(ImageRegistryService.class),
mock(EMFFormsEditSupport.class));
renderer.renderSelectedObject(shell, eAttribute);
assertTrue(detailView.isReadonly());
when(control.isEffectivelyReadonly()).thenReturn(false);
renderer.applyEnable();
assertTrue(detailView.isReadonly());
}
private ViewModelContext mockViewModelContext(final VView detailView, final EObject domainObject) {
final ViewModelContext context = mock(ViewModelContext.class);
final ViewModelContext childContext = mock(ViewModelContext.class);
when(childContext.getDomainModel()).thenReturn(domainObject);
when(childContext.getViewModel()).thenReturn(detailView);
when(context.getChildContext(any(EObject.class), any(VElement.class), any(VView.class)))
.thenReturn(childContext);
return context;
}
}