001    /*
002     * Created on Sep 4, 2007
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 @2007-2010 the original author or authors.
015     */
016    package org.fest.swing.fixture;
017    
018    import java.awt.Point;
019    import java.util.regex.Pattern;
020    
021    import javax.swing.JSplitPane;
022    
023    import org.fest.swing.core.*;
024    import org.fest.swing.driver.JSplitPaneDriver;
025    import org.fest.swing.exception.ComponentLookupException;
026    import org.fest.swing.exception.WaitTimedOutError;
027    import org.fest.swing.timing.Timeout;
028    
029    /**
030     * Understands functional testing of <code>{@link JSplitPane}</code>s:
031     * <ul>
032     * <li>user input simulation</li>
033     * <li>state verification</li>
034     * <li>property value query</li>
035     * </ul>
036     *
037     * @author Yvonne Wang
038     * @author Alex Ruiz
039     */
040    public class JSplitPaneFixture extends ComponentFixture<JSplitPane> implements CommonComponentFixture,
041        JComponentFixture, JPopupMenuInvokerFixture {
042    
043      private JSplitPaneDriver driver;
044    
045      /**
046       * Creates a new <code>{@link JSplitPaneFixture}</code>.
047       * @param robot performs simulation of user events on the given <code>JSplitPane</code>.
048       * @param target the <code>JSplitPane</code> to be managed by this fixture.
049       * @throws NullPointerException if <code>robot</code> is <code>null</code>.
050       * @throws NullPointerException if <code>target</code> is <code>null</code>.
051       */
052      public JSplitPaneFixture(Robot robot, JSplitPane target) {
053        super(robot, target);
054        createDriver();
055      }
056    
057      /**
058       * Creates a new <code>{@link JSplitPaneFixture}</code>.
059       * @param robot performs simulation of user events on a <code>JSplitPane</code>.
060       * @param spinnerName the name of the <code>JSplitPane</code> to find using the given <code>Robot</code>.
061       * @throws ComponentLookupException if a matching <code>JSplitPane</code> could not be found.
062       * @throws ComponentLookupException if more than one matching <code>JSplitPane</code> is found.
063       */
064      public JSplitPaneFixture(Robot robot, String spinnerName) {
065        super(robot, spinnerName, JSplitPane.class);
066        createDriver();
067      }
068    
069      private void createDriver() {
070        driver(new JSplitPaneDriver(robot));
071      }
072    
073      /**
074       * Sets the <code>{@link JSplitPaneDriver}</code> to be used by this fixture.
075       * @param newDriver the new <code>JSplitPaneDriver</code>.
076       * @throws NullPointerException if the given driver is <code>null</code>.
077       */
078      protected final void driver(JSplitPaneDriver newDriver) {
079        validateNotNull(newDriver);
080        driver = newDriver;
081      }
082    
083      /**
084       * Simulates a user moving the divider of this fixture's <code>{@link JSplitPane}</code>.
085       * <p>
086       * Since 1.2, this method respects the minimum and maximum values of the left and right components inside this
087       * fixture's <code>JSplitPane</code>.
088       * </p>
089       * @param location the location to move the divider to.
090       * @return this fixture.
091       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
092       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
093       */
094      public JSplitPaneFixture moveDividerTo(int location) {
095        driver.moveDividerTo(target, location);
096        return this;
097      }
098    
099      /**
100       * Simulates a user clicking this fixture's <code>{@link JSplitPane}</code>.
101       * @return this fixture.
102       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
103       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
104       */
105      public JSplitPaneFixture click() {
106        driver.click(target);
107        return this;
108      }
109    
110      /**
111       * Simulates a user clicking this fixture's <code>{@link JSplitPane}</code>.
112       * @param button the button to click.
113       * @return this fixture.
114       * @throws NullPointerException if the given <code>MouseButton</code> is <code>null</code>.
115       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
116       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
117       */
118      public JSplitPaneFixture click(MouseButton button) {
119        driver.click(target, button);
120        return this;
121      }
122    
123      /**
124       * Simulates a user clicking this fixture's <code>{@link JSplitPane}</code>.
125       * @param mouseClickInfo specifies the button to click and the times the button should be clicked.
126       * @return this fixture.
127       * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>.
128       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
129       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
130       */
131      public JSplitPaneFixture click(MouseClickInfo mouseClickInfo) {
132        driver.click(target, mouseClickInfo);
133        return this;
134      }
135    
136      /**
137       * Simulates a user double-clicking this fixture's <code>{@link JSplitPane}</code>.
138       * @return this fixture.
139       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
140       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
141       */
142      public JSplitPaneFixture doubleClick() {
143        driver.doubleClick(target);
144        return this;
145      }
146    
147      /**
148       * Simulates a user right-clicking this fixture's <code>{@link JSplitPane}</code>.
149       * @return this fixture.
150       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
151       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
152       */
153      public JSplitPaneFixture rightClick() {
154        driver.rightClick(target);
155        return this;
156      }
157    
158      /**
159       * Gives input focus to this fixture's <code>{@link JSplitPane}</code>.
160       * @return this fixture.
161       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
162       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
163       */
164      public JSplitPaneFixture focus() {
165        driver.focus(target);
166        return this;
167      }
168    
169      /**
170       * Simulates a user pressing given key with the given modifiers on this fixture's <code>{@link JSplitPane}</code>.
171       * Modifiers is a mask from the available <code>{@link java.awt.event.InputEvent}</code> masks.
172       * @param keyPressInfo specifies the key and modifiers to press.
173       * @return this fixture.
174       * @throws NullPointerException if the given <code>KeyPressInfo</code> is <code>null</code>.
175       * @throws IllegalArgumentException if the given code is not a valid key code.
176       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
177       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
178       * @see KeyPressInfo
179       */
180      public JSplitPaneFixture pressAndReleaseKey(KeyPressInfo keyPressInfo) {
181        driver.pressAndReleaseKey(target, keyPressInfo);
182        return this;
183      }
184    
185      /**
186       * Simulates a user pressing and releasing the given keys on this fixture's <code>{@link JSplitPane}</code>. This
187       * method does not affect the current focus.
188       * @param keyCodes one or more codes of the keys to press.
189       * @return this fixture.
190       * @throws NullPointerException if the given array of codes is <code>null</code>.
191       * @throws IllegalArgumentException if any of the given code is not a valid key code.
192       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
193       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
194       * @see java.awt.event.KeyEvent
195       */
196      public JSplitPaneFixture pressAndReleaseKeys(int... keyCodes) {
197        driver.pressAndReleaseKeys(target, keyCodes);
198        return this;
199      }
200    
201      /**
202       * Simulates a user pressing the given key on this fixture's <code>{@link JSplitPane}</code>.
203       * @param keyCode the code of the key to press.
204       * @return this fixture.
205       * @throws IllegalArgumentException if any of the given code is not a valid key code.
206       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
207       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
208       * @see java.awt.event.KeyEvent
209       */
210      public JSplitPaneFixture pressKey(int keyCode) {
211        driver.pressKey(target, keyCode);
212        return this;
213      }
214    
215      /**
216       * Simulates a user releasing the given key on this fixture's <code>{@link JSplitPane}</code>.
217       * @param keyCode the code of the key to release.
218       * @return this fixture.
219       * @throws IllegalArgumentException if any of the given code is not a valid key code.
220       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
221       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
222       * @see java.awt.event.KeyEvent
223       */
224      public JSplitPaneFixture releaseKey(int keyCode) {
225        driver.releaseKey(target, keyCode);
226        return this;
227      }
228    
229      /**
230       * Asserts that this fixture's <code>{@link JSplitPane}</code> has input focus.
231       * @return this fixture.
232       * @throws AssertionError if this fixture's <code>JSplitPane</code> does not have input focus.
233       */
234      public JSplitPaneFixture requireFocused() {
235        driver.requireFocused(target);
236        return this;
237      }
238    
239      /**
240       * Asserts that this fixture's <code>{@link JSplitPane}</code> is enabled.
241       * @return this fixture.
242       * @throws AssertionError if this fixture's <code>JSplitPane</code> is disabled.
243       */
244      public JSplitPaneFixture requireEnabled() {
245        driver.requireEnabled(target);
246        return this;
247      }
248    
249      /**
250       * Asserts that this fixture's <code>{@link JSplitPane}</code> is enabled.
251       * @param timeout the time this fixture will wait for the component to be enabled.
252       * @return this fixture.
253       * @throws WaitTimedOutError if this fixture's <code>JSplitPane</code> is never enabled.
254       */
255      public JSplitPaneFixture requireEnabled(Timeout timeout) {
256        driver.requireEnabled(target, timeout);
257        return this;
258      }
259    
260      /**
261       * Asserts that this fixture's <code>{@link JSplitPane}</code> is disabled.
262       * @return this fixture.
263       * @throws AssertionError if this fixture's <code>JSplitPane</code> is enabled.
264       */
265      public JSplitPaneFixture requireDisabled() {
266        driver.requireDisabled(target);
267        return this;
268      }
269    
270      /**
271       * Asserts that this fixture's <code>{@link JSplitPane}</code> is visible.
272       * @return this fixture.
273       * @throws AssertionError if this fixture's <code>JSplitPane</code> is not visible.
274       */
275      public JSplitPaneFixture requireVisible() {
276        driver.requireVisible(target);
277        return this;
278      }
279    
280      /**
281       * Asserts that this fixture's <code>{@link JSplitPane}</code> is not visible.
282       * @return this fixture.
283       * @throws AssertionError if this fixture's <code>JSplitPane</code> is visible.
284       */
285      public JSplitPaneFixture requireNotVisible() {
286        driver.requireNotVisible(target);
287        return this;
288      }
289    
290      /**
291       * Asserts that the toolTip in this fixture's <code>{@link JSplitPane}</code> matches the given value.
292       * @param expected the given value. It can be a regular expression.
293       * @return this fixture.
294       * @throws AssertionError if the toolTip in this fixture's <code>JSplitPane</code> does not match the given value.
295       * @since 1.2
296       */
297      public JSplitPaneFixture requireToolTip(String expected) {
298        driver.requireToolTip(target, expected);
299        return this;
300      }
301    
302      /**
303       * Asserts that the toolTip in this fixture's <code>{@link JSplitPane}</code> matches the given regular expression
304       * pattern.
305       * @param pattern the regular expression pattern to match.
306       * @return this fixture.
307       * @throws NullPointerException if the given regular expression pattern is <code>null</code>.
308       * @throws AssertionError if the toolTip in this fixture's <code>JSplitPane</code> does not match the given regular
309       * expression.
310       * @since 1.2
311       */
312      public JSplitPaneFixture requireToolTip(Pattern pattern) {
313        driver.requireToolTip(target, pattern);
314        return this;
315      }
316    
317      /**
318       * Returns the client property stored in this fixture's <code>{@link JSplitPane}</code>, under the given key.
319       * @param key the key to use to retrieve the client property.
320       * @return the value of the client property stored under the given key, or <code>null</code> if the property was
321       * not found.
322       * @throws NullPointerException if the given key is <code>null</code>.
323       * @since 1.2
324       */
325      public Object clientProperty(Object key) {
326        return driver.clientProperty(target, key);
327      }
328    
329      /**
330       * Shows a pop-up menu using this fixture's <code>{@link JSplitPane}</code> as the invoker of the pop-up menu.
331       * @return a fixture that manages the displayed pop-up menu.
332       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
333       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
334       * @throws ComponentLookupException if a pop-up menu cannot be found.
335       */
336      public JPopupMenuFixture showPopupMenu() {
337        return new JPopupMenuFixture(robot, driver.invokePopupMenu(target));
338      }
339    
340      /**
341       * Shows a pop-up menu at the given point using this fixture's <code>{@link JSplitPane}</code> as the invoker of the
342       * pop-up menu.
343       * @param p the given point where to show the pop-up menu.
344       * @return a fixture that manages the displayed pop-up menu.
345       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is disabled.
346       * @throws IllegalStateException if this fixture's <code>JSplitPane</code> is not showing on the screen.
347       * @throws ComponentLookupException if a pop-up menu cannot be found.
348       */
349      public JPopupMenuFixture showPopupMenuAt(Point p) {
350        return new JPopupMenuFixture(robot, driver.invokePopupMenu(target, p));
351      }
352    }