blob: 3861602c6ebd2d0d709b9b394a9d1bd944619530 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2019 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:
* Lucas Koehler - initial API and implementation
* Christian W. Damus - bug 527736
******************************************************************************/
package org.eclipse.emf.ecp.view.internal.control.multireference;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.matches;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.regex.Pattern;
import org.eclipse.core.databinding.observable.IObserving;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.edit.EMFEditProperties;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecp.view.model.common.AbstractGridCell.Alignment;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
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.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.emf.ecp.view.spi.util.swt.ImageRegistryService;
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.reference.model.VTReferenceFactory;
import org.eclipse.emf.ecp.view.template.style.reference.model.VTReferenceStyleProperty;
import org.eclipse.emf.ecp.view.template.style.tableStyleProperty.model.RenderMode;
import org.eclipse.emf.ecp.view.template.style.tableStyleProperty.model.VTTableStyleProperty;
import org.eclipse.emf.ecp.view.test.common.swt.spi.DatabindingClassRunner;
import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTTestUtil;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.emfstore.bowling.BowlingFactory;
import org.eclipse.emf.emfstore.bowling.BowlingPackage;
import org.eclipse.emf.emfstore.bowling.Fan;
import org.eclipse.emf.emfstore.bowling.League;
import org.eclipse.emf.emfstore.bowling.Player;
import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.B;
import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.TestFactory;
import org.eclipse.emfforms.core.services.databinding.testmodel.test.model.TestPackage;
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.localization.EMFFormsLocalizationService;
import org.eclipse.emfforms.spi.swt.core.SWTDataElementIdHelper;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.osgi.framework.Bundle;
/**
* JUnit plugin tests for {@link MultiReferenceSWTRenderer}.
*
* @author Lucas Koehler
*
*/
@RunWith(DatabindingClassRunner.class)
public class MultiReferenceRenderer_PTest {
private static final String UUID_LINK = "UUID#link"; //$NON-NLS-1$
private static final String UUID_ADD = "UUID#add"; //$NON-NLS-1$
private static final String UUID_DELETE = "UUID#delete"; //$NON-NLS-1$
private static final String UUID_DOWN = "UUID#down"; //$NON-NLS-1$
private static final String UUID_UP = "UUID#up"; //$NON-NLS-1$
private static final String TEST_DESCRIPTION = "test-description"; //$NON-NLS-1$
private static final String TEST_DISPLAYNAME = "test-displayName"; //$NON-NLS-1$
private static Realm realm;
private EMFFormsDatabinding databindingService;
private MultiReferenceSWTRenderer renderer;
private MultiReferenceSWTRenderer compactVerticallyRenderer;
private Shell shell;
private EMFFormsLabelProvider labelProvider;
private boolean showMoveButtons;
private VTViewTemplateProvider templateProvider;
/**
* Get {@link Realm} for the tests.
*/
@BeforeClass
public static void setUpBeforeClass() {
realm = Realm.getDefault();
}
/**
* Set up executed before every test.
* Mocks and registers the databinding and label services.
* Creates a new {@link MultiReferenceSWTRenderer} to be tested. Mocks needed parameters and contents (e.g.
* VControl, ViewModelContext).
*
* @throws DatabindingFailedException if the databinding failed
* @throws NoLabelFoundException
*/
@Before
public void setUp() throws DatabindingFailedException, NoLabelFoundException {
databindingService = mock(EMFFormsDatabinding.class);
labelProvider = mock(EMFFormsLabelProvider.class);
when(labelProvider.getDescription(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
Observables.constantObservableValue(TEST_DESCRIPTION));
when(labelProvider.getDisplayName(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
Observables.constantObservableValue(TEST_DISPLAYNAME));
shell = new Shell();
final B eObject = TestFactory.eINSTANCE.createB();
final EStructuralFeature eStructuralFeature = TestPackage.Literals.B__CLIST;
final ReportService reportService = mock(ReportService.class);
final ViewModelContext viewContext = mock(ViewModelContext.class);
final VControl vControl = Mockito.mock(VControl.class);
final Setting setting = mock(Setting.class);
final VDomainModelReference domainModelReference = mock(VDomainModelReference.class);
when(viewContext.getDomainModel()).thenReturn(eObject);
when(viewContext.getViewModel()).thenReturn(vControl);
when(vControl.getDomainModelReference()).thenReturn(domainModelReference);
when(setting.getEObject()).thenReturn(eObject);
when(setting.getEStructuralFeature()).thenReturn(eStructuralFeature);
Mockito.doReturn("UUID").when(vControl).getUuid(); //$NON-NLS-1$
final ImageRegistryService imageRegistryService = mock(ImageRegistryService.class);
templateProvider = mock(VTViewTemplateProvider.class);
final EMFFormsLocalizationService l10n = mock(EMFFormsLocalizationService.class);
when(l10n.getString(any(Bundle.class), matches("_UI_\\w+_type"))).then(new Answer<String>() { //$NON-NLS-1$
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
final java.util.regex.Matcher m = Pattern.compile("_UI_(\\w+)_type") //$NON-NLS-1$
.matcher((String) invocation.getArguments()[1]);
if (m.matches()) { // It should, else we wouldn't be here
return m.group(1);
}
return null;
}
});
when(viewContext.getService(EMFFormsLocalizationService.class)).thenReturn(l10n);
// mock databinding to return a value property with changeable structural feature.
// Necessary due to the implementation of Bug 536250
final EStructuralFeature changeableFeature = mock(EStructuralFeature.class);
when(changeableFeature.isChangeable()).thenReturn(true);
final IValueProperty<?, ?> valueProperty = mock(IValueProperty.class);
when(valueProperty.getValueType()).thenReturn(changeableFeature);
when(databindingService.getValueProperty(any(VDomainModelReference.class), any(EObject.class)))
.thenReturn(valueProperty);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(observableValue.getObserved()).thenReturn(eObject);
when(observableValue.getValueType()).thenReturn(eStructuralFeature);
when(databindingService.getObservableValue(domainModelReference, eObject)).thenReturn(observableValue);
renderer = new MultiReferenceSWTRenderer(vControl, viewContext, reportService, databindingService,
labelProvider, templateProvider, imageRegistryService, l10n) {
@Override
protected boolean showMoveDownButton() {
return showMoveButtons;
}
@Override
protected boolean showMoveUpButton() {
return showMoveButtons;
}
};
renderer.getGridDescription(new SWTGridDescription());
final VTViewTemplateProvider compactTemplateProvider = mock(VTViewTemplateProvider.class);
final VTTableStyleProperty tableStyleProperty = mock(VTTableStyleProperty.class);
when(compactTemplateProvider.getStyleProperties(vControl, viewContext))
.thenReturn(Collections.singleton((VTStyleProperty) tableStyleProperty));
when(tableStyleProperty.getRenderMode()).thenReturn(RenderMode.COMPACT_VERTICALLY);
compactVerticallyRenderer = new MultiReferenceSWTRenderer(vControl, viewContext, reportService,
databindingService, labelProvider, compactTemplateProvider, imageRegistryService);
compactVerticallyRenderer.init();
compactVerticallyRenderer.getGridDescription(new SWTGridDescription());
}
/**
*
* Unregister databinding and label service after every test.
*/
@After
public void tearDown() {
}
/**
* Test if the initial data binding is working.
*
* @throws NoRendererFoundException Renderer could not be found
* @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
* @throws DatabindingFailedException if the databinding failed
*/
@Test
public void testDatabindingServiceUsageInitialBinding() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, DatabindingFailedException {
final List<Integer> initialList = new LinkedList<Integer>();
initialList.add(2);
initialList.add(4);
final WritableList mockedObservableList = new WritableList(realm, initialList, Integer.class);
final Table table = setUpDatabindingTests(mockedObservableList);
assertEquals(mockedObservableList.size(), table.getItemCount());
for (int i = 0; i < mockedObservableList.size(); i++) {
assertEquals(mockedObservableList.get(i).toString(), table.getItems()[i].getText(0));
}
}
/**
* Tests whether adding values to the model is reflected in the control.
*
* @throws NoRendererFoundException Renderer could not be found
* @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
* @throws DatabindingFailedException if the databinding failed
*/
@Test
public void testDatabindingServiceUsageAddToModel() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, DatabindingFailedException {
final List<EObject> initialList = new LinkedList<>();
initialList.add(TestFactory.eINSTANCE.createC());
initialList.add(TestFactory.eINSTANCE.createC());
final WritableList<EObject> mockedObservableList = new WritableList<EObject>(realm, initialList, EObject.class);
final Table table = setUpDatabindingTests(mockedObservableList);
mockedObservableList.add(TestFactory.eINSTANCE.createC());
assertEquals(mockedObservableList.size(), table.getItemCount());
for (int i = 0; i < mockedObservableList.size(); i++) {
assertSame(mockedObservableList.get(i), table.getItems()[i].getData());
}
}
/**
* Tests whether removing values to the model is reflected in the control.
*
* @throws NoRendererFoundException Renderer could not be found
* @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
* @throws DatabindingFailedException if the databinding failed
*/
@Test
public void testDatabindingServiceUsageRemoveFromModel() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, DatabindingFailedException {
final List<EObject> initialList = new LinkedList<>();
initialList.add(TestFactory.eINSTANCE.createC());
initialList.add(TestFactory.eINSTANCE.createC());
final WritableList<EObject> mockedObservableList = new WritableList<EObject>(realm, initialList, EObject.class);
final Table table = setUpDatabindingTests(mockedObservableList);
mockedObservableList.remove(0);
assertEquals(mockedObservableList.size(), table.getItemCount());
for (int i = 0; i < mockedObservableList.size(); i++) {
assertSame(mockedObservableList.get(i), table.getItems()[i].getData());
}
}
/**
* Tests whether changing values of the model is reflected in the control.
*
* @throws NoRendererFoundException Renderer could not be found
* @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
* @throws DatabindingFailedException if the databinding failed
*/
@Test
public void testDatabindingServiceUsageChangeModel() throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, DatabindingFailedException {
final List<EObject> initialList = new LinkedList<>();
initialList.add(TestFactory.eINSTANCE.createC());
initialList.add(TestFactory.eINSTANCE.createC());
final WritableList<EObject> mockedObservableList = new WritableList<EObject>(realm, initialList, EObject.class);
final Table table = setUpDatabindingTests(mockedObservableList);
mockedObservableList.set(1, TestFactory.eINSTANCE.createC());
assertEquals(mockedObservableList.size(), table.getItemCount());
for (int i = 0; i < mockedObservableList.size(); i++) {
assertSame(mockedObservableList.get(i), table.getItems()[i].getData());
}
}
private Table setUpDatabindingTests(IObservableList<?> mockedObservableList) throws NoRendererFoundException,
NoPropertyDescriptorFoundExeption, DatabindingFailedException {
when(databindingService.getObservableList(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
mockedObservableList);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableValue);
when(observableValue.getObserved()).thenReturn(mock(EObject.class));
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
final Composite controlComposite = (Composite) composite.getChildren()[1];
final Table table = (Table) controlComposite.getChildren()[0];
return table;
}
/**
* Tests whether a {@link EMFFormsLabelProvider} is used to get labels.
*
* @throws NoRendererFoundException Renderer could not be found
* @throws NoPropertyDescriptorFoundExeption Property descriptor could not be found
* @throws DatabindingFailedException if the databinding failed
*/
@Test
public void testLabelServiceUsage() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption,
DatabindingFailedException {
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableValue);
when(observableValue.getObserved()).thenReturn(mock(EObject.class));
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
final Composite controlComposite = (Composite) composite.getChildren()[1];
final Table table = (Table) controlComposite.getChildren()[0];
final TableColumn column = table.getColumn(0);
assertEquals(TEST_DISPLAYNAME, column.getText());
assertEquals(TEST_DESCRIPTION, column.getToolTipText());
}
@Test
public void testRenderModeDefaultGridDescription() {
final SWTGridDescription description = renderer.getGridDescription(new SWTGridDescription());
assertEquals(1, description.getColumns());
}
@Test
public void testRenderModeCompactVerticallyGridDescription() {
final SWTGridDescription description = compactVerticallyRenderer.getGridDescription(new SWTGridDescription());
assertEquals(2, description.getColumns());
}
@Test
public void testRenderModeCompactVerticallyRenderValidation()
throws NoPropertyDescriptorFoundExeption, NoRendererFoundException {
final Control renderedControl = compactVerticallyRenderer
.render(new SWTGridCell(0, 0, compactVerticallyRenderer), shell);
assertTrue(Label.class.isInstance(renderedControl));
assertTrue(String.class.isInstance(renderedControl.getData(SWTDataElementIdHelper.ELEMENT_ID_KEY)));
assertTrue(
String.class.cast(renderedControl.getData(SWTDataElementIdHelper.ELEMENT_ID_KEY)).contains("validation")); //$NON-NLS-1$
}
@Test
public void testRenderModeCompactVerticallyRenderTable()
throws NoPropertyDescriptorFoundExeption, NoRendererFoundException, DatabindingFailedException {
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableValue);
when(observableValue.getObserved()).thenReturn(mock(EObject.class));
final Control renderedControl = compactVerticallyRenderer
.render(new SWTGridCell(0, 1, compactVerticallyRenderer), shell);
assertTrue(Composite.class.isInstance(renderedControl));
final Composite tableAndButtonsComposite = Composite.class.cast(renderedControl);
assertTrue(Composite.class.isInstance(tableAndButtonsComposite.getChildren()[0]));
final Composite tableComposite = Composite.class.cast(tableAndButtonsComposite.getChildren()[0]);
assertTrue(Composite.class.isInstance(tableComposite.getChildren()[0]));
final Composite tableControlComposite = Composite.class.cast(tableComposite.getChildren()[0]);
assertTrue(Table.class.isInstance(tableControlComposite.getChildren()[0]));
}
@Test
public void testRenderModeCompactVerticallyRenderButtons()
throws NoPropertyDescriptorFoundExeption, NoRendererFoundException, DatabindingFailedException {
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableValue);
when(observableValue.getObserved()).thenReturn(mock(EObject.class));
final Control renderedControl = compactVerticallyRenderer
.render(new SWTGridCell(0, 1, compactVerticallyRenderer), shell);
assertTrue(Composite.class.isInstance(renderedControl));
final Composite tableAndButtonsComposite = Composite.class.cast(renderedControl);
assertTrue(Composite.class.isInstance(tableAndButtonsComposite.getChildren()[1]));
final Composite buttonsComposite = Composite.class.cast(tableAndButtonsComposite.getChildren()[1]);
assertTrue(Button.class.isInstance(buttonsComposite.getChildren()[0]));
}
@Test
public void testRenderModeCompactGridDescription() {
final SWTGridDescription gridDescription = compactVerticallyRenderer.getGridDescription(null);
assertThat(gridDescription.getColumns(), is(equalTo(2)));
final SWTGridCell validationCell = gridDescription.getGrid().get(0);
assertThat(validationCell.getPreferredSize(), notNullValue());
assertThat(validationCell.isHorizontalGrab(), is(false));
assertThat(validationCell.getVerticalAlignment(), is(Alignment.BEGINNING));
final SWTGridCell mainCell = gridDescription.getGrid().get(1);
assertThat(mainCell.getPreferredSize(), nullValue());
assertThat(mainCell.isHorizontalGrab(), is(true));
assertThat(mainCell.isVerticalGrab(), is(true));
}
/**
* Tests the tool-tip on the "Link" button.
*
* @see <a href="http://eclip.se/527736">bug 527736</a>
*/
@Test
public void testLinkButtonTooltip() {
final Table table = createLeaguePlayersTable();
final Button linkButton = SWTTestUtil.findControl(table.getParent().getParent(), 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Player")); //$NON-NLS-1$
}
/**
* Tests the tool-tip on the "Link" button.
*
* @see <a href="http://eclip.se/527736">bug 527736</a>
*/
@SuppressWarnings("unchecked")
@Test
public void testLinkButtonTooltipReflective() {
final EPackage leaguePackage = EcoreFactory.eINSTANCE.createEPackage();
leaguePackage.setName("Example"); //$NON-NLS-1$
leaguePackage.setNsPrefix("example"); //$NON-NLS-1$
leaguePackage.setNsURI("http:///example.ecore"); //$NON-NLS-1$
final EClass leagueClass = EcoreFactory.eINSTANCE.createEClass();
leagueClass.setName("League"); //$NON-NLS-1$
final EClass playerClass = EcoreFactory.eINSTANCE.createEClass();
playerClass.setName("Player"); //$NON-NLS-1$
final EReference playersReference = EcoreFactory.eINSTANCE.createEReference();
playersReference.setEType(playerClass);
playersReference.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
leagueClass.getEStructuralFeatures().add(playersReference);
leaguePackage.getEClassifiers().add(leagueClass);
leaguePackage.getEClassifiers().add(playerClass);
final EObject league = EcoreUtil.create(leagueClass);
final IObservableList<?> observableList = EMFProperties.list(playersReference).observe(league);
Table table = null;
try {
// Re-stub the domain model as our league
when(renderer.getViewModelContext().getDomainModel()).thenReturn(league);
when(databindingService.getObservableList(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableList);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class)))
.thenReturn(observableValue);
when(observableValue.getObserved()).thenReturn(league);
when(observableValue.getValueType()).thenReturn(BowlingPackage.Literals.LEAGUE__PLAYERS);
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
final Composite controlComposite = (Composite) composite.getChildren()[1];
table = (Table) controlComposite.getChildren()[0];
// BEGIN COMPLEX CODE
} catch (final Exception e) {
// END COMPLEX CODE
e.printStackTrace();
fail("Failed to render multi-reference table: " + e.getMessage()); //$NON-NLS-1$
}
final Button linkButton = SWTTestUtil.findControl(table.getParent().getParent(), 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Player")); //$NON-NLS-1$
}
/**
* Tests the tool-tip on the "Create and link new" button.
*
* @see <a href="http://eclip.se/527736">bug 527736</a>
*/
@Test
public void testCreateAndLinkNewButtonTooltip() {
final Table table = createLeaguePlayersTable();
final Button linkButton = SWTTestUtil.findControl(table.getParent().getParent(), 1, Button.class);
assertThat(linkButton.getToolTipText(), is("Create and link new Player")); //$NON-NLS-1$
}
@Test
public void testButtonData() {
showMoveButtons = true;
final Table table = createLeaguePlayersTable();
assertEquals(UUID_UP, SWTTestUtil.findControl(table.getParent().getParent(), 0, Button.class)
.getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
assertEquals(UUID_DOWN, SWTTestUtil.findControl(table.getParent().getParent(), 1, Button.class)
.getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
assertEquals(UUID_LINK, SWTTestUtil.findControl(table.getParent().getParent(), 2, Button.class)
.getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
assertEquals(UUID_ADD, SWTTestUtil.findControl(table.getParent().getParent(), 3, Button.class)
.getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
assertEquals(UUID_DELETE, SWTTestUtil.findControl(table.getParent().getParent(), 4, Button.class)
.getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
}
/**
* Tests the tool-tip on the "Link" button.
*
* @see <a href="http://eclip.se/527736">bug 527736</a>
*/
@SuppressWarnings("unchecked")
@Test
public void testCreateAndLinkNewButtonTooltipReflective() {
final EPackage leaguePackage = EcoreFactory.eINSTANCE.createEPackage();
leaguePackage.setName("Example"); //$NON-NLS-1$
leaguePackage.setNsPrefix("example"); //$NON-NLS-1$
leaguePackage.setNsURI("http:///example.ecore"); //$NON-NLS-1$
final EClass leagueClass = EcoreFactory.eINSTANCE.createEClass();
leagueClass.setName("League"); //$NON-NLS-1$
final EClass playerClass = EcoreFactory.eINSTANCE.createEClass();
playerClass.setName("Player"); //$NON-NLS-1$
final EReference playersReference = EcoreFactory.eINSTANCE.createEReference();
playersReference.setEType(playerClass);
playersReference.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
leagueClass.getEStructuralFeatures().add(playersReference);
leaguePackage.getEClassifiers().add(leagueClass);
leaguePackage.getEClassifiers().add(playerClass);
final EObject league = EcoreUtil.create(leagueClass);
final IObservableList<?> observableList = EMFProperties.list(playersReference).observe(league);
Table table = null;
try {
// Re-stub the domain model as our league
when(renderer.getViewModelContext().getDomainModel()).thenReturn(league);
when(databindingService.getObservableList(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableList);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class)))
.thenReturn(observableValue);
when(observableValue.getObserved()).thenReturn(league);
when(observableValue.getValueType()).thenReturn(BowlingPackage.Literals.LEAGUE__PLAYERS);
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
final Composite controlComposite = (Composite) composite.getChildren()[1];
table = (Table) controlComposite.getChildren()[0];
// BEGIN COMPLEX CODE
} catch (final Exception e) {
// END COMPLEX CODE
e.printStackTrace();
fail("Failed to render multi-reference table: " + e.getMessage()); //$NON-NLS-1$
}
final Button linkButton = SWTTestUtil.findControl(table.getParent().getParent(), 1, Button.class);
assertThat(linkButton.getToolTipText(), is("Create and link new Player")); //$NON-NLS-1$
}
protected Table createLeaguePlayersTable() {
final League league = BowlingFactory.eINSTANCE.createLeague();
return createLeaguePlayersTable(league);
}
protected Table createLeaguePlayersTable(final League league) {
final EditingDomain domain = new AdapterFactoryEditingDomain(
new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE), new BasicCommandStack());
final Resource bowling = domain.getResourceSet().createResource(URI.createURI("foo.ecore")); //$NON-NLS-1$
bowling.getContents().add(league);
final IObservableList<?> observableList = EMFEditProperties
.list(domain, BowlingPackage.Literals.LEAGUE__PLAYERS).observe(league);
Table result = null;
try {
// Re-stub the domain model as our league
when(renderer.getViewModelContext().getDomainModel()).thenReturn(league);
// reset(databindingService);
when(databindingService.getObservableList(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableList);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class)))
.thenReturn(observableValue);
when(observableValue.getObserved()).thenReturn(league);
when(observableValue.getValueType()).thenReturn(BowlingPackage.Literals.LEAGUE__PLAYERS);
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
final Composite controlComposite = (Composite) composite.getChildren()[1];
result = (Table) controlComposite.getChildren()[0];
// BEGIN COMPLEX CODE
} catch (final Exception e) {
// END COMPLEX CODE
e.printStackTrace();
fail("Failed to render multi-reference table: " + e.getMessage()); //$NON-NLS-1$
}
return result;
}
protected Composite createFanVisitedTournaments() {
final EditingDomain domain = new AdapterFactoryEditingDomain(
new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE), new BasicCommandStack());
final Resource bowling = domain.getResourceSet().createResource(URI.createURI("foo.ecore")); //$NON-NLS-1$
final Fan fan = BowlingFactory.eINSTANCE.createFan();
bowling.getContents().add(fan);
@SuppressWarnings("unchecked")
final IObservableList<?> observableList = EMFEditProperties
.list(domain, BowlingPackage.Literals.FAN__VISITED_TOURNAMENTS).observe(fan);
try {
// Re-stub the domain model as our league
when(renderer.getViewModelContext().getDomainModel()).thenReturn(fan);
when(databindingService.getObservableList(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableList);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class)))
.thenReturn(observableValue);
when(observableValue.getObserved()).thenReturn(fan);
when(observableValue.getValueType()).thenReturn(BowlingPackage.Literals.FAN__VISITED_TOURNAMENTS);
renderer.init();
return (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
// BEGIN COMPLEX CODE
} catch (final Exception e) {
// END COMPLEX CODE
e.printStackTrace();
fail("Failed to render multi-reference table: " + e.getMessage()); //$NON-NLS-1$
return null; // Cannot happen but is necessary for Java to be happy
}
}
/**
* Test that the control is disabled when it's set to read only.
*
* @throws DatabindingFailedException
* @throws NoRendererFoundException
* @throws NoPropertyDescriptorFoundExeption
*/
@Test
public void testReadOnlyNotDisablesControl()
throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
showMoveButtons = true;
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(true);
when(renderer.getVElement().isEffectivelyEnabled()).thenReturn(true);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableValue);
when(observableValue.getObserved()).thenReturn(mock(EObject.class));
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
renderer.finalizeRendering(shell);
// only buttons shall be not visible
// main composite shall still be enabled
assertTrue(composite.isEnabled());
}
/**
* Test that the control and buttons are visible when it's not read only.
*
* @throws DatabindingFailedException
* @throws NoRendererFoundException
* @throws NoPropertyDescriptorFoundExeption
*/
@Test
public void testNotReadOnlyButtonsVisibility()
throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
showMoveButtons = true;
when(renderer.getVElement().isReadonly()).thenReturn(false);
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(false);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableValue);
when(observableValue.getObserved()).thenReturn(mock(EObject.class));
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
renderer.finalizeRendering(shell);
checkButton(composite, UUID_UP, true, false);
checkButton(composite, UUID_DOWN, true, false);
checkButton(composite, UUID_DELETE, true, false);
checkNoButton(composite, UUID_LINK);
checkNoButton(composite, UUID_ADD);
}
/**
* Test that the control is disabled when it's effectively set to read only because a parent is read only.
* Test also buttons visibility
*
* @throws DatabindingFailedException
* @throws NoRendererFoundException
* @throws NoPropertyDescriptorFoundExeption
*/
@Test
public void testEffectivelyReadOnlyDisablesControl()
throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
showMoveButtons = true;
when(renderer.getVElement().isReadonly()).thenReturn(false);
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(true);
when(renderer.getVElement().isEffectivelyEnabled()).thenReturn(true);
// Simulate control's parent that is set to readOnly
final VView parent = mock(VView.class);
when(parent.isReadonly()).thenReturn(true);
when(renderer.getVElement().eContainer()).thenReturn(parent);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableValue);
when(observableValue.getObserved()).thenReturn(mock(EObject.class));
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
renderer.finalizeRendering(shell);
// read only does not disable control, but hides button
assertTrue(composite.isEnabled());
checkButton(composite, UUID_UP, false, false);
checkButton(composite, UUID_DOWN, false, false);
checkButton(composite, UUID_DELETE, false, false);
checkNoButton(composite, UUID_LINK);
checkNoButton(composite, UUID_ADD);
}
/**
* Test that the control is disabled when VElement enablement is set to false
*
* @throws DatabindingFailedException
* @throws NoRendererFoundException
* @throws NoPropertyDescriptorFoundExeption
*/
@Test
public void testControlDisabled()
throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
showMoveButtons = true;
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(false);
when(renderer.getVElement().isEnabled()).thenReturn(false);
// Simulate control's parent that is set to readOnly
final VView parent = mock(VView.class);
when(parent.isReadonly()).thenReturn(true);
when(renderer.getVElement().eContainer()).thenReturn(parent);
final TestObservableValue observableValue = mock(TestObservableValue.class);
when(databindingService.getObservableValue(any(VDomainModelReference.class), any(EObject.class))).thenReturn(
observableValue);
when(observableValue.getObserved()).thenReturn(mock(EObject.class));
renderer.init();
final Composite composite = (Composite) renderer.render(new SWTGridCell(0, 0, renderer), shell);
renderer.finalizeRendering(shell);
assertFalse(composite.isEnabled());
checkButton(composite, UUID_UP, true, false);
checkButton(composite, UUID_DOWN, true, false);
checkNoButton(composite, UUID_LINK);
checkButton(composite, UUID_DELETE, true, false);
}
/**
* Test that the control is enabled when VElement enablement is set to true
*
* @throws DatabindingFailedException
* @throws NoRendererFoundException
* @throws NoPropertyDescriptorFoundExeption
*/
@Test
public void testControlEnabled()
throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
showMoveButtons = true;
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(false);
when(renderer.getVElement().isEffectivelyEnabled()).thenReturn(true);
when(renderer.getVElement().isEnabled()).thenReturn(true);
when(renderer.getVElement().isVisible()).thenReturn(true);
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowLinkButtonForContainmentReferences(true);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
final League league = BowlingFactory.eINSTANCE.createLeague();
createPlayers(league, "player1", "player2", "player3"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
final Table table = createLeaguePlayersTable(league);
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(false);
when(renderer.getVElement().isEffectivelyEnabled()).thenReturn(true);
/* setup rendering */
final SWTGridDescription gridDescription = renderer.getGridDescription(null);
final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
/* render */
final Control control = renderer.render(lastGridCell, shell);
renderer.finalizeRendering(shell);
SWTTestUtil.findControl(control, 0, Table.class);
// check table itself
assertTrue(table.getVisible());
assertTrue(table.isEnabled());
final Button upButton = SWTTestUtil.findControlById(control, UUID_UP, Button.class);
checkControl(upButton, true, false);
final Button deleteButton = SWTTestUtil.findControlById(control, UUID_DELETE, Button.class);
checkControl(deleteButton, true, false);
final IObservableList<?> list = databindingService.getObservableList(null, league);
renderer.getTableViewer().setSelection(new StructuredSelection(list.get(0)), true);
SWTTestUtil.waitForUIThread();
// up may be false, as first element is selected (not yet implemented)
checkControl(upButton, true, false);
checkControl(deleteButton, true, true);
renderer.getTableViewer().setSelection(new StructuredSelection(list.get(1)), true);
SWTTestUtil.waitForUIThread();
// up may be false, as first element is selected (not yet implemented)
checkControl(upButton, true, true);
checkControl(deleteButton, true, true);
}
private void createPlayers(League league, String... names) {
for (final String name : names) {
final Player p = BowlingFactory.eINSTANCE.createPlayer();
p.setName(name);
league.getPlayers().add(p);
}
}
/**
* By default, the 'create and link new' button should be shown for cross references (legacy behavior).
*/
@Test
public void createAndLinkButton_crossRefNoReferenceStyle() {
final Composite rendered = createFanVisitedTournaments();
final Button linkButton = SWTTestUtil.findControl(rendered, 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Tournament")); //$NON-NLS-1$
final Button createButton = SWTTestUtil.findControl(rendered, 1, Button.class);
assertThat(createButton.getToolTipText(), is("Create and link new Tournament")); //$NON-NLS-1$
final Button deleteButton = SWTTestUtil.findControl(rendered, 2, Button.class);
assertThat(deleteButton.getToolTipText(), is("Delete")); //$NON-NLS-1$
}
@Test
public void createAndLinkButton_crossRefReferenceStyleTrue() {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowCreateAndLinkButtonForCrossReferences(true);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
final Composite rendered = createFanVisitedTournaments();
final Button linkButton = SWTTestUtil.findControl(rendered, 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Tournament")); //$NON-NLS-1$
final Button createButton = SWTTestUtil.findControl(rendered, 1, Button.class);
assertThat(createButton.getToolTipText(), is("Create and link new Tournament")); //$NON-NLS-1$
final Button deleteButton = SWTTestUtil.findControl(rendered, 2, Button.class);
assertThat(deleteButton.getToolTipText(), is("Delete")); //$NON-NLS-1$
}
@Test
public void createAndLinkButton_crossRefReferenceStyleFalse() {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowCreateAndLinkButtonForCrossReferences(false);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
final Composite rendered = createFanVisitedTournaments();
final Button linkButton = SWTTestUtil.findControl(rendered, 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Tournament")); //$NON-NLS-1$
final Button deleteButton = SWTTestUtil.findControl(rendered, 1, Button.class);
assertThat(deleteButton.getToolTipText(), is("Delete")); //$NON-NLS-1$
try {
SWTTestUtil.findControl(rendered, 2, Button.class);
fail(
"There must not be a third button for a non-containment reference with disabled 'create and link' button."); //$NON-NLS-1$
} catch (final NoSuchElementException ex) {
// This is what we expect => Test is successful
// Cannot use expected in @Test annotation because the test must not succeed if the link or the delete
// button are not found.
}
}
/**
* For a containment ref the 'create and link' must still be shown even if the reference style property is set to
* false.
*/
@Test
public void createAndLinkButton_containmentRefReferenceStyleFalse() {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowCreateAndLinkButtonForCrossReferences(false);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
final Composite rendered = createLeaguePlayersTable().getParent().getParent();
final Button linkButton = SWTTestUtil.findControl(rendered, 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Player")); //$NON-NLS-1$
final Button createButton = SWTTestUtil.findControl(rendered, 1, Button.class);
assertThat(createButton.getToolTipText(), is("Create and link new Player")); //$NON-NLS-1$
final Button deleteButton = SWTTestUtil.findControl(rendered, 2, Button.class);
assertThat(deleteButton.getToolTipText(), is("Delete")); //$NON-NLS-1$
}
/**
* For a cross ref the 'link' button must still be shown even if the reference style property is set to false.
*/
@Test
public void linkButton_crossRefReferenceStyleFalse() {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowLinkButtonForContainmentReferences(false);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
final Composite rendered = createFanVisitedTournaments();
final Button linkButton = SWTTestUtil.findControl(rendered, 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Tournament")); //$NON-NLS-1$
final Button createButton = SWTTestUtil.findControl(rendered, 1, Button.class);
assertThat(createButton.getToolTipText(), is("Create and link new Tournament")); //$NON-NLS-1$
final Button deleteButton = SWTTestUtil.findControl(rendered, 2, Button.class);
assertThat(deleteButton.getToolTipText(), is("Delete")); //$NON-NLS-1$
}
/**
* By default, the 'link new' button must be shown for containment references (legacy behavior).
*/
@Test
public void linkButton_containmentRefNoReferenceStyle() {
final Composite rendered = createLeaguePlayersTable().getParent().getParent();
final Button linkButton = SWTTestUtil.findControl(rendered, 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Player")); //$NON-NLS-1$
final Button createButton = SWTTestUtil.findControl(rendered, 1, Button.class);
assertThat(createButton.getToolTipText(), is("Create and link new Player")); //$NON-NLS-1$
final Button deleteButton = SWTTestUtil.findControl(rendered, 2, Button.class);
assertThat(deleteButton.getToolTipText(), is("Delete")); //$NON-NLS-1$
}
@Test
public void linkButton_containmentRefReferenceStyleTrue() {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowLinkButtonForContainmentReferences(true);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
final Composite rendered = createLeaguePlayersTable().getParent().getParent();
final Button linkButton = SWTTestUtil.findControl(rendered, 0, Button.class);
assertThat(linkButton.getToolTipText(), is("Link Player")); //$NON-NLS-1$
final Button createButton = SWTTestUtil.findControl(rendered, 1, Button.class);
assertThat(createButton.getToolTipText(), is("Create and link new Player")); //$NON-NLS-1$
final Button deleteButton = SWTTestUtil.findControl(rendered, 2, Button.class);
assertThat(deleteButton.getToolTipText(), is("Delete")); //$NON-NLS-1$
}
@Test
public void linkButton_containmentRefReferenceStyleFalse() {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowLinkButtonForContainmentReferences(false);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
final Composite rendered = createLeaguePlayersTable().getParent().getParent();
final Button createButton = SWTTestUtil.findControl(rendered, 0, Button.class);
assertThat(createButton.getToolTipText(), is("Create and link new Player")); //$NON-NLS-1$
final Button deleteButton = SWTTestUtil.findControl(rendered, 1, Button.class);
assertThat(deleteButton.getToolTipText(), is("Delete")); //$NON-NLS-1$ NON-NLS-1$
try {
SWTTestUtil.findControl(rendered, 2, Button.class);
fail(
"There must not be a third button for a containment reference with disabled 'link' button."); //$NON-NLS-1$
} catch (final NoSuchElementException ex) {
// This is what we expect => Test is successful
// Cannot use expected in @Test annotation because the test must not succeed if the 'create and link' or the
// delete button are not found.
}
}
@Test
public void compare()
throws NoRendererFoundException, NoPropertyDescriptorFoundExeption, DatabindingFailedException {
showMoveButtons = false;
// Label: Player a2
final Player p1 = BowlingFactory.eINSTANCE.createPlayer();
p1.setName("a2"); //$NON-NLS-1$
// Label: Player a10
final Player p2 = BowlingFactory.eINSTANCE.createPlayer();
p2.setName("a10a"); //$NON-NLS-1$
// Label: Player a10a
final Player p3 = BowlingFactory.eINSTANCE.createPlayer();
p3.setName("a10"); //$NON-NLS-1$
final League league = BowlingFactory.eINSTANCE.createLeague();
league.getPlayers().add(p1);
league.getPlayers().add(p2);
league.getPlayers().add(p3);
final Table playersTable = createLeaguePlayersTable(league);
// Initially, items should be sorted by insertion order
assertEquals(SWT.NONE, playersTable.getSortDirection());
assertItemOrder(playersTable, p1, p2, p3);
SWTTestUtil.selectWidget(playersTable.getColumn(0));
SWTTestUtil.waitForUIThread();
// ascending
assertEquals(SWT.UP, playersTable.getSortDirection());
assertItemOrder(playersTable, p1, p3, p2);
SWTTestUtil.selectWidget(playersTable.getColumn(0));
SWTTestUtil.waitForUIThread();
// descending
assertEquals(SWT.DOWN, playersTable.getSortDirection());
assertItemOrder(playersTable, p2, p3, p1);
SWTTestUtil.selectWidget(playersTable.getColumn(0));
SWTTestUtil.waitForUIThread();
// insertion order again
assertEquals(SWT.NONE, playersTable.getSortDirection());
assertItemOrder(playersTable, p1, p2, p3);
}
private static void assertItemOrder(Table table, Object... objects) {
assertEquals(objects.length, table.getItemCount());
final TableItem[] items = table.getItems();
for (int i = 0; i < items.length; i++) {
assertSame(objects[i], items[i].getData());
}
}
@Test
public void testVisibleOnWritable()
throws NoRendererFoundException, NoPropertyDescriptorFoundExeption, DatabindingFailedException {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowLinkButtonForContainmentReferences(true);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
createLeaguePlayersTable();
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(false);
when(renderer.getVElement().isEffectivelyEnabled()).thenReturn(true);
/* setup rendering */
final SWTGridDescription gridDescription = renderer.getGridDescription(null);
final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
/* render */
final Control control = renderer.render(lastGridCell, shell);
renderer.finalizeRendering(shell);
final Button upButton = SWTTestUtil.findControl(control, 0, Button.class);
final Table table = SWTTestUtil.findControl(control, 0, Table.class);
// check table itself
assertTrue(table.getVisible());
assertTrue(table.isEnabled());
assertTrue(upButton.getEnabled());
}
@Test
public void testActivateOnEnable()
throws NoRendererFoundException, NoPropertyDescriptorFoundExeption, DatabindingFailedException {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowLinkButtonForContainmentReferences(true);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
createLeaguePlayersTable();
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(false);
when(renderer.getVElement().isEffectivelyEnabled()).thenReturn(true);
/* setup rendering */
final SWTGridDescription gridDescription = renderer.getGridDescription(null);
final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
/* render */
final Control control = renderer.render(lastGridCell, shell);
renderer.finalizeRendering(shell);
final Button upButton = SWTTestUtil.findControl(control, 0, Button.class);
final Table table = SWTTestUtil.findControl(control, 0, Table.class);
// check table itself
assertTrue(table.isEnabled());
checkControl(upButton, true, true);
assertTrue(upButton.getParent().getVisible());
}
@Test
public void testButtonsNotVisibleOnReadOnly()
throws NoRendererFoundException, NoPropertyDescriptorFoundExeption, DatabindingFailedException {
final VTReferenceStyleProperty property = VTReferenceFactory.eINSTANCE.createReferenceStyleProperty();
property.setShowLinkButtonForContainmentReferences(true);
when(templateProvider.getStyleProperties(any(VElement.class), any(ViewModelContext.class)))
.thenReturn(Collections.<VTStyleProperty> singleton(property));
createLeaguePlayersTable();
when(renderer.getVElement().isEffectivelyReadonly()).thenReturn(true);
when(renderer.getVElement().isEffectivelyEnabled()).thenReturn(true);
/* setup rendering */
final SWTGridDescription gridDescription = renderer.getGridDescription(null);
final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
/* render */
final Control control = renderer.render(lastGridCell, shell);
renderer.finalizeRendering(shell);
final Button upButton = SWTTestUtil.findControl(control, 0, Button.class);
/* by default, up is disabled (no selection) */
assertFalse(upButton.getVisible());
}
/**
* Helper Interface for mocking.
*
* @author Eugen Neufeld
*
*/
public interface TestObservableValue extends IObservableValue, IObserving {
}
private void checkButton(Composite root, String elementId, boolean visible, boolean enabled) {
final Button button = SWTTestUtil.findControlById(root, elementId, Button.class);
checkControl(button, visible, enabled);
}
private void checkNoButton(Composite root, String elementId) {
final Button button = SWTTestUtil.findControlById(root, elementId, Button.class);
assertThat(button, nullValue());
}
private void checkControl(Control control, boolean visible, boolean enabled) {
assertThat(control, notNullValue());
assertThat(control.getVisible(), is(visible));
// no selection
assertThat(control.getEnabled(), is(enabled));
}
}