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