001    /*
002     * Created on Dec 25, 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.JScrollBar;
022    
023    import org.fest.swing.core.*;
024    import org.fest.swing.driver.JScrollBarDriver;
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 JScrollBar}</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 Alex Ruiz
038     */
039    public class JScrollBarFixture extends ComponentFixture<JScrollBar> implements CommonComponentFixture,
040        JComponentFixture, JPopupMenuInvokerFixture {
041    
042      private JScrollBarDriver driver;
043    
044      /**
045       * Creates a new <code>{@link JScrollBarFixture}</code>.
046       * @param robot performs simulation of user events on the given <code>JScrollBar</code>.
047       * @param target the <code>JScrollBar</code> to be managed by this fixture.
048       * @throws NullPointerException if <code>robot</code> is <code>null</code>.
049       * @throws NullPointerException if <code>target</code> is <code>null</code>.
050       */
051      public JScrollBarFixture(Robot robot, JScrollBar target) {
052        super(robot, target);
053        createDriver();
054      }
055    
056      /**
057       * Creates a new <code>{@link JScrollBarFixture}</code>.
058       * @param robot performs simulation of user events on a <code>JScrollBar</code>.
059       * @param scrollBarName the name of the <code>JScrollBar</code> to find using the given <code>Robot</code>.
060       * @throws NullPointerException if <code>robot</code> is <code>null</code>.
061       * @throws ComponentLookupException if a matching <code>JScrollBar</code> could not be found.
062       * @throws ComponentLookupException if more than one matching <code>JScrollBar</code> is found.
063       */
064      public JScrollBarFixture(Robot robot, String scrollBarName) {
065        super(robot, scrollBarName, JScrollBar.class);
066        createDriver();
067      }
068    
069      private void createDriver() {
070        driver(new JScrollBarDriver(robot));
071      }
072    
073      /**
074       * Sets the <code>{@link JScrollBarDriver}</code> to be used by this fixture.
075       * @param newDriver the new <code>JScrollBarDriver</code>.
076       * @throws NullPointerException if the given driver is <code>null</code>.
077       */
078      protected final void driver(JScrollBarDriver newDriver) {
079        validateNotNull(newDriver);
080        driver = newDriver;
081      }
082    
083      /**
084       * Simulates a user clicking this fixture's <code>{@link JScrollBar}</code>.
085       * @return this fixture.
086       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
087       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
088       */
089      public JScrollBarFixture click() {
090        driver.click(target);
091        return this;
092      }
093    
094      /**
095       * Simulates a user clicking this fixture's <code>{@link JScrollBar}</code>.
096       * @param button the button to click.
097       * @throws NullPointerException if the given <code>MouseButton</code> is <code>null</code>.
098       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
099       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
100       * @return this fixture.
101       */
102      public JScrollBarFixture click(MouseButton button) {
103        driver.click(target, button);
104        return this;
105      }
106    
107      /**
108       * Simulates a user clicking this fixture's <code>{@link JScrollBar}</code>.
109       * @param mouseClickInfo specifies the button to click and the times the button should be clicked.
110       * @return this fixture.
111       * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>.
112       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
113       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
114       */
115      public JScrollBarFixture click(MouseClickInfo mouseClickInfo) {
116        driver.click(target, mouseClickInfo);
117        return this;
118      }
119    
120      /**
121       * Simulates a user double-clicking this fixture's <code>{@link JScrollBar}</code>.
122       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
123       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
124       * @return this fixture.
125       */
126      public JScrollBarFixture doubleClick() {
127        driver.doubleClick(target);
128        return this;
129      }
130    
131      /**
132       * Simulates a user right-clicking this fixture's <code>{@link JScrollBar}</code>.
133       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
134       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
135       * @return this fixture.
136       */
137      public JScrollBarFixture rightClick() {
138        driver.rightClick(target);
139        return this;
140      }
141    
142      /**
143       * Gives input focus to this fixture's <code>{@link JScrollBar}</code>.
144       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
145       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
146       * @return this fixture.
147       */
148      public JScrollBarFixture focus() {
149        driver.focus(target);
150        return this;
151      }
152    
153      /**
154       * Simulates a user pressing given key with the given modifiers on this fixture's <code>{@link JScrollBar}</code>.
155       * Modifiers is a mask from the available <code>{@link java.awt.event.InputEvent}</code> masks.
156       * @param keyPressInfo specifies the key and modifiers to press.
157       * @return this fixture.
158       * @throws NullPointerException if the given <code>KeyPressInfo</code> is <code>null</code>.
159       * @throws IllegalArgumentException if the given code is not a valid key code.
160       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
161       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
162       * @see KeyPressInfo
163       */
164      public JScrollBarFixture pressAndReleaseKey(KeyPressInfo keyPressInfo) {
165        driver.pressAndReleaseKey(target, keyPressInfo);
166        return this;
167      }
168    
169      /**
170       * Simulates a user pressing and releasing the given keys on the <code>{@link JScrollBar}</code> managed by this
171       * fixture.
172       * @param keyCodes one or more codes of the keys to press.
173       * @return this fixture.
174       * @throws NullPointerException if the given array of codes is <code>null</code>.
175       * @throws IllegalArgumentException if any of the given code is not a valid key code.
176       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
177       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
178       * @see java.awt.event.KeyEvent
179       */
180      public JScrollBarFixture pressAndReleaseKeys(int... keyCodes) {
181        driver.pressAndReleaseKeys(target, keyCodes);
182        return this;
183      }
184    
185      /**
186       * Simulates a user pressing the given key on this fixture's <code>{@link JScrollBar}</code>.
187       * @param keyCode the code of the key to press.
188       * @return this fixture.
189       * @throws IllegalArgumentException if any of the given code is not a valid key code.
190       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
191       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
192       * @see java.awt.event.KeyEvent
193       */
194      public JScrollBarFixture pressKey(int keyCode) {
195        driver.pressKey(target, keyCode);
196        return this;
197      }
198    
199      /**
200       * Simulates a user releasing the given key on this fixture's <code>{@link JScrollBar}</code>.
201       * @param keyCode the code of the key to release.
202       * @return this fixture.
203       * @throws IllegalArgumentException if any of the given code is not a valid key code.
204       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
205       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
206       * @see java.awt.event.KeyEvent
207       */
208      public JScrollBarFixture releaseKey(int keyCode) {
209        driver.releaseKey(target, keyCode);
210        return this;
211      }
212    
213      /**
214       * Simulates a user scrolling down one block (usually a page.)
215       * @return this fixture.
216       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
217       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
218       */
219      public JScrollBarFixture scrollBlockDown() {
220        driver.scrollBlockDown(target);
221        return this;
222      }
223    
224      /**
225       * Simulates a user scrolling down one block (usually a page,) the given number of times.
226       * @param times the number of times to scroll down one block.
227       * @return this fixture.
228       * @throws IllegalArgumentException if <code>times</code> is less than or equal to zero.
229       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
230       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
231       */
232      public JScrollBarFixture scrollBlockDown(int times) {
233        driver.scrollBlockDown(target, times);
234        return this;
235      }
236    
237      /**
238       * Simulates a user scrolling up one block (usually a page.)
239       * @return this fixture.
240       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
241       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
242       */
243      public JScrollBarFixture scrollBlockUp() {
244        driver.scrollBlockUp(target);
245        return this;
246      }
247    
248      /**
249       * Simulates a user scrolling up one block (usually a page,) the given number of times.
250       * @param times the number of times to scroll up one block.
251       * @return this fixture.
252       * @throws IllegalArgumentException if <code>times</code> is less than or equal to zero.
253       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
254       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
255       */
256      public JScrollBarFixture scrollBlockUp(int times) {
257        driver.scrollBlockUp(target, times);
258        return this;
259      }
260    
261      /**
262       * Simulates a user scrolling to the given position.
263       * @param position the position to scroll to.
264       * @return this fixture.
265       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
266       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
267       * @throws IllegalArgumentException if the given position is not within the <code>JScrollBar</code> bounds.
268       */
269      public JScrollBarFixture scrollTo(int position) {
270        driver.scrollTo(target, position);
271        return this;
272      }
273    
274      /**
275       * Simulates a user scrolling to the maximum position of this fixture's <code>{@link JScrollBar}</code>.
276       * @return this fixture.
277       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
278       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
279       */
280      public JScrollBarFixture scrollToMaximum() {
281        driver.scrollToMaximum(target);
282        return this;
283      }
284    
285      /**
286       * Simulates a user scrolling to the minimum position of this fixture's <code>{@link JScrollBar}</code>.
287       * @return this fixture.
288       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
289       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
290       */
291      public JScrollBarFixture scrollToMinimum() {
292        driver.scrollToMinimum(target);
293        return this;
294      }
295    
296      /**
297       * Simulates a user scrolling down one unit (usually a line.)
298       * @return this fixture.
299       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
300       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
301       */
302      public JScrollBarFixture scrollUnitDown() {
303        driver.scrollUnitDown(target);
304        return this;
305      }
306    
307      /**
308       * Simulates a user scrolling down one unit (usually a line,) the given number of times.
309       * @param times the number of times to scroll down one unit.
310       * @return this fixture.
311       * @throws IllegalArgumentException if <code>times</code> is less than or equal to zero.
312       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
313       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
314       */
315      public JScrollBarFixture scrollUnitDown(int times) {
316        driver.scrollUnitDown(target, times);
317        return this;
318      }
319    
320      /**
321       * Simulates a user scrolling up one unit (usually a line.)
322       * @return this fixture.
323       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
324       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
325       */
326      public JScrollBarFixture scrollUnitUp() {
327        driver.scrollUnitUp(target);
328        return this;
329      }
330    
331      /**
332       * Simulates a user scrolling up one unit (usually a line,) the given number of times.
333       * @param times the number of times to scroll up one unit.
334       * @return this fixture.
335       * @throws IllegalArgumentException if <code>times</code> is less than or equal to zero.
336       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
337       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
338       */
339      public JScrollBarFixture scrollUnitUp(int times) {
340        driver.scrollUnitUp(target, times);
341        return this;
342      }
343    
344      /**
345       * Asserts that the value of this fixture's <code>{@link JScrollBar}</code> is equal to the given one.
346       * @param value the expected value.
347       * @return this fixture.
348       * @throws AssertionError if the value of this fixture's <code>JScrollBar</code> is not equal to the given one.
349       */
350      public JScrollBarFixture requireValue(int value) {
351        driver.requireValue(target, value);
352        return this;
353      }
354    
355      /**
356       * Asserts that this fixture's <code>{@link JScrollBar}</code> has input focus.
357       * @return this fixture.
358       * @throws AssertionError if this fixture's <code>JScrollBar</code> does not have input focus.
359       */
360      public JScrollBarFixture requireFocused() {
361        driver.requireFocused(target);
362        return this;
363      }
364    
365      /**
366       * Asserts that this fixture's <code>{@link JScrollBar}</code> is enabled.
367       * @return this fixture.
368       * @throws AssertionError if this fixture's <code>JScrollBar</code> is disabled.
369       */
370      public JScrollBarFixture requireEnabled() {
371        driver.requireEnabled(target);
372        return this;
373      }
374    
375      /**
376       * Asserts that this fixture's <code>{@link JScrollBar}</code> is enabled.
377       * @param timeout the time this fixture will wait for the component to be enabled.
378       * @return this fixture.
379       * @throws WaitTimedOutError if this fixture's <code>JScrollBar</code> is never enabled.
380       */
381      public JScrollBarFixture requireEnabled(Timeout timeout) {
382        driver.requireEnabled(target, timeout);
383        return this;
384      }
385    
386      /**
387       * Asserts that this fixture's <code>{@link JScrollBar}</code> is disabled.
388       * @return this fixture.
389       * @throws AssertionError if this fixture's <code>JScrollBar</code> is enabled.
390       */
391      public JScrollBarFixture requireDisabled() {
392        driver.requireDisabled(target);
393        return this;
394      }
395    
396      /**
397       * Asserts that this fixture's <code>{@link JScrollBar}</code> is visible.
398       * @return this fixture.
399       * @throws AssertionError if this fixture's <code>JScrollBar</code> is not visible.
400       */
401      public JScrollBarFixture requireVisible() {
402        driver.requireVisible(target);
403        return this;
404      }
405    
406      /**
407       * Asserts that this fixture's <code>{@link JScrollBar}</code> is not visible.
408       * @return this fixture.
409       * @throws AssertionError if this fixture's <code>JScrollBar</code> is visible.
410       */
411      public JScrollBarFixture requireNotVisible() {
412        driver.requireNotVisible(target);
413        return this;
414      }
415    
416      /**
417       * Shows a pop-up menu using this fixture's <code>{@link JScrollBar}</code> as the invoker of the pop-up menu.
418       * @return a fixture that manages the displayed pop-up menu.
419       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
420       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
421       * @throws ComponentLookupException if a pop-up menu cannot be found.
422       */
423      public JPopupMenuFixture showPopupMenu() {
424        return new JPopupMenuFixture(robot, driver.invokePopupMenu(target));
425      }
426    
427      /**
428       * Shows a pop-up menu at the given point using this fixture's <code>{@link JScrollBar}</code> as the invoker of the
429       * pop-up menu.
430       * @param p the given point where to show the pop-up menu.
431       * @return a fixture that manages the displayed pop-up menu.
432       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is disabled.
433       * @throws IllegalStateException if this fixture's <code>JScrollBar</code> is not showing on the screen.
434       * @throws ComponentLookupException if a pop-up menu cannot be found.
435       */
436      public JPopupMenuFixture showPopupMenuAt(Point p) {
437        return new JPopupMenuFixture(robot, driver.invokePopupMenu(target, p));
438      }
439    
440      /**
441       * Returns the client property stored in this fixture's <code>{@link JScrollBar}</code>, under the given key.
442       * @param key the key to use to retrieve the client property.
443       * @return the value of the client property stored under the given key, or <code>null</code> if the property was
444       * not found.
445       * @throws NullPointerException if the given key is <code>null</code>.
446       * @since 1.2
447       */
448      public Object clientProperty(Object key) {
449        return driver.clientProperty(target, key);
450      }
451    
452      /**
453       * Asserts that the toolTip in this fixture's <code>{@link JScrollBar}</code> matches the given value.
454       * @param expected the given value. It can be a regular expression.
455       * @return this fixture.
456       * @throws AssertionError if the toolTip in this fixture's <code>JScrollBar</code> does not match the given value.
457       * @since 1.2
458       */
459      public JScrollBarFixture requireToolTip(String expected) {
460        driver.requireToolTip(target, expected);
461        return this;
462      }
463    
464      /**
465       * Asserts that the toolTip in this fixture's <code>{@link JScrollBar}</code> matches the given regular expression
466       * pattern.
467       * @param pattern the regular expression pattern to match.
468       * @return this fixture.
469       * @throws NullPointerException if the given regular expression pattern is <code>null</code>.
470       * @throws AssertionError if the toolTip in this fixture's <code>JScrollBar</code> does not match the given regular
471       * expression.
472       * @since 1.2
473       */
474      public JScrollBarFixture requireToolTip(Pattern pattern) {
475        driver.requireToolTip(target, pattern);
476        return this;
477      }
478    }