Skip to content

Package: MultiSegmentChildDmrsSWTRenderer_PTest

MultiSegmentChildDmrsSWTRenderer_PTest

nameinstructionbranchcomplexitylinemethod
MultiSegmentChildDmrsSWTRenderer_PTest()
M: 0 C: 3
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
assertTableItemOrder(Table, Object[])
M: 0 C: 27
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
createFeatureSegmentInDmr(VDomainModelReference, String)
M: 0 C: 13
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
dnd()
M: 0 C: 198
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 39
100%
M: 0 C: 1
100%
domainChange()
M: 0 C: 138
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 31
100%
M: 0 C: 1
100%
render()
M: 0 C: 170
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 38
100%
M: 0 C: 1
100%
setUp()
M: 0 C: 259
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 49
100%
M: 0 C: 1
100%
sort()
M: 0 C: 222
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 41
100%
M: 0 C: 1
100%
tearDown()
M: 0 C: 14
100%
M: 2 C: 2
50%
M: 2 C: 1
33%
M: 0 C: 4
100%
M: 0 C: 1
100%

Coverage

1: /*******************************************************************************
2: * Copyright (c) 2011-2019 EclipseSource Muenchen GmbH and others.
3: *
4: * All rights reserved. This program and the accompanying materials
5: * are made available under the terms of the Eclipse Public License 2.0
6: * which accompanies this distribution, and is available at
7: * https://www.eclipse.org/legal/epl-2.0/
8: *
9: * SPDX-License-Identifier: EPL-2.0
10: *
11: * Contributors:
12: * Lucas Koehler - initial API and implementation
13: ******************************************************************************/
14: package org.eclipse.emfforms.internal.view.multisegment.tooling;
15:
16: import static org.junit.Assert.assertEquals;
17: import static org.junit.Assert.assertFalse;
18: import static org.junit.Assert.assertSame;
19: import static org.junit.Assert.assertTrue;
20: import static org.mockito.Matchers.any;
21: import static org.mockito.Matchers.eq;
22: import static org.mockito.Matchers.same;
23: import static org.mockito.Mockito.mock;
24: import static org.mockito.Mockito.when;
25:
26: import org.eclipse.core.databinding.observable.IObserving;
27: import org.eclipse.core.databinding.observable.Observables;
28: import org.eclipse.core.databinding.observable.list.IObservableList;
29: import org.eclipse.core.databinding.observable.value.IObservableValue;
30: import org.eclipse.core.databinding.property.value.IValueProperty;
31: import org.eclipse.emf.common.command.BasicCommandStack;
32: import org.eclipse.emf.common.notify.AdapterFactory;
33: import org.eclipse.emf.common.util.URI;
34: import org.eclipse.emf.databinding.edit.EMFEditProperties;
35: import org.eclipse.emf.databinding.edit.IEMFEditListProperty;
36: import org.eclipse.emf.ecore.EcorePackage;
37: import org.eclipse.emf.ecore.resource.Resource;
38: import org.eclipse.emf.ecore.resource.ResourceSet;
39: import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
40: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
41: import org.eclipse.emf.ecp.view.spi.model.VControl;
42: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
43: import org.eclipse.emf.ecp.view.spi.model.VFeatureDomainModelReferenceSegment;
44: import org.eclipse.emf.ecp.view.spi.model.VView;
45: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
46: import org.eclipse.emf.ecp.view.spi.model.VViewPackage;
47: import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
48: import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
49: import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
50: import org.eclipse.emf.ecp.view.spi.table.model.VTableFactory;
51: import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
52: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
53: import org.eclipse.emf.ecp.view.test.common.swt.spi.DatabindingClassRunner;
54: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTTestUtil;
55: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTViewTestHelper;
56: import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
57: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
58: import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
59: import org.eclipse.emfforms.spi.common.report.ReportService;
60: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
61: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
62: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
63: import org.eclipse.emfforms.spi.core.services.label.NoLabelFoundException;
64: import org.eclipse.emfforms.spi.localization.EMFFormsLocalizationService;
65: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
66: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
67: import org.eclipse.emfforms.view.spi.multisegment.model.VMultiDomainModelReferenceSegment;
68: import org.eclipse.emfforms.view.spi.multisegment.model.VMultisegmentFactory;
69: import org.eclipse.emfforms.view.spi.multisegment.model.VMultisegmentPackage;
70: import org.eclipse.swt.widgets.Button;
71: import org.eclipse.swt.widgets.Composite;
72: import org.eclipse.swt.widgets.Control;
73: import org.eclipse.swt.widgets.Shell;
74: import org.eclipse.swt.widgets.Table;
75: import org.eclipse.swt.widgets.TableColumn;
76: import org.eclipse.swt.widgets.TableItem;
77: import org.eclipse.swtbot.swt.finder.SWTBot;
78: import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
79: import org.eclipse.swtbot.swt.finder.widgets.SWTBotTableItem;
80: import org.junit.After;
81: import org.junit.Before;
82: import org.junit.Test;
83: import org.junit.runner.RunWith;
84: import org.osgi.framework.Bundle;
85:
86: /**
87: * Tests for {@link MultiSegmentChildDmrsSWTRenderer}.
88: *
89: * @author Lucas Koehler
90: *
91: */
92: @RunWith(DatabindingClassRunner.class)
93: public class MultiSegmentChildDmrsSWTRenderer_PTest {
94:
95:         private static final String TEST_DESCRIPTION = "Test-Description"; //$NON-NLS-1$
96:         private static final String TEST_NAME = "Test-Name"; //$NON-NLS-1$
97:         private VView view;
98:         private VTableControl domainObject;
99:         private ViewModelContext context;
100:         private ReportService reportService;
101:         private EMFFormsDatabinding databinding;
102:         private EMFFormsLabelProvider labelProvider;
103:         private MultiSegmentChildDmrsSWTRenderer renderer;
104:         /** The dmr of the domain object which contains the multi segment. */
105:         private VDomainModelReference multiDmr;
106:         private Shell shell;
107:
108:         @Before
109:         public void setUp() throws DatabindingFailedException, NoLabelFoundException {
110:                 // Create view model for the renderer's view model context
111:                 view = VViewFactory.eINSTANCE.createView();
112:                 final VControl control = VViewFactory.eINSTANCE.createControl();
113:                 final VDomainModelReference dmr = VViewFactory.eINSTANCE.createDomainModelReference();
114:                 createFeatureSegmentInDmr(dmr, VViewPackage.Literals.CONTROL__DOMAIN_MODEL_REFERENCE.getName());
115:                 control.setDomainModelReference(dmr);
116:                 view.getChildren().add(control);
117:
118:                 // Configure table control for which child dmrs are rendered
119:                 final VView domainView = VViewFactory.eINSTANCE.createView();
120:                 domainView.setRootEClass(EcorePackage.Literals.ECLASS);
121:                 domainObject = VTableFactory.eINSTANCE.createTableControl();
122:                 domainView.getChildren().add(domainObject);
123:                 multiDmr = VViewFactory.eINSTANCE.createDomainModelReference();
124:                 domainObject.setDomainModelReference(multiDmr);
125:
126:                 // Add the domainObject object to a resource with editing domainObject
127:                 final ResourceSet rs = new ResourceSetImpl();
128:                 final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(new AdapterFactory[] {
129:                         new ReflectiveItemProviderAdapterFactory(),
130:                         new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) });
131:                 final AdapterFactoryEditingDomain editingDomain = new AdapterFactoryEditingDomain(
132:                         adapterFactory, new BasicCommandStack(), rs);
133:                 rs.eAdapters().add(new AdapterFactoryEditingDomain.EditingDomainProvider(editingDomain));
134:                 final Resource resource = rs.createResource(URI.createURI("VIRTUAL_URI")); //$NON-NLS-1$
135:                 resource.getContents().add(domainObject);
136:
137:                 context = mock(ViewModelContext.class);
138:                 when(context.getDomainModel()).thenReturn(domainObject);
139:                 when(context.getViewModel()).thenReturn(domainView);
140:
141:                 reportService = mock(ReportService.class);
142:                 databinding = mock(EMFFormsDatabinding.class);
143:                 labelProvider = mock(EMFFormsLabelProvider.class);
144:
145:                 // mock basic databinding
146:                 final IValueProperty<?, ?> valueProperty = mock(IValueProperty.class);
147:                 when(valueProperty.getValueType()).thenReturn(VViewPackage.Literals.CONTROL__DOMAIN_MODEL_REFERENCE);
148:                 when(databinding.getValueProperty(dmr, domainObject)).thenReturn(valueProperty);
149:                 final TestObservableValue observableValue = mock(TestObservableValue.class);
150:                 when(databinding.getObservableValue(dmr, domainObject)).thenReturn(observableValue);
151:                 when(observableValue.getObserved()).thenReturn(domainObject);
152:                 when(observableValue.getValueType()).thenReturn(VViewPackage.Literals.CONTROL__DOMAIN_MODEL_REFERENCE);
153:
154:                 // mock label provider for table column header and tooltip
155:                 when(labelProvider.getDisplayName(dmr, domainObject))
156:                         .thenReturn(Observables.constantObservableValue(TEST_NAME));
157:                 when(labelProvider.getDescription(dmr, domainObject))
158:                         .thenReturn(Observables.constantObservableValue(TEST_DESCRIPTION));
159:
160:                 // mock localization service
161:                 final EMFFormsLocalizationService localizationService = mock(EMFFormsLocalizationService.class);
162:                 when(localizationService.getString(any(Bundle.class), eq("_UI_DomainModelReference_type"))) //$NON-NLS-1$
163:                         .thenReturn("Domain Model Reference"); //$NON-NLS-1$
164:
165:                 renderer = new MultiSegmentChildDmrsSWTRenderer(control, context, reportService, databinding,
166:                         labelProvider, mock(VTViewTemplateProvider.class), mock(ImageRegistryService.class),
167:                         localizationService);
168:                 renderer.init();
169:                 renderer.getGridDescription(new SWTGridDescription());
170:
171:                 shell = SWTViewTestHelper.createShell();
172:                 shell.open();
173:         }
174:
175:         @After
176:         public void tearDown() {
177:•                if (shell != null && !shell.isDisposed()) {
178:                         shell.dispose();
179:                         shell = null;
180:                 }
181:         }
182:
183:         /**
184:          * Tests that the table and buttons are rendererd correctly and that removing a dmr from the table works.
185:          *
186:          * @throws DatabindingFailedException
187:          * @throws NoRendererFoundException
188:          * @throws NoPropertyDescriptorFoundExeption
189:          */
190:         @Test
191:         public void render()
192:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
193:                 final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
194:                         .createMultiDomainModelReferenceSegment();
195:                 multiSegment.setDomainModelFeature(EcorePackage.Literals.ECLASS__ESTRUCTURAL_FEATURES.getName());
196:                 multiDmr.getSegments().add(multiSegment);
197:
198:                 final VDomainModelReference childDmr0 = VViewFactory.eINSTANCE.createDomainModelReference();
199:                 createFeatureSegmentInDmr(childDmr0, "name"); //$NON-NLS-1$
200:                 multiSegment.getChildDomainModelReferences().add(childDmr0);
201:
202:                 final IEMFEditListProperty listProperty = EMFEditProperties.list(
203:                         AdapterFactoryEditingDomain.getEditingDomainFor(domainObject),
204:                         VMultisegmentPackage.Literals.MULTI_DOMAIN_MODEL_REFERENCE_SEGMENT__CHILD_DOMAIN_MODEL_REFERENCES);
205:                 @SuppressWarnings("unchecked")
206:                 final IObservableList<?> childObservable = listProperty.observe(multiSegment);
207:                 when(databinding.getObservableList(any(VDomainModelReference.class), same(multiSegment)))
208:                         .thenReturn(childObservable);
209:
210:                 final Control render = renderer.render(new SWTGridCell(0, 2, renderer), shell);
211:                 renderer.finalizeRendering(shell);
212:
213:                 assertTrue(render instanceof Composite);
214:                 final Button moveUp = SWTTestUtil.findControl(render, 0, Button.class);
215:                 assertEquals("Move Up", moveUp.getToolTipText()); //$NON-NLS-1$
216:                 final Button moveDown = SWTTestUtil.findControl(render, 1, Button.class);
217:                 assertEquals("Move Down", moveDown.getToolTipText()); //$NON-NLS-1$
218:                 final Button add = SWTTestUtil.findControl(render, 2, Button.class);
219:                 assertEquals("Create and link new Domain Model Reference", add.getToolTipText()); //$NON-NLS-1$
220:                 final Button delete = SWTTestUtil.findControl(render, 3, Button.class);
221:                 assertEquals("Delete", delete.getToolTipText()); //$NON-NLS-1$
222:                 final Button sort = SWTTestUtil.findControl(render, 4, Button.class);
223:                 assertEquals("Sort", sort.getText()); //$NON-NLS-1$
224:
225:                 final Table dmrTable = SWTTestUtil.findControl(render, 0, Table.class);
226:                 assertEquals("Table column count", 1, dmrTable.getColumnCount()); //$NON-NLS-1$
227:
228:                 final TableColumn dmrColumn = dmrTable.getColumn(0);
229:                 assertEquals(TEST_NAME, dmrColumn.getText());
230:                 assertEquals(TEST_DESCRIPTION, dmrColumn.getToolTipText());
231:
232:                 assertEquals("Number of shown existing child DMRs.", 1, dmrTable.getItemCount()); //$NON-NLS-1$
233:
234:                 // Test remove
235:                 SWTTestUtil.selectTableItem(dmrTable, 0);
236:                 SWTTestUtil.clickButton(delete);
237:                 assertEquals("Number of child DMRs in the multi segment after remove.", 0, //$NON-NLS-1$
238:                         multiSegment.getChildDomainModelReferences().size());
239:                 assertEquals("Number of shown existing child DMRs after remove.", 0, dmrTable.getItemCount()); //$NON-NLS-1$
240:         }
241:
242:         private VFeatureDomainModelReferenceSegment createFeatureSegmentInDmr(final VDomainModelReference dmr,
243:                 String featureName) {
244:                 final VFeatureDomainModelReferenceSegment childDmr0Segment = VViewFactory.eINSTANCE
245:                         .createFeatureDomainModelReferenceSegment();
246:                 childDmr0Segment.setDomainModelFeature(featureName);
247:                 dmr.getSegments().add(childDmr0Segment);
248:                 return childDmr0Segment;
249:         }
250:
251:         /**
252:          * First renders for a table control with an empty dmr. Then replaces the dmr with one that has a multi segment with
253:          * a child dmr and checks that the table is updated correctly.
254:          *
255:          * @throws DatabindingFailedException
256:          * @throws NoPropertyDescriptorFoundExeption
257:          * @throws NoRendererFoundException
258:          */
259:         @Test
260:         public void domainChange()
261:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
262:
263:                 final VDomainModelReference dmrWithChildren = VViewFactory.eINSTANCE.createDomainModelReference();
264:                 final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
265:                         .createMultiDomainModelReferenceSegment();
266:                 multiSegment.setDomainModelFeature(EcorePackage.Literals.ECLASS__ESTRUCTURAL_FEATURES.getName());
267:                 final VDomainModelReference childDmr0 = VViewFactory.eINSTANCE.createDomainModelReference();
268:                 createFeatureSegmentInDmr(childDmr0, "name"); //$NON-NLS-1$
269:                 multiSegment.getChildDomainModelReferences().add(childDmr0);
270:                 dmrWithChildren.getSegments().add(multiSegment);
271:
272:                 final IEMFEditListProperty listProperty = EMFEditProperties.list(
273:                         AdapterFactoryEditingDomain.getEditingDomainFor(domainObject),
274:                         VMultisegmentPackage.Literals.MULTI_DOMAIN_MODEL_REFERENCE_SEGMENT__CHILD_DOMAIN_MODEL_REFERENCES);
275:                 @SuppressWarnings("unchecked")
276:                 final IObservableList<?> childObservable = listProperty.observe(multiSegment);
277:                 when(databinding.getObservableList(any(VDomainModelReference.class), same(multiSegment)))
278:                         .thenReturn(childObservable);
279:
280:                 final Control render = renderer.render(new SWTGridCell(0, 2, renderer), shell);
281:                 renderer.finalizeRendering(shell);
282:                 final Button add = SWTTestUtil.findControl(render, 2, Button.class);
283:                 final Button sort = SWTTestUtil.findControl(render, 4, Button.class);
284:
285:                 final Table dmrTable = SWTTestUtil.findControl(render, 0, Table.class);
286:                 assertEquals("Table column count", 1, dmrTable.getColumnCount()); //$NON-NLS-1$
287:
288:                 final TableColumn dmrColumn = dmrTable.getColumn(0);
289:                 assertEquals(TEST_NAME, dmrColumn.getText());
290:                 assertEquals(TEST_DESCRIPTION, dmrColumn.getToolTipText());
291:
292:                 assertEquals("Number of shown child DMRs with empty dmr.", 0, dmrTable.getItemCount()); //$NON-NLS-1$
293:                 assertFalse("Add button should not be enabled if there is no multi segment", add.isEnabled()); //$NON-NLS-1$
294:                 assertFalse("Sort button should not be enabled if there is no multi segment", sort.isEnabled()); //$NON-NLS-1$
295:
296:                 // Change dmr of tableControl => child dmr should be shown
297:                 domainObject.setDomainModelReference(dmrWithChildren);
298:                 assertEquals("Number of shown child DMRs for dmr with child.", 1, dmrTable.getItemCount()); //$NON-NLS-1$
299:                 assertTrue("Add button must be enabled if there is a multi segment", add.isEnabled()); //$NON-NLS-1$
300:                 assertTrue("Sort button must be enabled if there is a multi segment", sort.isEnabled()); //$NON-NLS-1$
301:         }
302:
303:         /**
304:          * Tests the 'Sort' button It's supposed to actually sort the DMRs in the multi segment.
305:          *
306:          * @throws DatabindingFailedException
307:          * @throws NoPropertyDescriptorFoundExeption
308:          * @throws NoRendererFoundException
309:          */
310:         @Test
311:         public void sort() throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
312:                 final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
313:                         .createMultiDomainModelReferenceSegment();
314:                 multiSegment.setDomainModelFeature(EcorePackage.Literals.ECLASS__ESTRUCTURAL_FEATURES.getName());
315:                 final VDomainModelReference childDmr0 = VViewFactory.eINSTANCE.createDomainModelReference();
316:                 createFeatureSegmentInDmr(childDmr0, "name"); //$NON-NLS-1$
317:                 final VDomainModelReference childDmr1 = VViewFactory.eINSTANCE.createDomainModelReference();
318:                 createFeatureSegmentInDmr(childDmr1, "changeable"); //$NON-NLS-1$
319:                 final VDomainModelReference childDmr2 = VViewFactory.eINSTANCE.createDomainModelReference();
320:                 createFeatureSegmentInDmr(childDmr2, "derived"); //$NON-NLS-1$
321:                 multiSegment.getChildDomainModelReferences().add(childDmr0);
322:                 multiSegment.getChildDomainModelReferences().add(childDmr1);
323:                 multiSegment.getChildDomainModelReferences().add(childDmr2);
324:                 multiDmr.getSegments().add(multiSegment);
325:
326:                 final IEMFEditListProperty listProperty = EMFEditProperties.list(
327:                         AdapterFactoryEditingDomain.getEditingDomainFor(domainObject),
328:                         VMultisegmentPackage.Literals.MULTI_DOMAIN_MODEL_REFERENCE_SEGMENT__CHILD_DOMAIN_MODEL_REFERENCES);
329:                 @SuppressWarnings("unchecked")
330:                 final IObservableList<?> childObservable = listProperty.observe(multiSegment);
331:                 when(databinding.getObservableList(any(VDomainModelReference.class), same(multiSegment)))
332:                         .thenReturn(childObservable);
333:
334:                 final Control render = renderer.render(new SWTGridCell(0, 2, renderer), shell);
335:                 renderer.finalizeRendering(shell);
336:
337:                 final Table dmrTable = SWTTestUtil.findControl(render, 0, Table.class);
338:                 assertEquals("Table column count", 1, dmrTable.getColumnCount()); //$NON-NLS-1$
339:
340:                 final TableColumn dmrColumn = dmrTable.getColumn(0);
341:                 assertEquals(TEST_NAME, dmrColumn.getText());
342:                 assertEquals(TEST_DESCRIPTION, dmrColumn.getToolTipText());
343:
344:                 assertEquals("Number of shown child DMRs", 3, dmrTable.getItemCount()); //$NON-NLS-1$
345:                 // After rendering items are sorted by insertion
346:                 assertTableItemOrder(dmrTable, childDmr0, childDmr1, childDmr2);
347:
348:                 final Button sort = SWTTestUtil.findControl(render, 4, Button.class);
349:                 assertEquals("Sort", sort.getText()); //$NON-NLS-1$
350:
351:                 // clicking the button once should sort ascending in the table and the multi segment
352:                 SWTTestUtil.clickButton(sort);
353:                 assertTableItemOrder(dmrTable, childDmr1, childDmr2, childDmr0);
354:                 assertSame(childDmr1, multiSegment.getChildDomainModelReferences().get(0));
355:                 assertSame(childDmr2, multiSegment.getChildDomainModelReferences().get(1));
356:                 assertSame(childDmr0, multiSegment.getChildDomainModelReferences().get(2));
357:
358:                 // clicking the button a second time should sort descending in the table and the multi segment
359:                 SWTTestUtil.clickButton(sort);
360:                 assertTableItemOrder(dmrTable, childDmr0, childDmr2, childDmr1);
361:                 assertSame(childDmr0, multiSegment.getChildDomainModelReferences().get(0));
362:                 assertSame(childDmr2, multiSegment.getChildDomainModelReferences().get(1));
363:                 assertSame(childDmr1, multiSegment.getChildDomainModelReferences().get(2));
364:         }
365:
366:         /**
367:          * Tests drag and drop to move dmrs in the table.
368:          *
369:          * @throws DatabindingFailedException
370:          * @throws NoPropertyDescriptorFoundExeption
371:          * @throws NoRendererFoundException
372:          */
373:         @Test
374:         public void dnd() throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
375:                 final VMultiDomainModelReferenceSegment multiSegment = VMultisegmentFactory.eINSTANCE
376:                         .createMultiDomainModelReferenceSegment();
377:                 multiSegment.setDomainModelFeature(EcorePackage.Literals.ECLASS__ESTRUCTURAL_FEATURES.getName());
378:                 final VDomainModelReference childDmr0 = VViewFactory.eINSTANCE.createDomainModelReference();
379:                 createFeatureSegmentInDmr(childDmr0, "name"); //$NON-NLS-1$
380:                 final VDomainModelReference childDmr1 = VViewFactory.eINSTANCE.createDomainModelReference();
381:                 createFeatureSegmentInDmr(childDmr1, "changeable"); //$NON-NLS-1$
382:                 final VDomainModelReference childDmr2 = VViewFactory.eINSTANCE.createDomainModelReference();
383:                 createFeatureSegmentInDmr(childDmr2, "derived"); //$NON-NLS-1$
384:                 multiSegment.getChildDomainModelReferences().add(childDmr0);
385:                 multiSegment.getChildDomainModelReferences().add(childDmr1);
386:                 multiSegment.getChildDomainModelReferences().add(childDmr2);
387:                 multiDmr.getSegments().add(multiSegment);
388:
389:                 final IEMFEditListProperty listProperty = EMFEditProperties.list(
390:                         AdapterFactoryEditingDomain.getEditingDomainFor(domainObject),
391:                         VMultisegmentPackage.Literals.MULTI_DOMAIN_MODEL_REFERENCE_SEGMENT__CHILD_DOMAIN_MODEL_REFERENCES);
392:                 @SuppressWarnings("unchecked")
393:                 final IObservableList<?> childObservable = listProperty.observe(multiSegment);
394:                 when(databinding.getObservableList(any(VDomainModelReference.class), same(multiSegment)))
395:                         .thenReturn(childObservable);
396:
397:                 final Control render = renderer.render(new SWTGridCell(0, 2, renderer), shell);
398:                 renderer.finalizeRendering(shell);
399:                 shell.layout(true, true);
400:                 final Table dmrTable = SWTTestUtil.findControl(render, 0, Table.class);
401:                 assertEquals("Table column count", 1, dmrTable.getColumnCount()); //$NON-NLS-1$
402:
403:                 final TableColumn dmrColumn = dmrTable.getColumn(0);
404:                 assertEquals(TEST_NAME, dmrColumn.getText());
405:                 assertEquals(TEST_DESCRIPTION, dmrColumn.getToolTipText());
406:
407:                 assertEquals("Number of shown child DMRs", 3, dmrTable.getItemCount()); //$NON-NLS-1$
408:                 // After rendering items are sorted by insertion
409:                 assertTableItemOrder(dmrTable, childDmr0, childDmr1, childDmr2);
410:
411:                 final SWTBot bot = new SWTBot(dmrTable);
412:                 final SWTBotTable botTable = bot.table();
413:                 final SWTBotTableItem item0 = botTable.getTableItem(0);
414:                 final SWTBotTableItem item2 = botTable.getTableItem(2);
415:
416:                 // Drag dmr0 onto dmr2 and verify new order in table and multi segment
417:                 item0.dragAndDrop(item2);
418:                 assertTableItemOrder(dmrTable, childDmr1, childDmr0, childDmr2);
419:                 assertSame(childDmr1, multiSegment.getChildDomainModelReferences().get(0));
420:                 assertSame(childDmr0, multiSegment.getChildDomainModelReferences().get(1));
421:                 assertSame(childDmr2, multiSegment.getChildDomainModelReferences().get(2));
422:         }
423:
424:         private static void assertTableItemOrder(Table table, Object... objects) {
425:                 assertEquals(objects.length, table.getItemCount());
426:                 final TableItem[] items = table.getItems();
427:•                for (int i = 0; i < items.length; i++) {
428:                         assertSame(objects[i], items[i].getData());
429:                 }
430:         }
431:
432:         /** Helper Interface for mocking. */
433:         public interface TestObservableValue extends IObservableValue<Object>, IObserving {
434:         }
435: }