/******************************************************************************* * 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 - 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; @RunWith(Parameterized.class) public class SWTBotMenuBarTest extends AbstractControlExampleTest { 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 SWTBotMenuBarTest(MenuType menuType) { this.menuType = menuType; } @Test public void findsMenus() throws Exception { SWTBotMenu menuItem; menuItem = bot.menu().menu("Cascade").menu("Push").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "&Push\tCtrl+Shift+P" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Check").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "&Check\tCtrl+Shift+C" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Radio1").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "Radio&1\tCtrl+Shift+1" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Radio2").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "Radio&2\tCtrl+Shift+2" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade" }, getTextPath(menuItem.widget)); } @Test public void findsSubMenus() throws Exception { SWTBotMenu menuItem; menuItem = bot.menu().menu("Cascade").menu("Cascade").menu("Push").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "&Push\tCtrl+Shift+P" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade").menu("Check").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "&Check\tCtrl+Shift+C" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade").menu("Radio1").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "Radio&1\tCtrl+Shift+1" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade").menu("Radio2").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "Radio&2\tCtrl+Shift+2" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade").menu("Cascade").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "C&ascade" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade", "Cascade", "Push").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "C&ascade", "&Push\tCtrl+Shift+P" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade", "Cascade", "Check").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "C&ascade", "&Check\tCtrl+Shift+C" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade", "Cascade", "Radio1").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "C&ascade", "Radio&1\tCtrl+Shift+1" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Cascade", "Cascade", "Radio2").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "C&ascade", "Radio&2\tCtrl+Shift+2" }, getTextPath(menuItem.widget)); } @Test public void findsMenusRecursive() throws Exception { SWTBotMenu menuItem; menuItem = bot.menu("Push").hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "&Push\tCtrl+Shift+P" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Push", true, 0).hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "&Push\tCtrl+Shift+P" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Push", true, 1).hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "&Push\tCtrl+Shift+P" }, getTextPath(menuItem.widget)); menuItem = bot.menu().menu("Cascade").menu("Push", true, 2).hide(); assertArrayEquals(new String[] { "BAR", "C&ascade", "C&ascade", "C&ascade", "&Push\tCtrl+Shift+P" }, getTextPath(menuItem.widget)); } @Test public void clicksMenu() throws Exception { SWTBotRootMenu menuBar = bot.menu(); SWTBotMenu cascade = menuBar.menu("Cascade"); bot.button("Clear").click(); SWTBotMenu menuItem = cascade.menu("Push"); assertThat(listeners.getText(), containsString("Arm [30]: ArmEvent{MenuItem {&Push\tCtrl+Shift+P} time=")); bot.button("Clear").click(); menuItem.click(); assertThat(listeners.getText(), containsString("Hide [23]: MenuEvent{Menu {&Push\tCtrl+Shift+P, |, &Check\tCtrl+Shift+C, Radio&1\tCtrl+Shift+1, Radio&2\tCtrl+Shift+2, C&ascade} time=")); assertThat(listeners.getText(), containsString("Selection [13]: SelectionEvent{MenuItem {&Push\tCtrl+Shift+P} time=")); assertThat(listeners.getText(), containsString("Clicked on menu item: BAR > C&ascade > &Push\tCtrl+Shift+P")); } @Test public void clicksSubMenu() throws Exception { SWTBotRootMenu menuBar = bot.menu(); SWTBotMenu cascade = menuBar.menu("Cascade"); bot.button("Clear").click(); SWTBotMenu cascade1 = cascade.menu("Cascade"); assertThat(listeners.getText(), containsString("Arm [30]: ArmEvent{MenuItem {C&ascade} time=")); assertThat(listeners.getText(), containsString("Show [22]: MenuEvent{Menu {&Push\tCtrl+Shift+P, |, &Check\tCtrl+Shift+C, Radio&1\tCtrl+Shift+1, Radio&2\tCtrl+Shift+2, C&ascade} time=")); bot.button("Clear").click(); SWTBotMenu cascade2 = cascade1.menu("Cascade"); assertThat(listeners.getText(), containsString("Arm [30]: ArmEvent{MenuItem {C&ascade} time=")); assertThat(listeners.getText(), containsString("Show [22]: MenuEvent{Menu {&Push\tCtrl+Shift+P, |, &Check\tCtrl+Shift+C, Radio&1\tCtrl+Shift+1, Radio&2\tCtrl+Shift+2} time=")); bot.button("Clear").click(); SWTBotMenu menuItem = cascade2.menu("Push"); assertThat(listeners.getText(), containsString("Arm [30]: ArmEvent{MenuItem {&Push\tCtrl+Shift+P} time=")); bot.button("Clear").click(); menuItem.click(); assertThat(listeners.getText(), containsString("Hide [23]: MenuEvent{Menu {&Push\tCtrl+Shift+P, |, &Check\tCtrl+Shift+C, Radio&1\tCtrl+Shift+1, Radio&2\tCtrl+Shift+2} time=")); assertThat(listeners.getText(), containsString("Hide [23]: MenuEvent{Menu {&Push\tCtrl+Shift+P, |, &Check\tCtrl+Shift+C, Radio&1\tCtrl+Shift+1, Radio&2\tCtrl+Shift+2, C&ascade} time=")); assertThat(listeners.getText(), containsString("Hide [23]: MenuEvent{Menu {&Push\tCtrl+Shift+P, |, &Check\tCtrl+Shift+C, Radio&1\tCtrl+Shift+1, Radio&2\tCtrl+Shift+2, C&ascade} time=")); assertThat(listeners.getText(), containsString("Selection [13]: SelectionEvent{MenuItem {&Push\tCtrl+Shift+P} time=")); assertThat(listeners.getText(), containsString("Clicked on menu item: BAR > C&ascade > C&ascade > C&ascade > &Push\tCtrl+Shift+P")); } @Test public void clicksCheckMenuItem() throws Exception { SWTBotMenu item = bot.menu("Check").hide(); boolean checked = item.isChecked(); bot.menu("Check").click(); assertTrue(checked != item.isChecked()); bot.menu("Check").click(); assertTrue(checked == item.isChecked()); } @Test public void clicksRadioMenuItem() throws Exception { SWTBotMenu item1 = bot.menu("Radio1").hide(); SWTBotMenu item2 = bot.menu("Radio2").hide(); bot.menu("Radio1").click(); assertTrue(item1.isChecked()); assertTrue(!item2.isChecked()); bot.menu("Radio1").click(); assertTrue(item1.isChecked()); assertTrue(!item2.isChecked()); bot.menu("Radio2").click(); assertTrue(!item1.isChecked()); assertTrue(item2.isChecked()); } @Test public void testMenuItems() { SWTBotRootMenu menuBar = bot.menu(); assertEquals(Arrays.asList("Cascade"), menuBar.menuItems()); SWTBotMenu cascade = menuBar.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.BAR").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("Images").select(); bot.checkBox("Accelerators").select(); bot.checkBox("Mnemonics").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(); bot.shell("Title:0").activate(); } else if (menuType.equals(MenuType.DynamicMenu)) { bot.checkBox("Menu Manager").select(); bot.checkBox("Dynamic").select(); bot.button("Create Shell").click(); bot.shell("Title:0").activate(); } bot.button("Clear").click(); } @After public void tearDown() throws Exception { bot.button("Close All Shells").click(); } }