diff options
author | Patrick Tasse | 2015-09-23 14:58:59 +0000 |
---|---|---|
committer | Patrick Tasse | 2015-09-23 21:38:18 +0000 |
commit | 1fc201634f1282dc30114bf6dc0deb38172f380d (patch) | |
tree | fe0025b975a304784e39b16a00190a28bc47cbf3 | |
parent | 47f2f5538654377f31c6d5ace5fb42c19f8f2b42 (diff) | |
download | org.eclipse.swtbot-1fc201634f1282dc30114bf6dc0deb38172f380d.tar.gz org.eclipse.swtbot-1fc201634f1282dc30114bf6dc0deb38172f380d.tar.xz org.eclipse.swtbot-1fc201634f1282dc30114bf6dc0deb38172f380d.zip |
Test dynamic menus in SWTBotPopupMenuTest
Each unit test is now run twice, once with static menus and once with
dynamic menus.
The MenuTab example is updated to hook listeners on the shell. It is
updated to use a new Push action instance every time the dynamic menu is
populated (this allows testing that a new MenuItem is created and the
old MenuItem is disposed). It is also fixed so that sub-menus properly
support the Dynamic option, and to replace the use of recent method
MenuManager.setImageDescriptor() which is not available for all targets.
The targets are updated to use JUnit 4.12 for the parameterized test.
Change-Id: I36547154c8e7fad5fcbfbd3221f11f89c4f84261
Signed-off-by: Patrick Tasse <patrick.tasse@gmail.com>
6 files changed, 114 insertions, 66 deletions
diff --git a/devtools/target-platforms/indigo/indigo.target b/devtools/target-platforms/indigo/indigo.target index 98bc7f73..00da3749 100644 --- a/devtools/target-platforms/indigo/indigo.target +++ b/devtools/target-platforms/indigo/indigo.target @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?pde version="3.8"?><target name="Eclipse Indigo via p2" sequenceNumber="59"> +<?pde version="3.8"?><target name="Eclipse Indigo via p2" sequenceNumber="60"> <locations> <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.jdt.feature.group" version="3.7.2.v20120120-1414-7z8gFcuFMP7BW5XTz0jLTnz0l9B1"/> @@ -12,14 +12,14 @@ <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.apache.log4j" version="1.2.15.v201012070815"/> <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/> -<unit id="org.junit" version="4.11.0.v201303080030"/> +<unit id="org.junit" version="4.12.0.v201504281640"/> <unit id="com.thoughtworks.qdox" version="1.6.3.v20081201-1400"/> <unit id="javax.inject" version="1.0.0.v20091030"/> -<unit id="org.hamcrest.library" version="1.3.0.v201305281000"/> -<unit id="org.hamcrest.library.source" version="1.3.0.v201305281000"/> +<unit id="org.hamcrest.library" version="1.3.0.v201505072020"/> +<unit id="org.hamcrest.library.source" version="1.3.0.v201505072020"/> <unit id="org.hamcrest.core" version="1.3.0.v201303031735"/> <unit id="org.hamcrest.core.source" version="1.3.0.v201303031735"/> -<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/"/> +<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20150821153341/repository/"/> </location> <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.license.feature.group" version="1.0.1.v20140414-1359"/> diff --git a/devtools/target-platforms/juno/juno.target b/devtools/target-platforms/juno/juno.target index ee7f1961..ad15a93f 100644 --- a/devtools/target-platforms/juno/juno.target +++ b/devtools/target-platforms/juno/juno.target @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?pde version="3.8"?><target name="Eclipse via p2" sequenceNumber="51"> +<?pde version="3.8"?><target name="Eclipse via p2" sequenceNumber="52"> <locations> <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.platform.ide" version="4.2.1.M20120914-1800"/> @@ -13,14 +13,14 @@ <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.apache.log4j" version="1.2.15.v201012070815"/> <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/> -<unit id="org.junit" version="4.11.0.v201303080030"/> +<unit id="org.junit" version="4.12.0.v201504281640"/> <unit id="com.thoughtworks.qdox" version="1.6.3.v20081201-1400"/> <unit id="javax.inject" version="1.0.0.v20091030"/> -<unit id="org.hamcrest.library" version="1.3.0.v201305281000"/> -<unit id="org.hamcrest.library.source" version="1.3.0.v201305281000"/> +<unit id="org.hamcrest.library" version="1.3.0.v201505072020"/> +<unit id="org.hamcrest.library.source" version="1.3.0.v201505072020"/> <unit id="org.hamcrest.core" version="1.3.0.v201303031735"/> <unit id="org.hamcrest.core.source" version="1.3.0.v201303031735"/> -<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/"/> +<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20150821153341/repository/"/> </location> <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.license.feature.group" version="1.0.1.v20140414-1359"/> diff --git a/devtools/target-platforms/kepler/kepler.target b/devtools/target-platforms/kepler/kepler.target index a07ea380..cfb45ab5 100644 --- a/devtools/target-platforms/kepler/kepler.target +++ b/devtools/target-platforms/kepler/kepler.target @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?pde version="3.8"?><target name="Eclipse via p2" sequenceNumber="51"> +<?pde version="3.8"?><target name="Eclipse via p2" sequenceNumber="52"> <locations> <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.platform.ide" version="0.0.0"/> @@ -13,14 +13,14 @@ <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.apache.log4j" version="1.2.15.v201012070815"/> <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/> -<unit id="org.junit" version="4.11.0.v201303080030"/> +<unit id="org.junit" version="4.12.0.v201504281640"/> <unit id="com.thoughtworks.qdox" version="1.6.3.v20081201-1400"/> <unit id="javax.inject" version="1.0.0.v20091030"/> -<unit id="org.hamcrest.library" version="1.3.0.v201305281000"/> -<unit id="org.hamcrest.library.source" version="1.3.0.v201305281000"/> +<unit id="org.hamcrest.library" version="1.3.0.v201505072020"/> +<unit id="org.hamcrest.library.source" version="1.3.0.v201505072020"/> <unit id="org.hamcrest.core" version="1.3.0.v201303031735"/> <unit id="org.hamcrest.core.source" version="1.3.0.v201303031735"/> -<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/"/> +<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20150821153341/repository/"/> </location> <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.license.feature.group" version="1.0.1.v20140414-1359"/> diff --git a/devtools/target-platforms/luna/luna.target b/devtools/target-platforms/luna/luna.target index f9d1249c..ef2c98d2 100644 --- a/devtools/target-platforms/luna/luna.target +++ b/devtools/target-platforms/luna/luna.target @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?pde version="3.8"?><target name="Eclipse via p2" sequenceNumber="1"> +<?pde version="3.8"?><target name="Eclipse via p2" sequenceNumber="2"> <locations> <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.platform.ide" version="0.0.0"/> @@ -13,14 +13,14 @@ <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.apache.log4j" version="1.2.15.v201012070815"/> <unit id="org.apache.log4j.source" version="1.2.15.v201012070815"/> -<unit id="org.junit" version="4.11.0.v201303080030"/> +<unit id="org.junit" version="4.12.0.v201504281640"/> <unit id="com.thoughtworks.qdox" version="1.6.3.v20081201-1400"/> <unit id="javax.inject" version="1.0.0.v20091030"/> -<unit id="org.hamcrest.library" version="1.3.0.v201305281000"/> -<unit id="org.hamcrest.library.source" version="1.3.0.v201305281000"/> +<unit id="org.hamcrest.library" version="1.3.0.v201505072020"/> +<unit id="org.hamcrest.library.source" version="1.3.0.v201505072020"/> <unit id="org.hamcrest.core" version="1.3.0.v201303031735"/> <unit id="org.hamcrest.core.source" version="1.3.0.v201303031735"/> -<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/"/> +<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20150821153341/repository/"/> </location> <location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit"> <unit id="org.eclipse.license.feature.group" version="1.0.1.v20140414-1359"/> diff --git a/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/MenuTab.java b/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/MenuTab.java index 4e0842b2..849fb360 100644 --- a/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/MenuTab.java +++ b/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/MenuTab.java @@ -31,6 +31,7 @@ import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -94,6 +95,7 @@ class MenuTab extends Tab { /* Create the shell and menu(s) */ Shell shell = new Shell(SWT.SHELL_TRIM | orientation); + hookListeners(shell); shells[shellCount] = shell; if (barButton.getSelection()) { if (!menuManagerButton.getSelection()) { @@ -291,12 +293,9 @@ class MenuTab extends Tab { if (dropDownButton.getSelection() && cascadeButton.getSelection()) { /* Create cascade button and drop-down menu in menu bar. */ - MenuManager dropDownMenuManager = new HookedMenuManager(getMenuItemText("Cascade")); + MenuManager dropDownMenuManager = new HookedMenuManager(getMenuItemText("Cascade"), instance.images[ControlExample.ciOpenFolder]); dropDownMenuManager.setRemoveAllWhenShown(dynamicButton.getSelection()); menuManager.add(dropDownMenuManager); - if (imagesButton.getSelection()) { - dropDownMenuManager.setImageDescriptor(ImageDescriptor.createFromImage(instance.images[ControlExample.ciOpenFolder])); - } if (dynamicButton.getSelection()) { dropDownMenuManager.addMenuListener(new IMenuListener() { @@ -404,10 +403,16 @@ class MenuTab extends Tab { } /* Create various menu manager contribution items, depending on selections. */ - void createMenuContributionItems(IMenuManager menu, Menu rootMenu, int depth, boolean createSubMenu, boolean createSubSubMenu) { + void createMenuContributionItems(IMenuManager menu, final Menu rootMenu, final int depth, final boolean createSubMenu, final boolean createSubSubMenu) { if (pushButton.getSelection()) { - IAction action = getAction(rootMenu, depth, getMenuItemText("Push"), IAction.AS_PUSH_BUTTON, false, - SWT.MOD1 + SWT.MOD2 + 'P', ImageDescriptor.createFromImage(instance.images[ControlExample.ciClosedFolder])); + /* Creating a new action instance will force the old MenuItem to be disposed */ + Action action = new Action(getMenuItemText("Push"), IAction.AS_PUSH_BUTTON) {}; + if (acceleratorsButton.getSelection()) { + action.setAccelerator(SWT.MOD1 + SWT.MOD2 + 'P'); + } + if (imagesButton.getSelection()) { + action.setImageDescriptor(ImageDescriptor.createFromImage(instance.images[ControlExample.ciClosedFolder])); + } menu.add(action); } @@ -432,12 +437,20 @@ class MenuTab extends Tab { if (createSubMenu && cascadeButton.getSelection()) { /* Create cascade button and drop-down menu for the sub-menu. */ - MenuManager subMenuManager = new HookedMenuManager(getMenuItemText("Cascade")); + MenuManager subMenuManager = new HookedMenuManager(getMenuItemText("Cascade"), instance.images[ControlExample.ciOpenFolder]); + subMenuManager.setRemoveAllWhenShown(dynamicButton.getSelection()); menu.add(subMenuManager); - if (imagesButton.getSelection()) - subMenuManager.setImageDescriptor(ImageDescriptor.createFromImage(instance.images[ControlExample.ciOpenFolder])); - createMenuContributionItems(subMenuManager, rootMenu, depth + 1, createSubSubMenu, false); + if (dynamicButton.getSelection()) { + subMenuManager.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + /* Create various menu items, depending on selections. */ + createMenuContributionItems(manager, rootMenu, depth + 1, createSubSubMenu, false); + } + }); + } else { + createMenuContributionItems(subMenuManager, rootMenu, depth + 1, createSubSubMenu, false); + } } } @@ -501,18 +514,24 @@ class MenuTab extends Tab { /* Menu manager that hooks listeners to its widgets as they are created */ private class HookedMenuManager extends MenuManager { + private Image image; + public HookedMenuManager() { - this(null); + this(null, null); } - public HookedMenuManager(String text) { + public HookedMenuManager(String text, Image image) { super(text); + this.image = image; } @Override protected void doItemFill(IContributionItem ci, int index) { super.doItemFill(ci, index); Item item = getMenuItem(index); + if (imagesButton.getSelection() && ci instanceof HookedMenuManager) { + item.setImage(((HookedMenuManager) ci).image); + } hookListeners(item); if (item instanceof MenuItem) { MenuItem menuItem = (MenuItem) item; diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotPopupMenuTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotPopupMenuTest.java index bf6c4eac..88ea5952 100644 --- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotPopupMenuTest.java +++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotPopupMenuTest.java @@ -7,7 +7,8 @@ * * Contributors: * Ketan Padegaonkar - initial API and implementation - * Patrick Tasse - Fix radio menu item click behavior (Bug 451126 & Bug 397649) + * Patrick Tasse - Fix radio menu item click behavior (Bug 451126 & Bug 397649), + * test dynamic menus *******************************************************************************/ package org.eclipse.swtbot.swt.finder.widgets; @@ -19,46 +20,83 @@ import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertNotNull; 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.hamcrest.core.AnyOf; 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 SWTBotShell activeShell; + 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 { assertNotNull(popupShell.contextMenu("Push").widget); - assertSameWidget(popupShell.contextMenu("Push").widget, popupShell.contextMenu("Push").widget); + if (menuType == MenuType.StaticMenu) { + assertSameWidget(popupShell.contextMenu("Push").widget, popupShell.contextMenu("Push").widget); + } else { + /* Dynamic menu manager disposes the old MenuItem */ + assertNotSameWidget(popupShell.contextMenu("Push").widget, popupShell.contextMenu("Push").widget); + } } @Test public void findsSubMenus() throws Exception { - SWTBotMenu cascade = popupShell.contextMenu("Cascade"); - assertNotSameWidget(cascade.menu("Push").widget, popupShell.contextMenu("Push").widget); - assertNotSameWidget(cascade.menu("Cascade").menu("Push").widget, popupShell.contextMenu("Push").widget); + SWTBotMenu push1 = popupShell.contextMenu("Push"); + SWTBotMenu cascade1 = popupShell.contextMenu("Cascade"); + SWTBotMenu push2 = cascade1.menu("Push"); + SWTBotMenu cascade2 = cascade1.menu("Cascade"); + SWTBotMenu push3 = cascade2.menu("Push"); + assertNotNull(push1.widget); + assertNotNull(push2.widget); + assertNotNull(push3.widget); + assertNotSameWidget(push2.widget, push1.widget); + assertNotSameWidget(push3.widget, push1.widget); + assertNotSameWidget(push3.widget, push2.widget); + if (menuType == MenuType.StaticMenu) { + assertSameWidget(push3.widget, cascade2.menu("Push").widget); + assertSameWidget(push3.widget, cascade1.menu("Cascade").menu("Push").widget); + assertSameWidget(push3.widget, popupShell.contextMenu("Cascade").menu("Cascade").menu("Push").widget); + } else { + /* Dynamic menu manager disposes the old MenuItem */ + assertNotSameWidget(push3.widget, cascade2.menu("Push").widget); + assertNotSameWidget(push3.widget, cascade1.menu("Cascade").menu("Push").widget); + assertNotSameWidget(push3.widget, popupShell.contextMenu("Cascade").menu("Cascade").menu("Push").widget); + } } @Test public void clicksMenu() throws Exception { - tearDown(); - activeShell.activate(); - bot.checkBox("Listen").select(); - setUp(); + bot.button("Clear").click(); popupShell.contextMenu("Push").click(); - activeShell.activate(); String text = bot.textInGroup("Listeners").getText(); - // FIXME https://bugs.eclipse.org/bugs/show_bug.cgi?id=209752 - // FIXED > 071114 String expectedLinux = "Show [22]: MenuEvent{Menu {Push, , Check, Radio1, Radio2, Cascade} time="; String expectedWindows = "Show [22]: MenuEvent{Menu {Push, |, Check, Radio1, Radio2, Cascade} time="; assertThat(text, AnyOf.anyOf(containsString(expectedWindows), containsString(expectedLinux))); @@ -92,8 +130,7 @@ public class SWTBotPopupMenuTest extends AbstractControlExampleTest { @Before public void setUp() throws Exception { - bot = new SWTBot(); - activeShell = bot.activeShell(); + bot = new SWTBot().activeShell().bot(); bot.tabItem("Menu").activate(); bot.checkBox("Listen").select(); @@ -106,29 +143,21 @@ public class SWTBotPopupMenuTest extends AbstractControlExampleTest { bot.checkBox("Sub-Menu").select(); bot.checkBox("Sub-Sub-Menu").select(); - bot.checkBox("SWT.BAR").select(); - bot.button("Create Shell").click(); - popupShell = bot.shell("Title:0"); - popupShell.activate(); + 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"); + } } @After public void tearDown() throws Exception { - popupShell.close(); bot.button("Close All Shells").click(); - bot.checkBox("Listen").deselect(); - - bot.checkBox("Listen").deselect(); - - bot.checkBox("SWT.CASCADE").deselect(); - bot.checkBox("SWT.CHECK").deselect(); - bot.checkBox("SWT.PUSH").deselect(); - bot.checkBox("SWT.RADIO").deselect(); - bot.checkBox("SWT.SEPARATOR").deselect(); - - bot.checkBox("Sub-Sub-Menu").deselect(); - bot.checkBox("Sub-Menu").deselect(); - bot.checkBox("SWT.BAR").deselect(); } } |