001    /*
002     * Created on Oct 20, 2006
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005     * in compliance with 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
010     * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011     * or implied. See the License for the specific language governing permissions and limitations under
012     * the License.
013     *
014     * Copyright @2006-2010 the original author or authors.
015     */
016    package org.fest.swing.fixture;
017    
018    import javax.swing.JMenuItem;
019    
020    import org.fest.swing.core.KeyPressInfo;
021    import org.fest.swing.core.Robot;
022    import org.fest.swing.driver.JMenuItemDriver;
023    import org.fest.swing.exception.ActionFailedException;
024    import org.fest.swing.exception.ComponentLookupException;
025    import org.fest.swing.timing.Timeout;
026    
027    /**
028     * Understands functional testing of <code>{@link JMenuItem}</code>s:
029     * <ul>
030     * <li>user input simulation</li>
031     * <li>state verification</li>
032     * <li>property value query</li>
033     * </ul>
034     *
035     * @author Alex Ruiz
036     */
037    public class JMenuItemFixture extends ComponentFixture<JMenuItem> implements KeyboardInputSimulationFixture,
038        StateVerificationFixture {
039    
040      private JMenuItemDriver driver;
041    
042      /**
043       * Creates a new <code>{@link JMenuItemFixture}</code>.
044       * @param robot performs simulation of user events on a <code>JMenuItem</code>.
045       * @param menuItemName the name of the <code>JMenuItem</code> to find using the given <code>Robot</code>.
046       * @throws NullPointerException if <code>robot</code> is <code>null</code>.
047       * @throws ComponentLookupException if a matching <code>JMenuItem</code> could not be found.
048       * @throws ComponentLookupException if more than one matching <code>JMenuItem</code> is found.
049       */
050      public JMenuItemFixture(Robot robot, String menuItemName) {
051        this(robot, robot.finder().findByName(menuItemName, JMenuItem.class, false));
052      }
053    
054      /**
055       * Creates a new <code>{@link JMenuItemFixture}</code>.
056       * @param robot performs simulation of user events on the given <code>JMenuItem</code>.
057       * @param target the <code>JMenuItem</code> to be managed by this fixture.
058       * @throws NullPointerException if <code>robot</code> is <code>null</code>.
059       * @throws NullPointerException if <code>target</code> is <code>null</code>.
060       */
061      public JMenuItemFixture(Robot robot, JMenuItem target) {
062        super(robot, target);
063        driver(new JMenuItemDriver(robot));
064      }
065    
066      /**
067       * Sets the <code>{@link JMenuItemDriver}</code> to be used by this fixture.
068       * @param newDriver the new <code>JMenuItemDriver</code>.
069       * @throws NullPointerException if the given driver is <code>null</code>.
070       */
071      protected final void driver(JMenuItemDriver newDriver) {
072        validateNotNull(newDriver);
073        driver = newDriver;
074      }
075    
076      /**
077       * Simulates a user selecting this fixture's <code>{@link JMenuItem}</code>.
078       * @return this fixture.
079       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is disabled.
080       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is not showing on the screen.
081       * @throws ActionFailedException if the menu has a pop-up and it fails to show up.
082       */
083      public JMenuItemFixture click() {
084        driver.click(target);
085        return this;
086      }
087    
088      /**
089       * Gives input focus to this fixture's <code>{@link JMenuItem}</code>.
090       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is disabled.
091       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is not showing on the screen.
092       * @return this fixture.
093       */
094      public JMenuItemFixture focus() {
095        driver.focus(target);
096        return this;
097      }
098    
099      /**
100       * Simulates a user pressing given key with the given modifiers on this fixture's <code>{@link JMenuItem}</code>.
101       * Modifiers is a mask from the available <code>{@link java.awt.event.InputEvent}</code> masks.
102       * @param keyPressInfo specifies the key and modifiers to press.
103       * @return this fixture.
104       * @throws NullPointerException if the given <code>KeyPressInfo</code> is <code>null</code>.
105       * @throws IllegalArgumentException if the given code is not a valid key code.
106       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is disabled.
107       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is not showing on the screen.
108       * @see KeyPressInfo
109       */
110      public JMenuItemFixture pressAndReleaseKey(KeyPressInfo keyPressInfo) {
111        driver.pressAndReleaseKey(target, keyPressInfo);
112        return this;
113      }
114    
115      /**
116       * Simulates a user pressing and releasing the given keys on this fixture's <code>{@link JMenuItem}</code>.
117       * @param keyCodes one or more codes of the keys to press.
118       * @return this fixture.
119       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is disabled.
120       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is not showing on the screen.
121       * @see java.awt.event.KeyEvent
122       */
123      public JMenuItemFixture pressAndReleaseKeys(int... keyCodes) {
124        driver.pressAndReleaseKeys(target, keyCodes);
125        return this;
126      }
127    
128      /**
129       * Simulates a user pressing the given key on this fixture's <code>{@link JMenuItem}</code>.
130       * @param keyCode the code of the key to press.
131       * @return this fixture.
132       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is disabled.
133       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is not showing on the screen.
134       * @see java.awt.event.KeyEvent
135       */
136      public JMenuItemFixture pressKey(int keyCode) {
137        driver.pressKey(target, keyCode);
138        return this;
139      }
140    
141      /**
142       * Simulates a user releasing the given key on this fixture's <code>{@link JMenuItem}</code>.
143       * @param keyCode the code of the key to release.
144       * @return this fixture.
145       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is disabled.
146       * @throws IllegalStateException if this fixture's <code>JMenuItem</code> is not showing on the screen.
147       * @see java.awt.event.KeyEvent
148       */
149      public JMenuItemFixture releaseKey(int keyCode) {
150        driver.releaseKey(target, keyCode);
151        return this;
152      }
153    
154      /**
155       * Asserts that this fixture's <code>{@link JMenuItem}</code> is enabled.
156       * @return this fixture.
157       * @throws AssertionError if this fixture's <code>JMenuItem</code> is disabled.
158       */
159      public JMenuItemFixture requireEnabled() {
160        driver.requireEnabled(target);
161        return this;
162      }
163    
164      /**
165       * Asserts that this fixture's <code>{@link JMenuItem}</code> is enabled.
166       * @param timeout the time this fixture will wait for the component to be enabled.
167       * @return this fixture.
168       * @throws org.fest.swing.exception.WaitTimedOutError if this fixture's <code>JMenuItem</code> is never enabled.
169       */
170      public JMenuItemFixture requireEnabled(Timeout timeout) {
171        driver.requireEnabled(target, timeout);
172        return this;
173      }
174    
175      /**
176       * Asserts that this fixture's <code>{@link JMenuItem}</code> is disabled.
177       * @return this fixture.
178       * @throws AssertionError if this fixture's <code>JMenuItem</code> is enabled.
179       */
180      public JMenuItemFixture requireDisabled() {
181        driver.requireDisabled(target);
182        return this;
183      }
184    
185      /**
186       * Asserts that this fixture's <code>{@link JMenuItem}</code> is visible.
187       * @return this fixture.
188       * @throws AssertionError if this fixture's <code>JMenuItem</code> is not visible.
189       */
190      public JMenuItemFixture requireVisible() {
191        driver.requireVisible(target);
192        return this;
193      }
194    
195      /**
196       * Asserts that this fixture's <code>{@link JMenuItem}</code> is not visible.
197       * @return this fixture.
198       * @throws AssertionError if this fixture's <code>JMenuItem</code> is visible.
199       */
200      public JMenuItemFixture requireNotVisible() {
201        driver.requireNotVisible(target);
202        return this;
203      }
204    }