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.*;
019
020 import org.fest.swing.core.*;
021 import org.fest.swing.core.Robot;
022 import org.fest.swing.driver.DialogDriver;
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 Dialog}</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 DialogFixture extends WindowFixture<Dialog> {
038
039 private DialogDriver driver;
040
041 /**
042 * Creates a new <code>{@link DialogFixture}</code>. This constructor creates a new <code>{@link Robot}</code>
043 * containing the current AWT hierarchy.
044 * @param target the <code>Dialog</code> to be managed by this fixture.
045 * @throws NullPointerException if <code>target</code> is <code>null</code>.
046 * @see BasicRobot#robotWithCurrentAwtHierarchy()
047 */
048 public DialogFixture(Dialog target) {
049 super(target);
050 createDriver();
051 }
052
053 /**
054 * Creates a new <code>{@link DialogFixture}</code>.
055 * @param robot performs simulation of user events on the given <code>Dialog</code>.
056 * @param target the <code>Dialog</code> to be managed by this fixture.
057 * @throws NullPointerException if <code>robot</code> is <code>null</code>.
058 * @throws NullPointerException if <code>target</code> is <code>null</code>.
059 */
060 public DialogFixture(Robot robot, Dialog target) {
061 super(robot, target);
062 createDriver();
063 }
064
065 /**
066 * Creates a new <code>{@link DialogFixture}</code>.
067 * @param robot performs simulation of user events on a <code>Dialog</code>.
068 * @param dialogName the name of the <code>Dialog</code> to find using the given <code>Robot</code>.
069 * @throws NullPointerException if <code>robot</code> is <code>null</code>.
070 * @throws ComponentLookupException if a <code>Dialog</code> having a matching name could not be found.
071 * @throws ComponentLookupException if more than one <code>Dialog</code> having a matching name is found.
072 */
073 public DialogFixture(Robot robot, String dialogName) {
074 super(robot, dialogName, Dialog.class);
075 createDriver();
076 }
077
078 /**
079 * Creates a new <code>{@link DialogFixture}</code>. This constructor creates a new <code>{@link Robot}</code>
080 * containing the current AWT hierarchy.
081 * @param dialogName the name of the <code>Dialog</code> to find.
082 * @throws ComponentLookupException if a <code>Dialog</code> having a matching name could not be found.
083 * @throws ComponentLookupException if more than one <code>Dialog</code> having a matching name is found.
084 * @see BasicRobot#robotWithCurrentAwtHierarchy()
085 */
086 public DialogFixture(String dialogName) {
087 super(dialogName, Dialog.class);
088 createDriver();
089 }
090
091 private void createDriver() {
092 driver(new DialogDriver(robot));
093 }
094
095 /**
096 * Sets the <code>{@link DialogDriver}</code> to be used by this fixture.
097 * @param newDriver the new <code>DialogDriver</code>.
098 * @throws NullPointerException if the given driver is <code>null</code>.
099 */
100 protected final void driver(DialogDriver newDriver) {
101 validateNotNull(newDriver);
102 driver = newDriver;
103 }
104
105 /**
106 * Simulates a user clicking this fixture's <code>{@link Dialog}</code>.
107 * @return this fixture.
108 */
109 public DialogFixture click() {
110 driver.click(target);
111 return this;
112 }
113
114 /**
115 * Simulates a user clicking this fixture's <code>{@link Dialog}</code>.
116 * @param button the button to click.
117 * @return this fixture.
118 */
119 public DialogFixture click(MouseButton button) {
120 driver.click(target, button);
121 return this;
122 }
123
124 /**
125 * Simulates a user clicking this fixture's <code>{@link Dialog}</code>.
126 * @param mouseClickInfo specifies the button to click and the times the button should be clicked.
127 * @return this fixture.
128 * @throws NullPointerException if the given <code>MouseClickInfo</code> is <code>null</code>.
129 */
130 public DialogFixture click(MouseClickInfo mouseClickInfo) {
131 driver.click(target, mouseClickInfo);
132 return this;
133 }
134
135 /**
136 * Simulates a user double-clicking this fixture's <code>{@link Dialog}</code>.
137 * @return this fixture.
138 */
139 public DialogFixture doubleClick() {
140 driver.doubleClick(target);
141 return this;
142 }
143
144 /**
145 * Gives input focus to this fixture's <code>{@link Dialog}</code>.
146 * @return this fixture.
147 */
148 public DialogFixture focus() {
149 driver.focus(target);
150 return this;
151 }
152
153 /**
154 * Simulates a user moving this fixture's <code>{@link Dialog}</code> to the given point.
155 * @param p the point to move this fixture's <code>Dialog</code> to.
156 * @return this fixture.
157 * @throws ActionFailedException if the <code>Window</code> is not movable.
158 * @throws ActionFailedException if the given <code>Window</code> is not showing on the screen.
159 */
160 public DialogFixture moveTo(Point p) {
161 driver.moveTo(target, p);
162 return this;
163 }
164
165 /**
166 * If fixture's <code>{@link Dialog}</code> is visible, brings it to the front and may make it the focused one.
167 * @return this fixture.
168 */
169 public DialogFixture moveToFront() {
170 driver.moveToFront(target);
171 return this;
172 }
173
174
175 /**
176 * If the given <code>{@link Dialog}</code> is visible, sends it to the back and may cause it to lose focus or
177 * activation if it is the focused or active.
178 * @return this fixture.
179 */
180 public DialogFixture moveToBack() {
181 driver.moveToBack(target);
182 return this;
183 }
184
185 /**
186 * Simulates a user pressing given key with the given modifiers on this fixture's <code>{@link Dialog}</code>.
187 * Modifiers is a mask from the available <code>{@link java.awt.event.InputEvent}</code> masks.
188 * @param keyPressInfo specifies the key and modifiers to press.
189 * @return this fixture.
190 * @throws NullPointerException if the given <code>KeyPressInfo</code> is <code>null</code>.
191 * @throws IllegalArgumentException if the given code is not a valid key code.
192 * @see KeyPressInfo
193 */
194 public DialogFixture pressAndReleaseKey(KeyPressInfo keyPressInfo) {
195 driver.pressAndReleaseKey(target, keyPressInfo);
196 return this;
197 }
198
199 /**
200 * Simulates a user pressing and releasing the given keys on this fixture's <code>{@link Dialog}</code>.
201 * @param keyCodes one or more codes of the keys to press.
202 * @return this fixture.
203 * @throws NullPointerException if the given array of codes is <code>null</code>.
204 * @throws IllegalArgumentException if any of the given code is not a valid key code.
205 * @see java.awt.event.KeyEvent
206 */
207 public DialogFixture pressAndReleaseKeys(int... keyCodes) {
208 driver.pressAndReleaseKeys(target, keyCodes);
209 return this;
210 }
211
212 /**
213 * Simulates a user pressing the given key on this fixture's <code>{@link Dialog}</code>.
214 * @param keyCode the code of the key to press.
215 * @return this fixture.
216 * @throws IllegalArgumentException if the given code is not a valid key code.
217 * @see java.awt.event.KeyEvent
218 */
219 public DialogFixture pressKey(int keyCode) {
220 driver.pressKey(target, keyCode);
221 return this;
222 }
223
224 /**
225 * Simulates a user releasing the given key on this fixture's <code>{@link Dialog}</code>.
226 * @param keyCode the code of the key to release.
227 * @return this fixture.
228 * @throws IllegalArgumentException if the given code is not a valid key code.
229 * @see java.awt.event.KeyEvent
230 */
231 public DialogFixture releaseKey(int keyCode) {
232 driver.releaseKey(target, keyCode);
233 return this;
234 }
235
236 /**
237 * Asserts that this fixture's <code>{@link Dialog}</code> has input focus.
238 * @return this fixture.
239 * @throws AssertionError if this fixture's <code>Dialog</code> does not have input focus.
240 */
241 public DialogFixture requireFocused() {
242 driver.requireFocused(target);
243 return this;
244 }
245
246 /**
247 * Asserts that this fixture's <code>{@link Dialog}</code> is disabled.
248 * @return this fixture.
249 * @throws AssertionError if this fixture's <code>Dialog</code> is enabled.
250 */
251 public DialogFixture requireDisabled() {
252 driver.requireDisabled(target);
253 return this;
254 }
255
256 /**
257 * Asserts that this fixture's <code>{@link Dialog}</code> is enabled.
258 * @return this fixture.
259 * @throws AssertionError if this fixture's <code>Dialog</code> is disabled.
260 */
261 public DialogFixture requireEnabled() {
262 driver.requireEnabled(target);
263 return this;
264 }
265
266 /**
267 * Asserts that this fixture's <code>{@link Dialog}</code> is enabled.
268 * @param timeout the time this fixture will wait for the component to be enabled.
269 * @return this fixture.
270 * @throws org.fest.swing.exception.WaitTimedOutError if this fixture's <code>Dialog</code> is never enabled.
271 */
272 public DialogFixture requireEnabled(Timeout timeout) {
273 driver.requireEnabled(target, timeout);
274 return this;
275 }
276
277 /**
278 * Asserts that this fixture's <code>{@link Dialog}</code> is modal.
279 * @return this fixture.
280 * @throws AssertionError if this fixture's <code>Dialog</code> is not modal.
281 */
282 public DialogFixture requireModal() {
283 driver.requireModal(target);
284 return this;
285 }
286
287 /**
288 * Asserts that this fixture's <code>{@link Dialog}</code> is not visible.
289 * @return this fixture.
290 * @throws AssertionError if this fixture's <code>Dialog</code> is visible.
291 */
292 public DialogFixture requireNotVisible() {
293 driver.requireNotVisible(target);
294 return this;
295 }
296
297 /**
298 * Asserts that the size of this fixture's <code>{@link Dialog}</code> is equal to given one.
299 * @param size the given size to match.
300 * @return this fixture.
301 * @throws AssertionError if the size of this fixture's <code>Dialog</code> is not equal to the given size.
302 */
303 public DialogFixture requireSize(Dimension size) {
304 driver.requireSize(target, size);
305 return this;
306 }
307
308 /**
309 * Asserts that this fixture's <code>{@link Dialog}</code> is visible.
310 * @return this fixture.
311 * @throws AssertionError if this fixture's <code>Dialog</code> is not visible.
312 */
313 public DialogFixture requireVisible() {
314 driver.requireVisible(target);
315 return this;
316 }
317
318 /**
319 * Simulates a user resizing vertically this fixture's <code>{@link Dialog}</code>.
320 * @param height the height that this fixture's <code>Dialog</code> should have after being resized.
321 * @return this fixture.
322 * @throws ActionFailedException if the <code>Window</code> is not resizable.
323 */
324 public DialogFixture resizeHeightTo(int height) {
325 driver.resizeHeightTo(target, height);
326 return this;
327 }
328
329 /**
330 * Simulates a user resizing this fixture's <code>{@link Dialog}</code>.
331 * @param size the size that the target window should have after being resized.
332 * @return this fixture.
333 * @throws ActionFailedException if the <code>Window</code> is not resizable.
334 */
335 public DialogFixture resizeTo(Dimension size) {
336 driver.resizeTo(target, size);
337 return this;
338 }
339
340 /**
341 * Simulates a user resizing horizontally this fixture's <code>{@link Dialog}</code>.
342 * @param width the width that this fixture's <code>Dialog</code> should have after being resized.
343 * @return this fixture.
344 * @throws ActionFailedException if the <code>Window</code> is not resizable.
345 */
346 public DialogFixture resizeWidthTo(int width) {
347 driver.resizeWidthTo(target, width);
348 return this;
349 }
350
351 /**
352 * Simulates a user right-clicking this fixture's <code>{@link Dialog}</code>.
353 * @return this fixture.
354 */
355 public DialogFixture rightClick() {
356 driver.rightClick(target);
357 return this;
358 }
359
360 /**
361 * Shows this fixture's <code>{@link Dialog}</code>.
362 * @return this fixture.
363 */
364 public DialogFixture show() {
365 driver.show(target);
366 return this;
367 }
368
369 /**
370 * Shows this fixture's <code>{@link Dialog}</code>, resized to the given size.
371 * @param size the size to resize this fixture's <code>Dialog</code> to.
372 * @return this fixture.
373 */
374 public DialogFixture show(Dimension size) {
375 driver.show(target, size);
376 return this;
377 }
378
379 /**
380 * Shows a pop-up menu using this fixture's <code>{@link Dialog}</code> as the invoker of the pop-up menu.
381 * @return a fixture that manages the displayed pop-up menu.
382 * @throws IllegalStateException if this fixture's <code>Dialog</code> is disabled.
383 * @throws IllegalStateException if this fixture's <code>Dialog</code> is not showing on the screen.
384 * @throws ComponentLookupException if a pop-up menu cannot be found.
385 */
386 public JPopupMenuFixture showPopupMenu() {
387 return new JPopupMenuFixture(robot, driver.invokePopupMenu(target));
388 }
389
390 /**
391 * Shows a pop-up menu at the given point using this fixture's <code>{@link Dialog}</code> as the invoker of the
392 * pop-up menu.
393 * @param p the given point where to show the pop-up menu.
394 * @return a fixture that manages the displayed pop-up menu.
395 * @throws IllegalStateException if this fixture's <code>Dialog</code> is disabled.
396 * @throws IllegalStateException if this fixture's <code>Dialog</code> is not showing on the screen.
397 * @throws ComponentLookupException if a pop-up menu cannot be found.
398 */
399 public JPopupMenuFixture showPopupMenuAt(Point p) {
400 return new JPopupMenuFixture(robot, driver.invokePopupMenu(target, p));
401 }
402
403 /**
404 * Simulates a user closing this fixture's <code>{@link Dialog}</code>.
405 */
406 public void close() {
407 driver.close(target);
408 }
409 }