Skip to content

Package: MultiAttributeSWTRenderer_ITest

MultiAttributeSWTRenderer_ITest

nameinstructionbranchcomplexitylinemethod
MultiAttributeSWTRenderer_ITest()
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%
addEnumValue()
M: 0 C: 123
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 33
100%
M: 0 C: 1
100%
after()
M: 0 C: 7
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
before()
M: 0 C: 129
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 28
100%
M: 0 C: 1
100%
buttonData()
M: 0 C: 87
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 21
100%
M: 0 C: 1
100%
buttonsUpDown_enableOnSelection()
M: 0 C: 126
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 27
100%
M: 0 C: 1
100%
checkControlEnablement(Control, boolean)
M: 0 C: 11
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
compactRendererDescription()
M: 0 C: 64
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 13
100%
M: 0 C: 1
100%
createBasicDomain()
M: 0 C: 59
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 14
100%
M: 0 C: 1
100%
createEditingDomain(EObject)
M: 0 C: 56
100%
M: 1 C: 1
50%
M: 1 C: 1
50%
M: 0 C: 13
100%
M: 0 C: 1
100%
createRenderer()
M: 0 C: 22
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 10
100%
M: 0 C: 1
100%
elementVisibleAfterMove()
M: 2 C: 135
99%
M: 2 C: 6
75%
M: 2 C: 3
60%
M: 0 C: 31
100%
M: 0 C: 1
100%
getVisibleRows(Table)
M: 0 C: 20
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
labelsAreDisplayedForInput()
M: 0 C: 105
100%
M: 0 C: 4
100%
M: 0 C: 3
100%
M: 0 C: 23
100%
M: 0 C: 1
100%
selectionAfterMove_Down()
M: 0 C: 105
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 25
100%
M: 0 C: 1
100%
selectionAfterMove_Up()
M: 0 C: 105
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 25
100%
M: 0 C: 1
100%
setupCompact()
M: 0 C: 28
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
testButtonRemovedOnReadOnly()
M: 0 C: 87
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 18
100%
M: 0 C: 1
100%
testButtonsDeactivateOnDisable()
M: 0 C: 69
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 15
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: * Johannes Faltermeier - initial API and implementation
13: * Christian W. Damus - bug 543348
14: ******************************************************************************/
15: package org.eclipse.emfforms.spi.view.control.multiattribute;
16:
17: import static org.hamcrest.CoreMatchers.hasItem;
18: import static org.hamcrest.CoreMatchers.is;
19: import static org.hamcrest.MatcherAssert.assertThat;
20: import static org.hamcrest.Matchers.equalTo;
21: import static org.hamcrest.Matchers.notNullValue;
22: import static org.hamcrest.Matchers.nullValue;
23: import static org.junit.Assert.assertEquals;
24: import static org.junit.Assert.assertFalse;
25: import static org.junit.Assert.assertNotNull;
26: import static org.junit.Assert.assertTrue;
27: import static org.mockito.Matchers.any;
28: import static org.mockito.Mockito.mock;
29: import static org.mockito.Mockito.when;
30:
31: import java.io.Serializable;
32: import java.util.HashSet;
33: import java.util.Set;
34:
35: import org.eclipse.core.databinding.observable.Observables;
36: import org.eclipse.core.databinding.observable.list.IObservableList;
37: import org.eclipse.core.databinding.observable.value.IObservableValue;
38: import org.eclipse.core.databinding.property.value.IValueProperty;
39: import org.eclipse.emf.common.command.BasicCommandStack;
40: import org.eclipse.emf.common.notify.AdapterFactory;
41: import org.eclipse.emf.common.util.URI;
42: import org.eclipse.emf.databinding.EMFObservables;
43: import org.eclipse.emf.ecore.EAttribute;
44: import org.eclipse.emf.ecore.EClass;
45: import org.eclipse.emf.ecore.EObject;
46: import org.eclipse.emf.ecore.EPackage;
47: import org.eclipse.emf.ecore.EStructuralFeature;
48: import org.eclipse.emf.ecore.EcoreFactory;
49: import org.eclipse.emf.ecore.resource.Resource;
50: import org.eclipse.emf.ecore.resource.ResourceSet;
51: import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
52: import org.eclipse.emf.ecore.util.EcoreUtil;
53: import org.eclipse.emf.ecp.test.common.DefaultRealm;
54: import org.eclipse.emf.ecp.view.model.common.AbstractGridCell.Alignment;
55: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
56: import org.eclipse.emf.ecp.view.spi.model.VControl;
57: import org.eclipse.emf.ecp.view.spi.model.VDomainModelReference;
58: import org.eclipse.emf.ecp.view.spi.model.VElement;
59: import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
60: import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
61: import org.eclipse.emf.ecp.view.spi.util.swt.ImageRegistryService;
62: import org.eclipse.emf.ecp.view.template.model.VTStyleProperty;
63: import org.eclipse.emf.ecp.view.template.model.VTViewTemplateProvider;
64: import org.eclipse.emf.ecp.view.template.style.tableStyleProperty.model.RenderMode;
65: import org.eclipse.emf.ecp.view.template.style.tableStyleProperty.model.VTTableStyleProperty;
66: import org.eclipse.emf.ecp.view.template.style.tableStyleProperty.model.VTTableStylePropertyFactory;
67: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTTestUtil;
68: import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
69: import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
70: import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
71: import org.eclipse.emf.emfstore.bowling.BowlingFactory;
72: import org.eclipse.emf.emfstore.bowling.BowlingPackage;
73: import org.eclipse.emf.emfstore.bowling.Game;
74: import org.eclipse.emf.emfstore.bowling.TournamentType;
75: import org.eclipse.emfforms.spi.common.report.ReportService;
76: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
77: import org.eclipse.emfforms.spi.core.services.databinding.EMFFormsDatabinding;
78: import org.eclipse.emfforms.spi.core.services.label.EMFFormsLabelProvider;
79: import org.eclipse.emfforms.spi.core.services.label.NoLabelFoundException;
80: import org.eclipse.emfforms.spi.localization.EMFFormsLocalizationService;
81: import org.eclipse.emfforms.spi.swt.core.SWTDataElementIdHelper;
82: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
83: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
84: import org.eclipse.jface.layout.GridDataFactory;
85: import org.eclipse.jface.layout.GridLayoutFactory;
86: import org.eclipse.jface.viewers.StructuredSelection;
87: import org.eclipse.swt.graphics.Rectangle;
88: import org.eclipse.swt.widgets.Button;
89: import org.eclipse.swt.widgets.Control;
90: import org.eclipse.swt.widgets.Shell;
91: import org.eclipse.swt.widgets.Table;
92: import org.junit.After;
93: import org.junit.Before;
94: import org.junit.Test;
95: import org.mockito.Matchers;
96: import org.mockito.Mockito;
97:
98: public class MultiAttributeSWTRenderer_ITest {
99:
100:         private static final String UUID_REMOVE = "UUID#remove"; //$NON-NLS-1$
101:         private static final String UUID_ADD = "UUID#add"; //$NON-NLS-1$
102:         private static final String UUID_DOWN = "UUID#down"; //$NON-NLS-1$
103:         private static final String UUID_UP = "UUID#up"; //$NON-NLS-1$
104:         private DefaultRealm realm;
105:         private Shell shell;
106:
107:         private VControl vElement;
108:         private ViewModelContext viewContext;
109:         private ReportService reportService;
110:         private EMFFormsDatabinding emfFormsDatabinding;
111:         private EMFFormsLabelProvider emfFormsLabelProvider;
112:         private VTViewTemplateProvider vtViewTemplateProvider;
113:         private ImageRegistryService imageRegistryService;
114:
115:         @Before
116:         public void before() throws NoLabelFoundException, DatabindingFailedException {
117:                 realm = new DefaultRealm();
118:                 shell = new Shell();
119:                 GridLayoutFactory.fillDefaults().applyTo(shell);
120:
121:                 vElement = Mockito.mock(VControl.class);
122:                 viewContext = Mockito.mock(ViewModelContext.class);
123:                 reportService = Mockito.mock(ReportService.class);
124:                 emfFormsDatabinding = Mockito.mock(EMFFormsDatabinding.class);
125:                 emfFormsLabelProvider = Mockito.mock(EMFFormsLabelProvider.class);
126:                 vtViewTemplateProvider = Mockito.mock(VTViewTemplateProvider.class);
127:
128:                 imageRegistryService = Mockito.mock(ImageRegistryService.class);
129:
130:                 // mock databinding to return a value property with changeable structural feature.
131:                 // Necessary due to the implementation of Bug 536250
132:                 final EStructuralFeature changeableFeature = mock(EStructuralFeature.class);
133:                 when(changeableFeature.isChangeable()).thenReturn(true);
134:                 final IValueProperty<?, ?> valueProperty = mock(IValueProperty.class);
135:                 when(valueProperty.getValueType()).thenReturn(changeableFeature);
136:                 when(emfFormsDatabinding.getValueProperty(any(VDomainModelReference.class), any(EObject.class)))
137:                         .thenReturn(valueProperty);
138:
139:                 final IObservableValue<Serializable> displayName = Observables.constantObservableValue(
140:                         "Display Name", //$NON-NLS-1$
141:                         String.class);
142:                 Mockito.doReturn(displayName).when(emfFormsLabelProvider)
143:                         .getDisplayName(Matchers.any(VDomainModelReference.class), Matchers.any(EObject.class));
144:
145:                 final IObservableValue<Serializable> description = Observables.constantObservableValue(
146:                         "Description", //$NON-NLS-1$
147:                         String.class);
148:                 Mockito.doReturn(description).when(emfFormsLabelProvider)
149:                         .getDescription(Matchers.any(VDomainModelReference.class), Matchers.any(EObject.class));
150:
151:                 Mockito.doReturn("UUID").when(vElement).getUuid(); //$NON-NLS-1$
152:         }
153:
154:         public void setupCompact() {
155:                 final Set<VTStyleProperty> properties = new HashSet<VTStyleProperty>();
156:                 final VTTableStyleProperty tableStyleProperty = VTTableStylePropertyFactory.eINSTANCE
157:                         .createTableStyleProperty();
158:                 tableStyleProperty.setRenderMode(RenderMode.COMPACT_VERTICALLY);
159:                 properties.add(tableStyleProperty);
160:                 Mockito.when(vtViewTemplateProvider.getStyleProperties(Matchers.any(VElement.class),
161:                         Matchers.any(ViewModelContext.class))).thenReturn(properties);
162:         }
163:
164:         @After
165:         public void after() {
166:                 shell.dispose();
167:                 realm.dispose();
168:         }
169:
170:         private MultiAttributeSWTRenderer createRenderer() {
171:                 final MultiAttributeSWTRenderer renderer = new MultiAttributeSWTRenderer(
172:                         vElement,
173:                         viewContext,
174:                         reportService,
175:                         emfFormsDatabinding,
176:                         emfFormsLabelProvider,
177:                         vtViewTemplateProvider,
178:                         imageRegistryService);
179:                 renderer.init();
180:                 return renderer;
181:         }
182:
183:         private void createEditingDomain(final EObject object) {
184:                 final EObject rootObject = EcoreUtil.getRootContainer(object);
185:                 final ResourceSet rs = new ResourceSetImpl();
186:                 final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(new AdapterFactory[] {
187:                         new ReflectiveItemProviderAdapterFactory(),
188:                         new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) });
189:                 final AdapterFactoryEditingDomain domain = new AdapterFactoryEditingDomain(
190:                         adapterFactory,
191:                         new BasicCommandStack(), rs);
192:                 rs.eAdapters().add(new AdapterFactoryEditingDomain.EditingDomainProvider(domain));
193:                 final Resource resource = rs.createResource(URI.createURI("VIRTAUAL_URI")); //$NON-NLS-1$
194:•                if (resource != null) {
195:                         resource.getContents().add(rootObject);
196:                 }
197:         }
198:
199:         private static int getVisibleRows(Table table) {
200:                 final Rectangle clientArea = table.getClientArea();
201:                 final int itemHeight = table.getItemHeight();
202:                 final int headerHeight = table.getHeaderHeight();
203:                 return (clientArea.height - headerHeight + itemHeight - 1) / itemHeight;
204:         }
205:
206:         @Test
207:         public void selectionAfterMove_Up()
208:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
209:                 /* setup domain */
210:                 final Game game = BowlingFactory.eINSTANCE.createGame();
211:                 game.getFrames().add(1);
212:                 game.getFrames().add(1);
213:                 game.getFrames().add(1);
214:                 game.getFrames().add(2);
215:                 game.getFrames().add(2);
216:
217:                 createEditingDomain(game);
218:
219:                 /* setup classes */
220:                 @SuppressWarnings("rawtypes")
221:                 final IObservableList observeList = EMFObservables.observeList(
222:                         realm,
223:                         game,
224:                         BowlingPackage.eINSTANCE.getGame_Frames());
225:                 Mockito.doReturn(observeList).when(emfFormsDatabinding)
226:                         .getObservableList(Matchers.any(VDomainModelReference.class), Matchers.any(EObject.class));
227:
228:                 final MultiAttributeSWTRenderer renderer = createRenderer();
229:
230:                 /* setup rendering */
231:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
232:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
233:
234:                 /* render */
235:                 final Control control = renderer.render(lastGridCell, shell);
236:                 final Table table = SWTTestUtil.findControl(control, 0, Table.class);
237:                 final Button upButton = SWTTestUtil.findControl(control, 0, Button.class);
238:
239:                 /* act */
240:                 table.setSelection(2);
241:                 SWTTestUtil.waitForUIThread();
242:
243:                 SWTTestUtil.clickButton(upButton);
244:                 SWTTestUtil.waitForUIThread();
245:
246:                 /* assert */
247:                 assertEquals(1, table.getSelectionIndex());
248:         }
249:
250:         @Test
251:         public void selectionAfterMove_Down()
252:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
253:                 /* setup domain */
254:                 final Game game = BowlingFactory.eINSTANCE.createGame();
255:                 game.getFrames().add(1);
256:                 game.getFrames().add(1);
257:                 game.getFrames().add(1);
258:                 game.getFrames().add(2);
259:                 game.getFrames().add(2);
260:
261:                 createEditingDomain(game);
262:
263:                 /* setup classes */
264:                 @SuppressWarnings("rawtypes")
265:                 final IObservableList observeList = EMFObservables.observeList(
266:                         realm,
267:                         game,
268:                         BowlingPackage.eINSTANCE.getGame_Frames());
269:                 Mockito.doReturn(observeList).when(emfFormsDatabinding)
270:                         .getObservableList(Matchers.any(VDomainModelReference.class), Matchers.any(EObject.class));
271:
272:                 final MultiAttributeSWTRenderer renderer = createRenderer();
273:
274:                 /* setup rendering */
275:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
276:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
277:
278:                 /* render */
279:                 final Control control = renderer.render(lastGridCell, shell);
280:                 final Table table = SWTTestUtil.findControl(control, 0, Table.class);
281:                 final Button downButton = SWTTestUtil.findControl(control, 1, Button.class);
282:
283:                 /* act */
284:                 table.setSelection(1);
285:                 SWTTestUtil.waitForUIThread();
286:
287:                 SWTTestUtil.clickButton(downButton);
288:                 SWTTestUtil.waitForUIThread();
289:
290:                 /* assert */
291:                 assertEquals(2, table.getSelectionIndex());
292:         }
293:
294:         @Test
295:         public void elementVisibleAfterMove()
296:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
297:                 /* setup domain */
298:                 final Game game = BowlingFactory.eINSTANCE.createGame();
299:•                for (int i = 0; i < 50; i++) {
300:                         game.getFrames().add(i);
301:                         game.getFrames().add(i);
302:                 }
303:                 createEditingDomain(game);
304:
305:                 /* setup classes */
306:                 @SuppressWarnings("rawtypes")
307:                 final IObservableList observeList = EMFObservables.observeList(
308:                         realm,
309:                         game,
310:                         BowlingPackage.eINSTANCE.getGame_Frames());
311:                 Mockito.doReturn(observeList).when(emfFormsDatabinding)
312:                         .getObservableList(Matchers.any(VDomainModelReference.class), Matchers.any(EObject.class));
313:
314:                 final MultiAttributeSWTRenderer renderer = createRenderer();
315:
316:                 /* setup rendering */
317:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
318:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
319:
320:                 /* render */
321:                 final Control control = renderer.render(lastGridCell, shell);
322:                 GridDataFactory.fillDefaults().grab(true, false).applyTo(control);
323:
324:                 shell.layout(true, true);
325:                 SWTTestUtil.waitForUIThread();
326:
327:                 final Table table = SWTTestUtil.findControl(control, 0, Table.class);
328:                 final Button downButton = SWTTestUtil.findControl(control, 1, Button.class);
329:
330:                 /* act */
331:                 table.setSelection(0);
332:                 SWTTestUtil.waitForUIThread();
333:
334:•                for (int i = 0; i < 25; i++) {
335:                         SWTTestUtil.clickButton(downButton);
336:                         SWTTestUtil.waitForUIThread();
337:                 }
338:
339:                 /* assert */
340:                 assertEquals(25, table.getSelectionIndex());
341:                 final int visibleRows = getVisibleRows(table);
342:                 final int topRowIndex = table.getTopIndex();
343:
344:                 /* selection index should be between top element index and top element index plus visible item count */
345:•                assertTrue(topRowIndex <= table.getSelectionIndex());
346:•                assertTrue(topRowIndex + visibleRows >= table.getSelectionIndex());
347:         }
348:
349:         @Test
350:         public void labelsAreDisplayedForInput()
351:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
352:                 /* setup domain */
353:                 final Game game = BowlingFactory.eINSTANCE.createGame();
354:•                for (int i = 0; i < 100; i++) {
355:                         game.getFrames().add(i);
356:                 }
357:                 createEditingDomain(game);
358:
359:                 /* setup classes */
360:                 @SuppressWarnings("rawtypes")
361:                 final IObservableList observeList = EMFObservables.observeList(
362:                         realm,
363:                         game,
364:                         BowlingPackage.eINSTANCE.getGame_Frames());
365:                 Mockito.doReturn(observeList).when(emfFormsDatabinding)
366:                         .getObservableList(Matchers.any(VDomainModelReference.class), Matchers.any(EObject.class));
367:
368:                 final MultiAttributeSWTRenderer renderer = createRenderer();
369:
370:                 /* setup rendering */
371:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
372:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
373:
374:                 /* render/act */
375:                 final Control control = renderer.render(lastGridCell, shell);
376:                 GridDataFactory.fillDefaults().grab(true, false).applyTo(control);
377:
378:                 shell.layout(true, true);
379:                 SWTTestUtil.waitForUIThread();
380:
381:                 final Table table = SWTTestUtil.findControl(control, 0, Table.class);
382:
383:                 /* assert */
384:                 assertEquals(100, table.getItems().length);
385:•                for (int i = 0; i < 100; i++) {
386:                         final String text = table.getItems()[i].getText();
387:                         assertEquals(String.valueOf(i), text);
388:                 }
389:
390:         }
391:
392:         @Test
393:         public void buttonsUpDown_enableOnSelection()
394:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
395:                 /* setup domain */
396:                 final IObservableList<?> observeList = createBasicDomain();
397:                 Mockito.doReturn(true).when(vElement).isEffectivelyEnabled();
398:                 final MultiAttributeSWTRenderer renderer = createRenderer();
399:
400:                 /* setup rendering */
401:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
402:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
403:
404:                 /* render */
405:                 final Control control = renderer.render(lastGridCell, shell);
406:                 final Button upButton = SWTTestUtil.findControlById(control, UUID_UP, Button.class);
407:                 final Button downButton = SWTTestUtil.findControlById(control, UUID_DOWN, Button.class);
408:
409:                 /* by default, up is disabled (no selection) */
410:                 checkControlEnablement(upButton, false);
411:                 checkControlEnablement(downButton, false);
412:
413:                 /* select first element in list */
414:                 renderer.getTableViewer().setSelection(new StructuredSelection(observeList.get(0)), true);
415:                 SWTTestUtil.waitForUIThread();
416:                 checkControlEnablement(upButton, false);
417:                 checkControlEnablement(downButton, true);
418:
419:                 /* select an element in the middle of the list */
420:                 renderer.getTableViewer().setSelection(new StructuredSelection(observeList.get(3)), true);
421:                 SWTTestUtil.waitForUIThread();
422:                 checkControlEnablement(upButton, true);
423:                 checkControlEnablement(downButton, true);
424:
425:                 /* select last element in list */
426:                 renderer.getTableViewer().setSelection(new StructuredSelection(observeList.get(4)), true);
427:                 SWTTestUtil.waitForUIThread();
428:                 checkControlEnablement(upButton, true);
429:                 checkControlEnablement(downButton, false);
430:
431:                 /* remove selection */
432:                 renderer.getTableViewer().setSelection(StructuredSelection.EMPTY);
433:                 SWTTestUtil.waitForUIThread();
434:                 checkControlEnablement(upButton, false);
435:                 checkControlEnablement(downButton, false);
436:         }
437:
438:         private void checkControlEnablement(Control control, boolean expectedEnable) {
439:                 assertNotNull("control does not exists", control); //$NON-NLS-1$
440:                 assertThat(control.getEnabled(), is(expectedEnable));
441:         }
442:
443:         private IObservableList<?> createBasicDomain() throws DatabindingFailedException {
444:                 final Game game = BowlingFactory.eINSTANCE.createGame();
445:                 game.getFrames().add(1);
446:                 game.getFrames().add(1);
447:                 game.getFrames().add(1);
448:                 game.getFrames().add(2);
449:                 game.getFrames().add(3);
450:
451:                 createEditingDomain(game);
452:
453:                 /* setup classes */
454:                 @SuppressWarnings("rawtypes")
455:                 final IObservableList observeList = EMFObservables.observeList(
456:                         realm,
457:                         game,
458:                         BowlingPackage.eINSTANCE.getGame_Frames());
459:                 Mockito.doReturn(observeList).when(emfFormsDatabinding)
460:                         .getObservableList(Matchers.any(VDomainModelReference.class), Matchers.any(EObject.class));
461:                 return observeList;
462:         }
463:
464:         @Test
465:         public void testButtonRemovedOnReadOnly()
466:                 throws NoRendererFoundException, NoPropertyDescriptorFoundExeption, DatabindingFailedException {
467:                 final IObservableList<?> observeList = createBasicDomain();
468:                 final MultiAttributeSWTRenderer renderer = createRenderer();
469:                 Mockito.doReturn(true).when(vElement).isEffectivelyReadonly();
470:                 when(vElement.isEffectivelyEnabled()).thenReturn(true);
471:                 /* setup rendering */
472:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
473:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
474:
475:                 /* render */
476:                 final Control control = renderer.render(lastGridCell, shell);
477:                 // check control visibility (getVisible rather than isVisible as the shell is not visible itself)
478:                 assertTrue("Control should be visible", control.getVisible()); //$NON-NLS-1$
479:                 assertTrue("Control may still be enabled when read-only", control.isEnabled());//$NON-NLS-1$
480:                 final Button upButton = SWTTestUtil.findControl(control, 0, Button.class);
481:                 assertFalse("Up button shall not be visible when read-only", upButton.getVisible());//$NON-NLS-1$
482:
483:                 /* select an element in list */
484:                 renderer.getTableViewer().setSelection(new StructuredSelection(observeList.get(0)), true);
485:                 SWTTestUtil.waitForUIThread();
486:
487:                 /* assert */
488:                 assertFalse("Up button shall not be visible when read-only", upButton.getVisible());//$NON-NLS-1$
489:
490:                 /* act */
491:                 renderer.getTableViewer().setSelection(StructuredSelection.EMPTY);
492:                 SWTTestUtil.waitForUIThread();
493:
494:                 /* assert */
495:                 assertFalse("Up button shall not be visible when read-only", upButton.getVisible());//$NON-NLS-1$
496:
497:         }
498:
499:         @Test
500:         public void testButtonsDeactivateOnDisable()
501:                 throws NoRendererFoundException, NoPropertyDescriptorFoundExeption, DatabindingFailedException {
502:                 final IObservableList<?> observeList = createBasicDomain();
503:                 // set to disable
504:                 Mockito.doReturn(false).when(vElement).isEffectivelyEnabled();
505:                 final MultiAttributeSWTRenderer renderer = createRenderer();
506:
507:                 /* setup rendering */
508:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
509:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
510:
511:                 /* render */
512:                 final Control control = renderer.render(lastGridCell, shell);
513:                 final Button upButton = SWTTestUtil.findControl(control, 0, Button.class);
514:
515:                 /* by default, up is disabled (no selection) */
516:                 assertFalse(upButton.getEnabled());
517:
518:                 /* select an element in list */
519:                 renderer.getTableViewer().setSelection(new StructuredSelection(observeList.get(0)), true);
520:                 SWTTestUtil.waitForUIThread();
521:
522:                 /* up should still be disabled */
523:                 assertFalse("button is enabled even if VElement is not enabled", upButton.getEnabled());//$NON-NLS-1$
524:
525:                 /* act */
526:                 renderer.getTableViewer().setSelection(StructuredSelection.EMPTY);
527:                 SWTTestUtil.waitForUIThread();
528:
529:                 /* assert */
530:                 assertFalse("button is enabled even if VElement is not enabled", upButton.getEnabled());//$NON-NLS-1$
531:         }
532:
533:         @Test
534:         public void compactRendererDescription() {
535:                 setupCompact();
536:                 final MultiAttributeSWTRenderer renderer = createRenderer();
537:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
538:
539:                 assertThat(gridDescription.getColumns(), is(equalTo(2)));
540:
541:                 final SWTGridCell validationCell = gridDescription.getGrid().get(0);
542:                 assertThat(validationCell.getPreferredSize(), notNullValue());
543:                 assertThat(validationCell.isHorizontalGrab(), is(false));
544:                 assertThat(validationCell.getVerticalAlignment(), is(Alignment.BEGINNING));
545:
546:                 final SWTGridCell mainCell = gridDescription.getGrid().get(1);
547:                 assertThat(mainCell.getPreferredSize(), nullValue());
548:                 assertThat(mainCell.isHorizontalGrab(), is(true));
549:                 assertThat(mainCell.isVerticalGrab(), is(true));
550:         }
551:
552:         @Test
553:         public void buttonData()
554:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
555:                 /* setup domain */
556:                 final Game game = BowlingFactory.eINSTANCE.createGame();
557:                 createEditingDomain(game);
558:
559:                 /* setup classes */
560:                 @SuppressWarnings("rawtypes")
561:                 final IObservableList observeList = EMFObservables.observeList(
562:                         realm,
563:                         game,
564:                         BowlingPackage.eINSTANCE.getGame_Frames());
565:                 Mockito.doReturn(observeList).when(emfFormsDatabinding)
566:                         .getObservableList(Matchers.any(VDomainModelReference.class), Matchers.any(EObject.class));
567:
568:                 final MultiAttributeSWTRenderer renderer = createRenderer();
569:
570:                 /* setup rendering */
571:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
572:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
573:
574:                 /* render */
575:                 final Control control = renderer.render(lastGridCell, shell);
576:
577:                 /* assert */
578:                 assertEquals(UUID_UP, SWTTestUtil.findControl(control, 0, Button.class)
579:                         .getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
580:                 assertEquals(UUID_DOWN, SWTTestUtil.findControl(control, 1, Button.class)
581:                         .getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
582:                 assertEquals(UUID_ADD, SWTTestUtil.findControl(control, 2, Button.class)
583:                         .getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
584:                 assertEquals(UUID_REMOVE, SWTTestUtil.findControl(control, 3, Button.class)
585:                         .getData(SWTDataElementIdHelper.ELEMENT_ID_KEY));
586:         }
587:
588:         /**
589:          * Verify that when adding an enum value, the default value of the <em>attribute</em> is
590:          * preferred over the default literal of the enumeration (which is always the first literal),
591:          * if the attribute specifies a default.
592:          */
593:         @Test
594:         @SuppressWarnings("nls")
595:         public void addEnumValue()
596:                 throws DatabindingFailedException, NoRendererFoundException, NoPropertyDescriptorFoundExeption {
597:
598:                 final EPackage fakePackage = EcoreFactory.eINSTANCE.createEPackage();
599:                 final EClass fakeClass = EcoreFactory.eINSTANCE.createEClass();
600:                 fakePackage.getEClassifiers().add(fakeClass);
601:                 final EAttribute allowedTypes = EcoreFactory.eINSTANCE.createEAttribute();
602:                 allowedTypes.setName("allowedTypes");
603:                 allowedTypes.setUpperBound(TournamentType.values().length);
604:                 allowedTypes.setEType(BowlingPackage.Literals.TOURNAMENT_TYPE);
605:                 allowedTypes.setDefaultValue(TournamentType.AMATEUR); // Not the type's intrinsic default
606:                 fakeClass.getEStructuralFeatures().add(allowedTypes);
607:
608:                 /* setup domain */
609:                 final EObject object = EcoreUtil.create(fakeClass);
610:                 createEditingDomain(object);
611:
612:                 /* setup classes */
613:                 @SuppressWarnings("unchecked")
614:                 final IObservableList<TournamentType> list = EMFObservables.observeList(
615:                         realm,
616:                         object,
617:                         allowedTypes);
618:                 when(emfFormsDatabinding.getObservableList(Matchers.any(VDomainModelReference.class),
619:                         Matchers.any(EObject.class)))
620:                                 .thenReturn(list);
621:                 when(viewContext.getDomainModel()).thenReturn(object);
622:                 when(viewContext.getService(EMFFormsLocalizationService.class))
623:                         .thenReturn(mock(EMFFormsLocalizationService.class));
624:
625:                 /* setup rendering */
626:                 final MultiAttributeSWTRenderer renderer = createRenderer();
627:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
628:                 final SWTGridCell lastGridCell = gridDescription.getGrid().get(gridDescription.getGrid().size() - 1);
629:
630:                 /* render */
631:                 final Control control = renderer.render(lastGridCell, shell);
632:                 final Table table = SWTTestUtil.findControl(control, 0, Table.class);
633:                 final Button addButton = SWTTestUtil.findControl(control, 2, Button.class);
634:
635:                 /* act */
636:                 table.setSelection(2);
637:                 SWTTestUtil.waitForUIThread();
638:
639:                 SWTTestUtil.clickButton(addButton);
640:                 SWTTestUtil.waitForUIThread();
641:
642:                 /* verify the added value */
643:                 assertThat("Wrong default value", list, hasItem(TournamentType.AMATEUR));
644:         }
645:
646: }