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