001    /*
002     * Created on Jan 31, 2008
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
005     * the License. You may obtain a copy of the License at
006     *
007     * http://www.apache.org/licenses/LICENSE-2.0
008     *
009     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
010     * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011     * specific language governing permissions and limitations under the License.
012     *
013     * Copyright @2008-2010 the original author or authors.
014     */
015    package org.fest.swing.driver;
016    
017    import static org.fest.swing.driver.JPopupMenuElementsAsTextQuery.menuElementsAsText;
018    
019    import java.awt.Container;
020    
021    import javax.swing.JMenuItem;
022    import javax.swing.JPopupMenu;
023    
024    import org.fest.swing.annotation.RunsInEDT;
025    import org.fest.swing.core.GenericTypeMatcher;
026    import org.fest.swing.core.Robot;
027    import org.fest.swing.exception.ComponentLookupException;
028    
029    /**
030     * Understands functional testing of <code>{@link JPopupMenu}</code>s:
031     * <ul>
032     * <li>user input simulation</li>
033     * <li>state verification</li>
034     * <li>property value query</li>
035     * </ul>
036     * This class is intended for internal use only. Please use the classes in the package
037     * <code>{@link org.fest.swing.fixture}</code> in your tests.
038     *
039     * @author Yvonne Wang
040     * @author Alex Ruiz
041     */
042    public class JPopupMenuDriver extends JComponentDriver {
043    
044      /**
045       * Creates a new </code>{@link JPopupMenuDriver}</code>.
046       * @param robot the robot to use to simulate user input.
047       */
048      public JPopupMenuDriver(Robot robot) {
049        super(robot);
050      }
051    
052      /**
053       * Returns the contents of the pop-up menu as a <code>String</code> array.
054       * @param popupMenu the target <code>JPopupMenu</code>.
055       * @return the contents of the pop-up menu as a <code>String</code> array.
056       */
057      @RunsInEDT
058      public String[] menuLabelsOf(JPopupMenu popupMenu) {
059        return menuElementsAsText(popupMenu);
060      }
061    
062      /**
063       * Finds a <code>{@link JMenuItem}</code>, contained in the <code>{@link Container}</code>, which name matches
064       * the specified one.
065       * @param popupMenu the target <code>JPopupMenu</code>.
066       * @param name the name to match.
067       * @return the <code>JMenuItem</code> found.
068       * @throws ComponentLookupException if a <code>JMenuItem</code> having a matching name could not be found.
069       * @throws ComponentLookupException if more than one <code>JMenuItem</code> having a matching name is found.
070       */
071      @RunsInEDT
072      public JMenuItem menuItem(JPopupMenu popupMenu, String name) {
073        return robot.finder().findByName(popupMenu, name, JMenuItem.class, false);
074      }
075    
076      /**
077       * Finds a <code>{@link JMenuItem}</code>, contained in the <code>{@link Container}</code>, that matches the
078       * specified search criteria.
079       * @param popupMenu the target <code>JPopupMenu</code>.
080       * @param matcher contains the search criteria for finding a <code>JMenuItem</code>.
081       * @return the <code>JMenuItem</code> found.
082       * @throws ComponentLookupException if a <code>JMenuItem</code> that matches the given search criteria could not be
083       * found.
084       * @throws ComponentLookupException if more than one <code>JMenuItem</code> that matches the given search criteria
085       * is found.
086       */
087      public JMenuItem menuItem(JPopupMenu popupMenu, GenericTypeMatcher<? extends JMenuItem> matcher) {
088        return robot.finder().find(popupMenu, matcher);
089      }
090    }