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