alexruiz / fest-swing-1.x

FEST Functional Swing Testing
http://fest.easytesting.org
109 stars 34 forks source link

FindActivePopup does not work for cascade JPopupMenu with JMenu cascading items #6

Open DaveBrad opened 11 years ago

DaveBrad commented 11 years ago

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 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 found = new ArrayList(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 found = new ArrayList(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() { @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());

}