fest-swing-1.x
fest-swing-1.x copied to clipboard
FindActivePopup does not work for cascade JPopupMenu with JMenu cascading items
When I test using findActivePopup I found that JPopupMenu with a cascade menu fails to found a popup.
On investigation (using FEST-Swing source code and debug via eclipse) the method private JPopupMenu activePopupMenu() of BasicRobot.java was doing a finder action and the found List<Component> structure had more than one item (JPopupMenu, JMenu). Thus the test for found.size() == 1 was failing. Changing the test to >= 1 resolved the problem.
Any chance this can be put into the new release of FEST-Swing?
Below is the code and a JUnit test for testing with a cascade.
BasicRobot.java
@RunsInEDT private JPopupMenu activePopupMenu() { List<Component> found = new ArrayList<Component>(finder().findAll(POPUP_MATCHER)); if (found.size() == 1) return (JPopupMenu)found.get(0); return null; }
advise to change to >= from == as the finder seems to find additional cascade jmenu in the array too
@RunsInEDT private JPopupMenu activePopupMenu() { List<Component> found = new ArrayList<Component>(finder().findAll(POPUP_MATCHER)); if (found.size() >= 1) return (JPopupMenu)found.get(0); return null; }
BasicRobot_findActivePopupMenu_Test.java
@RunsInEDT final JPopupMenu addPopupMenuToTextFieldWithCascade() { return createAndSetPopupMenuWithCascade(window.textField, "Luke", "Leia"); }
@RunsInEDT public static JPopupMenu createAndSetPopupMenuWithCascade(final JComponent c, final String...items) { return execute(new GuiQuery<JPopupMenu>() { @Override protected JPopupMenu executeInEDT() { JPopupMenu popupMenu = new JPopupMenu();
JMenu menu2 = new JMenu("cascade test");
menu2.add(new JMenuItem("cascade line 1"));
menu2.add(new JMenuItem("cascade line 2"));
popupMenu.add(menu2);
popupMenu.add(new JMenuItem(items[0]));
popupMenu.add(menu2);
popupMenu.add(new JMenuItem(items[1]));
c.setComponentPopupMenu(popupMenu); // causes popup-menu to display
return popupMenu;
}
});
}
@Test public void should_return_active_popupMenu_cascadingPopup() { addPopupMenuToTextFieldWithCascade(); robot.showPopupMenu(window.textField);
// wait for 2nd cascade menu to show
pause(1000);
JPopupMenu found = robot.findActivePopupMenu();
MenuElement[] meArr = found.getSubElements();
Component comp = meArr[0].getComponent();
assertThat("cascade line 1").isEqualTo(((JMenuItem)comp).getText());
}