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