/******************************************************************************* * Copyright (c) 2008, 2016 Ketan Padegaonkar and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Ketan Padegaonkar - initial API and implementation * Patrick Tasse - Fix radio menu item click behavior (Bug 451126 & Bug 397649) * - Test dynamic menus * - Improve SWTBot menu API and implementation (Bug 479091) *******************************************************************************/ package org.eclipse.swtbot.swt.finder.widgets; import static org.eclipse.swtbot.swt.finder.utils.SWTUtils.getTextPath; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Collection; import org.eclipse.swtbot.swt.finder.SWTBot; import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; /** * @author Ketan Padegaonkar <KetanPadegaonkar [at] gmail [dot] com> * @version $Id$ */ @RunWith(Parameterized.class) public class SWTBotPopupMenuTest extends AbstractControlExampleTest { private SWTBotShell popupShell; private SWTBotText listeners; private MenuType menuType; private enum MenuType { StaticMenu, DynamicMenu } @Parameters(name = "{0}") public static Collection<MenuType> parameters() { return Arrays.asList(MenuType.values()); } public SWTBotPopupMenuTest(MenuType menuType) { this.menuType = menuType; } @Test public void findsMenus() throws Exception { SWTBotMenu menuItem; menuItem = popupShell.contextMenu().menu("Push").hide(); assertArrayEquals(new String[] { "POP_UP", "Push" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Check").hide(); assertArrayEquals(new String[] { "POP_UP", "Check" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Radio1").hide(); assertArrayEquals(new String[] { "POP_UP", "Radio1" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Radio2").hide(); assertArrayEquals(new String[] { "POP_UP", "Radio2" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade" }, getTextPath(menuItem.widget)); } @Test public void findsSubMenus() throws Exception { SWTBotMenu menuItem; menuItem = popupShell.contextMenu().menu("Cascade").menu("Push").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Push" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade").menu("Check").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Check" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade").menu("Radio1").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Radio1" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade").menu("Radio2").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Radio2" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade").menu("Cascade").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Cascade" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade", "Cascade", "Push").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Cascade", "Push" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade", "Cascade", "Check").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Cascade", "Check" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade", "Cascade", "Radio1").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Cascade", "Radio1" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Cascade", "Cascade", "Radio2").hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Cascade", "Radio2" }, getTextPath(menuItem.widget)); } @Test public void findsMenusRecursive() throws Exception { SWTBotMenu menuItem; menuItem = popupShell.contextMenu("Push").hide(); assertArrayEquals(new String[] { "POP_UP", "Push" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Push", true, 0).hide(); assertArrayEquals(new String[] { "POP_UP", "Push" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Push", true, 1).hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Push" }, getTextPath(menuItem.widget)); menuItem = popupShell.contextMenu().menu("Push", true, 2).hide(); assertArrayEquals(new String[] { "POP_UP", "Cascade", "Cascade", "Push" }, getTextPath(menuItem.widget)); } @Test public void clicksMenu() throws Exception { SWTBotRootMenu popupMenu = popupShell.contextMenu(); assertThat(listeners.getText(), containsString("MenuDetect [35]: Event {type=35 Shell {Title:0} time=")); assertThat(listeners.getText(), containsString("Show [22]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2, Cascade} time=")); bot.button("Clear").click(); SWTBotMenu menuItem = popupMenu.menu("Push"); assertThat(listeners.getText(), containsString("Arm [30]: ArmEvent{MenuItem {Push} time=")); bot.button("Clear").click(); menuItem.click(); assertThat(listeners.getText(), containsString("Hide [23]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2, Cascade} time=")); assertThat(listeners.getText(), containsString("Selection [13]: SelectionEvent{MenuItem {Push} time=")); assertThat(listeners.getText(), containsString("Clicked on menu item: POP_UP > Push")); } @Test public void clicksSubMenu() throws Exception { SWTBotRootMenu popupMenu = popupShell.contextMenu(); assertThat(listeners.getText(), containsString("MenuDetect [35]: Event {type=35 Shell {Title:0} time=")); assertThat(listeners.getText(), containsString("Show [22]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2, Cascade} time=")); bot.button("Clear").click(); SWTBotMenu cascade1 = popupMenu.menu("Cascade"); assertThat(listeners.getText(), containsString("Arm [30]: ArmEvent{MenuItem {Cascade} time=")); assertThat(listeners.getText(), containsString("Show [22]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2, Cascade} time=")); bot.button("Clear").click(); SWTBotMenu cascade2 = cascade1.menu("Cascade"); assertThat(listeners.getText(), containsString("Arm [30]: ArmEvent{MenuItem {Cascade} time=")); assertThat(listeners.getText(), containsString("Show [22]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2} time=")); bot.button("Clear").click(); SWTBotMenu menuItem = cascade2.menu("Push"); assertThat(listeners.getText(), containsString("Arm [30]: ArmEvent{MenuItem {Push} time=")); bot.button("Clear").click(); menuItem.click(); assertThat(listeners.getText(), containsString("Hide [23]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2} time=")); assertThat(listeners.getText(), containsString("Hide [23]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2, Cascade} time=")); assertThat(listeners.getText(), containsString("Hide [23]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2, Cascade} time=")); assertThat(listeners.getText(), containsString("Selection [13]: SelectionEvent{MenuItem {Push} time=")); assertThat(listeners.getText(), containsString("Clicked on menu item: POP_UP > Cascade > Cascade > Push")); } @Test public void clicksCheckMenuItem() throws Exception { SWTBotMenu item = popupShell.contextMenu("Check").hide(); boolean checked = item.isChecked(); popupShell.contextMenu("Check").click(); assertTrue(checked != item.isChecked()); popupShell.contextMenu("Check").click(); assertTrue(checked == item.isChecked()); } @Test public void clicksRadioMenuItem() throws Exception { SWTBotMenu item1 = popupShell.contextMenu("Radio1").hide(); SWTBotMenu item2 = popupShell.contextMenu("Radio2").hide(); popupShell.contextMenu("Radio1").click(); assertTrue(item1.isChecked()); assertTrue(!item2.isChecked()); popupShell.contextMenu("Radio1").click(); assertTrue(item1.isChecked()); assertTrue(!item2.isChecked()); popupShell.contextMenu("Radio2").click(); assertTrue(!item1.isChecked()); assertTrue(item2.isChecked()); } @Test public void testMenuItems() { SWTBotRootMenu popupMenu = popupShell.contextMenu(); assertEquals(Arrays.asList("Push", "", "Check", "Radio1", "Radio2", "Cascade"), popupMenu.menuItems()); SWTBotMenu cascade = popupMenu.menu("Cascade"); assertEquals(Arrays.asList("Push", "", "Check", "Radio1", "Radio2", "Cascade"), cascade.menuItems()); SWTBotMenu push = cascade.menu("Push"); assertEquals(Arrays.asList(), push.menuItems()); } @Before public void setUp() throws Exception { bot = new SWTBot().activeShell().bot(); bot.tabItem("Menu").activate(); bot.checkBox("Listen").select(); listeners = bot.textInGroup("Listeners"); bot.checkBox("SWT.POP_UP").select(); bot.checkBox("SWT.DROP_DOWN").select(); bot.checkBox("SWT.CASCADE").select(); bot.checkBox("SWT.CHECK").select(); bot.checkBox("SWT.PUSH").select(); bot.checkBox("SWT.RADIO").select(); bot.checkBox("SWT.SEPARATOR").select(); bot.checkBox("Sub-Menu").select(); bot.checkBox("Sub-Sub-Menu").select(); if (menuType.equals(MenuType.StaticMenu)) { bot.checkBox("Menu Manager").deselect(); bot.button("Create Shell").click(); popupShell = bot.shell("Title:0"); } else if (menuType.equals(MenuType.DynamicMenu)) { bot.checkBox("Menu Manager").select(); bot.checkBox("Dynamic").select(); bot.button("Create Shell").click(); popupShell = bot.shell("Title:0"); } bot.button("Clear").click(); } @After public void tearDown() throws Exception { bot.button("Close All Shells").click(); } }