Skip to content

Package: TreeMasterDetailRenderer_PTest

TreeMasterDetailRenderer_PTest

nameinstructionbranchcomplexitylinemethod
TreeMasterDetailRenderer_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%
assertContextMenu(Tree, int)
M: 0 C: 27
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
before()
M: 0 C: 98
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 25
100%
M: 0 C: 1
100%
contextMenu_delete_resetSelectionToRoot()
M: 1 C: 46
98%
M: 2 C: 2
50%
M: 2 C: 1
33%
M: 0 C: 11
100%
M: 0 C: 1
100%
detailViewRenderingReused()
M: 0 C: 66
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 15
100%
M: 0 C: 1
100%
detailView_initially_disabled()
M: 0 C: 38
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 10
100%
M: 0 C: 1
100%
detailView_readOnly()
M: 0 C: 38
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 10
100%
M: 0 C: 1
100%
getDetail(Control)
M: 0 C: 47
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 7
100%
M: 0 C: 1
100%
getDetailContent(Composite)
M: 0 C: 61
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
getGridDescription()
M: 0 C: 16
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 4
100%
M: 0 C: 1
100%
getTree(Control)
M: 0 C: 39
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 6
100%
M: 0 C: 1
100%
hasContextMenu()
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
hasDnDSupport()
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
initialRendering_NoContainer()
M: 0 C: 477
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 75
100%
M: 0 C: 1
100%
render()
M: 0 C: 20
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
select(Tree, TreeItem)
M: 0 C: 25
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 8
100%
M: 0 C: 1
100%
testTearDown()
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%
tmd_dynamic_disabled()
M: 0 C: 36
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 10
100%
M: 0 C: 1
100%
tmd_initially_disabled()
M: 0 C: 36
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 10
100%
M: 0 C: 1
100%
tmd_readOnly()
M: 0 C: 35
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 10
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: * eugen - initial API and implementation
13: * Christian W. Damus - bug 527686
14: ******************************************************************************/
15: package org.eclipse.emf.ecp.view.spi.treemasterdetail.ui.swt;
16:
17: import static org.hamcrest.CoreMatchers.is;
18: import static org.hamcrest.CoreMatchers.sameInstance;
19: import static org.junit.Assert.assertEquals;
20: import static org.junit.Assert.assertFalse;
21: import static org.junit.Assert.assertNotNull;
22: import static org.junit.Assert.assertNull;
23: import static org.junit.Assert.assertThat;
24: import static org.junit.Assert.assertTrue;
25: import static org.mockito.Mockito.mock;
26:
27: import org.eclipse.emf.ecp.test.common.DefaultRealm;
28: import org.eclipse.emf.ecp.view.internal.context.ViewModelContextImpl;
29: import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
30: import org.eclipse.emf.ecp.view.spi.model.VControl;
31: import org.eclipse.emf.ecp.view.spi.model.VFeaturePathDomainModelReference;
32: import org.eclipse.emf.ecp.view.spi.model.VView;
33: import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
34: import org.eclipse.emf.ecp.view.spi.renderer.NoPropertyDescriptorFoundExeption;
35: import org.eclipse.emf.ecp.view.spi.renderer.NoRendererFoundException;
36: import org.eclipse.emf.ecp.view.spi.swt.masterdetail.DetailViewCache;
37: import org.eclipse.emf.ecp.view.test.common.swt.spi.SWTTestUtil;
38: import org.eclipse.emf.ecp.view.treemasterdetail.model.VTreeMasterDetail;
39: import org.eclipse.emf.ecp.view.treemasterdetail.model.VTreeMasterDetailFactory;
40: import org.eclipse.emf.emfstore.bowling.BowlingFactory;
41: import org.eclipse.emf.emfstore.bowling.BowlingPackage;
42: import org.eclipse.emf.emfstore.bowling.League;
43: import org.eclipse.emf.emfstore.bowling.Player;
44: import org.eclipse.emfforms.spi.common.report.ReportService;
45: import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
46: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridCell;
47: import org.eclipse.emfforms.spi.swt.core.layout.SWTGridDescription;
48: import org.eclipse.swt.SWT;
49: import org.eclipse.swt.custom.SashForm;
50: import org.eclipse.swt.custom.ScrolledComposite;
51: import org.eclipse.swt.custom.StackLayout;
52: import org.eclipse.swt.events.MenuListener;
53: import org.eclipse.swt.widgets.Composite;
54: import org.eclipse.swt.widgets.Control;
55: import org.eclipse.swt.widgets.Display;
56: import org.eclipse.swt.widgets.Event;
57: import org.eclipse.swt.widgets.Label;
58: import org.eclipse.swt.widgets.Menu;
59: import org.eclipse.swt.widgets.Shell;
60: import org.eclipse.swt.widgets.Text;
61: import org.eclipse.swt.widgets.ToolBar;
62: import org.eclipse.swt.widgets.Tree;
63: import org.eclipse.swt.widgets.TreeItem;
64: import org.eclipse.swt.widgets.TypedListener;
65: import org.eclipse.swtbot.swt.finder.SWTBot;
66: import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
67: import org.junit.After;
68: import org.junit.Before;
69: import org.junit.Test;
70:
71: @SuppressWarnings("restriction")
72: public class TreeMasterDetailRenderer_PTest {
73:
74:         private DefaultRealm realm;
75:         private TreeMasterDetailSWTRenderer renderer;
76:         private Shell shell;
77:         private ViewModelContext context;
78:
79:         @Before
80:         public void before() throws DatabindingFailedException {
81:                 realm = new DefaultRealm();
82:                 final ReportService reportService = mock(ReportService.class);
83:                 final VTreeMasterDetail tmd = VTreeMasterDetailFactory.eINSTANCE.createTreeMasterDetail();
84:                 // define explicit inner View
85:                 final VView detailView = VViewFactory.eINSTANCE.createView();
86:                 detailView.setRootEClass(BowlingPackage.eINSTANCE.getLeague());
87:                 final VControl vControl = VViewFactory.eINSTANCE.createControl();
88:                 final VFeaturePathDomainModelReference featurePathDomainModelReference = VViewFactory.eINSTANCE
89:                         .createFeaturePathDomainModelReference();
90:                 featurePathDomainModelReference.setDomainModelEFeature(BowlingPackage.eINSTANCE.getLeague_Name());
91:                 vControl.setDomainModelReference(featurePathDomainModelReference);
92:                 detailView.getChildren().add(vControl);
93:                 tmd.setDetailView(detailView);
94:
95:                 final League domainModel = BowlingFactory.eINSTANCE.createLeague();
96:                 Player player = BowlingFactory.eINSTANCE.createPlayer();
97:                 player.setName("Player 1"); //$NON-NLS-1$
98:                 domainModel.getPlayers().add(player);
99:                 player = BowlingFactory.eINSTANCE.createPlayer();
100:                 player.setName("Player 2"); //$NON-NLS-1$
101:                 domainModel.getPlayers().add(player);
102:
103:                 context = new ViewModelContextImpl(tmd, domainModel);
104:                 context.putContextValue(DetailViewCache.DETAIL_VIEW_CACHE_SIZE, 5);
105:                 renderer = new TreeMasterDetailSWTRenderer(tmd, context, reportService);
106:                 renderer.init();
107:
108:                 shell = new Shell(Display.getDefault(), SWT.NONE);
109:         }
110:
111:         @After
112:         public void testTearDown() {
113:                 realm.dispose();
114:                 shell.dispose();
115:         }
116:
117:         @Test
118:         public void getGridDescription() {
119:                 final SWTGridDescription gridDescription = renderer.getGridDescription(null);
120:                 assertEquals(1, gridDescription.getColumns());
121:                 assertEquals(1, gridDescription.getRows());
122:         }
123:
124:         @Test
125:         public void contextMenu_delete_resetSelectionToRoot()
126:                 throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
127:                 final Control render = render();
128:                 final SWTBot bot = new SWTBot(render);
129:                 final SWTBotTree tree = bot.tree();
130:                 SWTTestUtil.selectTreeItem(tree.widget.getItem(0).getItem(0));
131:                 SWTTestUtil.waitForUIThread();
132:
133:                 tree.contextMenu("Delete").click(); //$NON-NLS-1$
134:
135:                 SWTTestUtil.waitForUIThread();
136:
137:                 final TreeItem[] selection = tree.widget.getSelection();
138:                 assertTrue("Root node was not selected automatically!", //$NON-NLS-1$
139:•                        selection.length == 1 && selection[0].getData() instanceof League);
140:         }
141:
142:         @Test
143:         public void hasContextMenu() {
144:                 assertTrue(renderer.hasContextMenu());
145:         }
146:
147:         @Test
148:         public void hasDnDSupport() {
149:                 assertTrue(renderer.hasDnDSupport());
150:         }
151:
152:         @Test
153:         public void initialRendering_NoContainer() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
154:                 final Control renderResult = render();
155:                 assertTrue(Composite.class.isInstance(renderResult));
156:                 final Composite resultComposite = Composite.class.cast(renderResult);
157:                 assertEquals(2, resultComposite.getChildren().length);
158:
159:                 // FIXME why do we have an intermediate composite?
160:                 assertTrue(Composite.class.isInstance(resultComposite.getChildren()[0]));
161:                 final Composite topComposite = Composite.class.cast(resultComposite.getChildren()[0]);
162:                 assertEquals(1, topComposite.getChildren().length);
163:
164:                 assertTrue(Composite.class.isInstance(topComposite.getChildren()[0]));
165:                 final Composite titleComposite = Composite.class.cast(topComposite.getChildren()[0]);
166:                 assertEquals(3, titleComposite.getChildren().length);
167:                 // FIXME check backgroundcolor?
168:
169:                 assertTrue(Label.class.isInstance(titleComposite.getChildren()[0]));
170:                 final Label titleIcon = Label.class.cast(titleComposite.getChildren()[0]);
171:                 assertNotNull(titleIcon.getImage());
172:
173:                 assertTrue(Label.class.isInstance(titleComposite.getChildren()[1]));
174:                 final Label titleLabel = Label.class.cast(titleComposite.getChildren()[1]);
175:                 assertEquals("View Editor", titleLabel.getText()); //$NON-NLS-1$
176:
177:                 assertTrue(ToolBar.class.isInstance(titleComposite.getChildren()[2]));
178:                 final ToolBar titleToolbar = ToolBar.class.cast(titleComposite.getChildren()[2]);
179:                 assertEquals(0, titleToolbar.getChildren().length);
180:
181:                 // Bottom composite
182:                 // FIXME why do we have an intermediate composite?
183:                 assertTrue(Composite.class.isInstance(resultComposite.getChildren()[1]));
184:                 final Composite bottomComposite = Composite.class.cast(resultComposite.getChildren()[1]);
185:                 assertEquals(1, bottomComposite.getChildren().length);
186:
187:                 assertTrue(SashForm.class.isInstance(bottomComposite.getChildren()[0]));
188:                 final SashForm sash = SashForm.class.cast(bottomComposite.getChildren()[0]);
189:                 assertEquals(2, sash.getChildren().length);
190:
191:                 assertTrue(Composite.class.isInstance(sash.getChildren()[0]));
192:                 final Composite treeComposite = Composite.class.cast(sash.getChildren()[0]);
193:                 assertEquals(1, treeComposite.getChildren().length);
194:
195:                 assertTrue(Tree.class.isInstance(treeComposite.getChildren()[0]));
196:                 final Tree tree = Tree.class.cast(treeComposite.getChildren()[0]);
197:                 assertEquals(1, tree.getItemCount());
198:                 final TreeItem item = TreeItem.class.cast(tree.getItems()[0]);
199:                 assertEquals("League", item.getText()); //$NON-NLS-1$
200:                 assertNotNull(item.getImage());
201:
202:                 assertTrue(ScrolledComposite.class.isInstance(sash.getChildren()[1]));
203:                 final ScrolledComposite detailScrolledComposite = ScrolledComposite.class.cast(sash.getChildren()[1]);
204:                 assertEquals(1, detailScrolledComposite.getChildren().length);
205:                 // FIXME why do we have an intermediate composite?
206:                 assertTrue(Composite.class.isInstance(detailScrolledComposite.getChildren()[0]));
207:                 final Composite detailComposite = Composite.class.cast(detailScrolledComposite.getChildren()[0]);
208:                 assertEquals(2, detailComposite.getChildren().length);
209:
210:                 // Detail Title
211:                 assertTrue(Composite.class.isInstance(detailComposite.getChildren()[0]));
212:                 final Composite detailTitleComposite = Composite.class.cast(detailComposite.getChildren()[0]);
213:                 assertEquals(1, detailTitleComposite.getChildren().length);
214:
215:                 assertTrue(Label.class.isInstance(detailTitleComposite.getChildren()[0]));
216:                 final Label detailTitle = Label.class.cast(detailTitleComposite.getChildren()[0]);
217:                 assertEquals("Details", detailTitle.getText()); //$NON-NLS-1$
218:
219:                 // Detail Content
220:                 assertTrue(Composite.class.isInstance(detailComposite.getChildren()[1]));
221:                 final Composite detailContentComposite = Composite.class.cast(detailComposite.getChildren()[1]);
222:                 assertEquals(1, detailContentComposite.getChildren().length);
223:
224:                 // too many intermediate composites
225:                 final Composite content = Composite.class.cast(
226:                         Composite.class.cast(
227:                                 detailContentComposite.getChildren()[0]));
228:                 final StackLayout stack = (StackLayout) content.getLayout();
229:                 final Composite details = (Composite) stack.topControl;
230:                 final StringBuilder sb = new StringBuilder();
231:                 sb.append(String.format("Instead of 3 Elements of Control found %1$s controls.", details.getChildren().length)); //$NON-NLS-1$
232:                 sb.append("The controls are:"); //$NON-NLS-1$
233:•                for (final Control c : details.getChildren()) {
234:                         sb.append(String.format("Control: %1$s.", c)); //$NON-NLS-1$
235:                 }
236:                 assertEquals(sb.toString(), 3,
237:                         details.getChildren().length);
238:
239:                 assertTrue(Label.class.isInstance(details.getChildren()[0]));
240:                 final Label label = Label.class.cast(details.getChildren()[0]);
241:                 assertEquals("Name", label.getText()); //$NON-NLS-1$
242:
243:                 assertTrue(Label.class.isInstance(details.getChildren()[1]));
244:                 final Label validation = Label.class.cast(details.getChildren()[1]);
245:                 assertNull(validation.getImage());
246:
247:                 assertTrue(Composite.class.isInstance(details.getChildren()[2]));
248:                 final Composite control = Composite.class.cast(details.getChildren()[2]);
249:                 assertEquals(1, control.getChildren().length);
250:
251:                 assertTrue(Text.class.isInstance(control.getChildren()[0]));
252:                 final Text textControl = Text.class.cast(control.getChildren()[0]);
253:                 assertEquals("", textControl.getText()); //$NON-NLS-1$
254:
255:                 assertContextMenu(tree, 1);
256:         }
257:
258:         @Test
259:         public void tmd_readOnly() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
260:                 context.getViewModel().setReadonly(true);
261:                 final Control renderResult = render();
262:                 final Tree tree = getTree(renderResult);
263:                 assertTrue(tree.isEnabled());
264:                 final Composite detail = getDetail(renderResult);
265:                 assertTrue(detail.isEnabled());
266:                 final Control[] content = getDetailContent(detail);
267:                 assertFalse(content[2].isEnabled());
268:
269:                 // Read-only tree should not have any context menu
270:                 assertNull(tree.getMenu());
271:         }
272:
273:         @Test
274:         public void detailView_readOnly() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
275:                 ((VTreeMasterDetail) context.getViewModel()).getDetailView().setReadonly(true);
276:                 final Control renderResult = render();
277:                 final Tree tree = getTree(renderResult);
278:                 assertTrue(tree.isEnabled());
279:                 final Composite detail = getDetail(renderResult);
280:                 assertTrue(detail.isEnabled());
281:                 final Control[] content = getDetailContent(detail);
282:                 assertFalse(content[2].isEnabled());
283:
284:                 assertContextMenu(tree, 1);
285:         }
286:
287:         /**
288:          * Verify that a cached detail view rendering is reused.
289:          */
290:         @SuppressWarnings("nls")
291:         @Test
292:         public void detailViewRenderingReused() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
293:                 final Control renderResult = render();
294:                 final Tree tree = getTree(renderResult);
295:                 final TreeItem leagueItem = tree.getItem(0);
296:                 leagueItem.setExpanded(true);
297:                 final TreeItem player1Item = leagueItem.getItem(0);
298:                 final TreeItem player2Item = leagueItem.getItem(1);
299:
300:                 select(tree, player1Item);
301:
302:                 // Get the player's detail
303:                 final Composite detail = getDetail(renderResult);
304:                 final Text nameText = (Text) getDetailContent(detail)[2];
305:                 assertThat(nameText.getText(), is("Player 1"));
306:
307:                 // Change the selection to another player
308:                 select(tree, player2Item);
309:
310:                 // Verify the updates
311:                 assertThat(getDetail(renderResult), sameInstance(detail));
312:                 assertThat(getDetailContent(detail)[2], sameInstance(nameText));
313:                 assertThat(nameText.getText(), is("Player 2"));
314:         }
315:
316:         @Test
317:         public void tmd_initially_disabled() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
318:                 context.getViewModel().setEnabled(false);
319:                 final Control renderResult = render();
320:                 final Tree tree = getTree(renderResult);
321:                 assertTrue(tree.isEnabled());
322:                 final Composite detail = getDetail(renderResult);
323:                 assertTrue(detail.isEnabled());
324:                 final Control[] content = getDetailContent(detail);
325:                 assertFalse(content[2].isEnabled());
326:
327:                 assertContextMenu(tree, 0);
328:         }
329:
330:         @Test
331:         public void tmd_dynamic_disabled() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
332:                 final Control renderResult = render();
333:                 context.getViewModel().setEnabled(false);
334:                 final Tree tree = getTree(renderResult);
335:                 assertTrue(tree.isEnabled());
336:                 final Composite detail = getDetail(renderResult);
337:                 assertTrue(detail.isEnabled());
338:                 final Control[] content = getDetailContent(detail);
339:                 assertFalse(content[2].isEnabled());
340:
341:                 assertContextMenu(tree, 0);
342:         }
343:
344:         @Test
345:         public void detailView_initially_disabled() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
346:                 ((VTreeMasterDetail) context.getViewModel()).getDetailView().setEnabled(false);
347:                 final Control renderResult = render();
348:                 final Tree tree = getTree(renderResult);
349:                 assertTrue(tree.isEnabled());
350:                 final Composite detail = getDetail(renderResult);
351:                 assertTrue(detail.isEnabled());
352:                 final Control[] content = getDetailContent(detail);
353:                 assertFalse(content[2].isEnabled());
354:
355:                 assertContextMenu(tree, 1);
356:         }
357:
358:         private Control render() throws NoRendererFoundException, NoPropertyDescriptorFoundExeption {
359:                 final Control renderResult = renderer.render(new SWTGridCell(0, 0, renderer), shell);
360:                 renderer.finalizeRendering(shell);
361:                 return renderResult;
362:         }
363:
364:         private void select(Tree tree, TreeItem item) {
365:                 tree.setSelection(item);
366:                 final Event selection = new Event();
367:                 selection.display = tree.getDisplay();
368:                 selection.widget = tree;
369:                 selection.item = item;
370:                 selection.type = SWT.Selection;
371:                 tree.notifyListeners(SWT.Selection, selection);
372:         }
373:
374:         private Tree getTree(Control renderResult) {
375:                 final Composite resultComposite = Composite.class.cast(renderResult);
376:                 final Composite bottomComposite = Composite.class.cast(resultComposite.getChildren()[1]);
377:                 final SashForm sash = SashForm.class.cast(bottomComposite.getChildren()[0]);
378:                 final Composite treeComposite = Composite.class.cast(sash.getChildren()[0]);
379:                 final Tree tree = Tree.class.cast(treeComposite.getChildren()[0]);
380:                 return tree;
381:         }
382:
383:         private Composite getDetail(Control renderResult) {
384:                 final Composite resultComposite = Composite.class.cast(renderResult);
385:                 final Composite bottomComposite = Composite.class.cast(resultComposite.getChildren()[1]);
386:                 final SashForm sash = SashForm.class.cast(bottomComposite.getChildren()[0]);
387:                 final ScrolledComposite detailScrolledComposite = ScrolledComposite.class.cast(sash.getChildren()[1]);
388:                 final Composite detailComposite = Composite.class.cast(detailScrolledComposite.getChildren()[0]);
389:                 final Composite detailContentComposite = Composite.class.cast(detailComposite.getChildren()[1]);
390:                 return detailContentComposite;
391:         }
392:
393:         private Control[] getDetailContent(Composite detailContentComposite) {
394:                 final Composite detailStackComposite = (Composite) detailContentComposite.getChildren()[0];
395:                 final StackLayout stackLayout = (StackLayout) detailStackComposite.getLayout();
396:                 final Composite content = (Composite) stackLayout.topControl;
397:                 final Label label = Label.class.cast(content.getChildren()[0]);
398:                 final Label validation = Label.class.cast(content.getChildren()[1]);
399:                 final Composite control = Composite.class.cast(content.getChildren()[2]);
400:                 final Text textControl = Text.class.cast(control.getChildren()[0]);
401:
402:                 return new Control[] { label, validation, textControl };
403:         }
404:
405:         private void assertContextMenu(Tree tree, int numberItems) {
406:                 final Menu menu = tree.getMenu();
407:                 assertEquals(0, menu.getItemCount());
408:                 final MenuListener menuListener = (MenuListener) ((TypedListener) menu.getListeners(SWT.Show)[0])
409:                         .getEventListener();
410:                 menuListener.menuShown(null);
411:                 assertEquals(numberItems, menu.getItemCount());
412:         }
413: }