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