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