001 /* 002 * Created on Dec 19, 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.core; 017 018 import static java.lang.Math.max; 019 import static java.lang.Math.min; 020 import static org.fest.swing.core.ComponentLookupScope.DEFAULT; 021 import static org.fest.swing.util.Platform.*; 022 023 import org.fest.util.VisibleForTesting; 024 025 /** 026 * Understands configuration settings. 027 * 028 * @author Alex Ruiz 029 */ 030 public class Settings { 031 032 private static final int DEFAULT_DELAY = 30000; 033 034 private ComponentLookupScope componentLookupScope; 035 private int timeoutToBeVisible; 036 private int timeoutToFindPopup; 037 private int timeoutToFindSubMenu; 038 private int delayBetweenEvents; 039 private int dragDelay; 040 private int dropDelay; 041 private int eventPostingDelay; 042 private int idleTimeout; 043 044 private java.awt.Robot robot; 045 046 public Settings() { 047 timeoutToBeVisible(DEFAULT_DELAY); 048 timeoutToFindPopup(DEFAULT_DELAY); 049 timeoutToFindSubMenu(100); 050 delayBetweenEvents(60); 051 dragDelay(0); 052 dropDelay(0); 053 eventPostingDelay(100); 054 componentLookupScope(DEFAULT); 055 idleTimeout(10000); 056 } 057 058 void attachTo(java.awt.Robot newRobot) { 059 robot = newRobot; 060 if (delayBetweenEvents < 0) delayBetweenEvents = this.robot.getAutoDelay(); 061 else updateRobotAutoDelay(); 062 } 063 064 @VisibleForTesting 065 java.awt.Robot robot() { return robot; } 066 067 /** 068 * Returns a value representing the millisecond count in between generated events. The default is 60 milliseconds. 069 * @return a value representing the millisecond count in between generated events. 070 */ 071 public int delayBetweenEvents() { 072 return delayBetweenEvents; 073 } 074 075 /** 076 * Updates the value representing the millisecond count in between generated events. Usually just set to 100-200 if 077 * you want to slow down the playback to simulate actual user input. The default is 60 milliseconds. 078 * <p> 079 * To change the speed of a GUI test, you need to change the values of both <code>delayBetweenEvents</code> and 080 * <code>eventPostingDelay</code>. 081 * </p> 082 * @param ms the millisecond count in between generated events. It should be between -1 and 60000. 083 * @see #eventPostingDelay(int) 084 */ 085 public void delayBetweenEvents(int ms) { 086 delayBetweenEvents = valueToUpdate(ms, -1, 60000); 087 if (robot != null) updateRobotAutoDelay(); 088 } 089 090 private void updateRobotAutoDelay() { 091 robot.setAutoDelay(delayBetweenEvents); 092 } 093 094 /** 095 * Returns the number of milliseconds to wait for a component to be visible. The default value is 30000 milliseconds. 096 * @return the number of milliseconds to wait for a component to be visible. 097 */ 098 public int timeoutToBeVisible() { 099 return timeoutToBeVisible; 100 } 101 102 /** 103 * Updates the number of milliseconds to wait for a component to be visible. The default value is 30000 milliseconds. 104 * @param ms the time in milliseconds. It should be between 0 and 60000. 105 */ 106 public void timeoutToBeVisible(int ms) { 107 timeoutToBeVisible = valueToUpdate(ms, 0, 60000); 108 } 109 110 /** 111 * Returns the number of milliseconds to wait before failing to find a pop-up menu that should appear. The default 112 * value is 30000 milliseconds. 113 * @return the number of milliseconds to wait before failing to find a pop-up menu that should appear. 114 */ 115 public int timeoutToFindPopup() { 116 return timeoutToFindPopup; 117 } 118 119 /** 120 * Updates the number of milliseconds to wait before failing to find a pop-up menu that should appear. The default 121 * value is 30000 milliseconds. 122 * @param ms the time in milliseconds. It should be between 0 and 60000. 123 */ 124 public void timeoutToFindPopup(int ms) { 125 timeoutToFindPopup = valueToUpdate(ms, 0, 60000); 126 } 127 128 /** 129 * Returns the number of milliseconds to wait for a sub-menu to appear. The default value is 100 milliseconds. 130 * @return the number of milliseconds to wait for a sub-menu to appear. 131 * @since 1.2 132 */ 133 public int timeoutToFindSubMenu() { 134 return timeoutToFindSubMenu; 135 } 136 137 /** 138 * Updates the number of milliseconds to wait for a sub-menu to appear. The default value is 100 milliseconds. 139 * @param ms the time in milliseconds. It should be between 0 and 10000. 140 * @since 1.2 141 */ 142 public void timeoutToFindSubMenu(int ms) { 143 timeoutToFindSubMenu = valueToUpdate(ms, 0, 10000); 144 } 145 146 /** 147 * Returns the number of milliseconds to wait between a pressing a mouse button and moving the mouse. The default 148 * value for Mac OS X or the X11 Windowing system is 100 milliseconds. For other platforms, the default value is 0. 149 * @return the number of milliseconds to wait between a pressing a mouse button and moving the mouse. 150 */ 151 public int dragDelay() { 152 return dragDelay; 153 } 154 155 /** 156 * Updates the number of milliseconds to wait between a pressing a mouse button and moving the mouse. The default 157 * value for Mac OS X or the X11 Windowing system is 100 milliseconds. For other platforms, the default value is 0. 158 * @param ms the time in milliseconds. For Mac OS X or the X11 Windowing system, the minimum value is 100. For other 159 * platforms the minimum value is 0. The maximum value for all platforms is 60000. 160 */ 161 public void dragDelay(int ms) { 162 int min = isX11() || isOSX() ? 100 : 0; 163 dragDelay = valueToUpdate(ms, min, 60000); 164 } 165 166 /** 167 * Returns the number of milliseconds before checking for idle. The default value is 100 milliseconds. 168 * @return the number of milliseconds before checking for idle. 169 */ 170 public int eventPostingDelay() { 171 return eventPostingDelay; 172 } 173 174 /** 175 * Updates the number of milliseconds before checking for idle. This allows the system a little time to put a native 176 * event onto the AWT event queue. The default value is 100 milliseconds. 177 * <p> 178 * To change the speed of a GUI test, you need to change the values of both <code>delayBetweenEvents</code> and 179 * <code>eventPostingDelay</code>. 180 * </p> 181 * @param ms the time in milliseconds. It should be between 0 and 1000. 182 * @see #delayBetweenEvents(int) 183 */ 184 public void eventPostingDelay(int ms) { 185 eventPostingDelay = valueToUpdate(ms, 0, 1000); 186 } 187 188 /** 189 * Returns the number of milliseconds between the final mouse movement and mouse release to ensure drop ends. The 190 * default value for Windows is 200. For other platforms, the default value is 0. 191 * @return the number of milliseconds between the final mouse movement and mouse release to ensure drop ends. 192 */ 193 public int dropDelay() { 194 return dropDelay; 195 } 196 197 /** 198 * Updates the number of milliseconds between the final mouse movement and mouse release to ensure drop ends. The 199 * default value for Windows is 200. For other platforms, the default value is 0. 200 * @param ms the time in milliseconds. For Windows, the minimum value is 200. For other platforms, the minimum value 201 * is 0. The maximum value for all platforms is 60000. 202 */ 203 public void dropDelay(int ms) { 204 int min = isWindows() ? 200 : 0; 205 dropDelay = valueToUpdate(ms, min, 60000); 206 } 207 208 /** 209 * Returns the scope of component lookups. This setting only affects the component fixtures in the package 210 * <code>org.fest.swing.fixture</code>. The default value is <code>{@link ComponentLookupScope#DEFAULT}</code>. 211 * @return the scope of component lookups. 212 */ 213 public ComponentLookupScope componentLookupScope() { 214 return componentLookupScope; 215 } 216 217 /** 218 * Updates the scope of component lookups. This setting only affects the component fixtures in the package 219 * <code>org.fest.swing.fixture</code>. The default value is <code>{@link ComponentLookupScope#DEFAULT}</code>. 220 * @param scope the new value for the scope. 221 */ 222 public void componentLookupScope(ComponentLookupScope scope) { 223 componentLookupScope = scope; 224 } 225 226 /** 227 * Returns the time (in milliseconds) to wait for an idle AWT event queue. The default value is 10000 milliseconds. 228 * @return the time (in milliseconds) to wait for an idle AWT event queue. 229 */ 230 public int idleTimeout() { 231 return idleTimeout; 232 } 233 234 /** 235 * Updates the time (in milliseconds) to wait for an idle AWT event queue. 236 * @param ms the new time. The value should be equal to or greater than zero. 237 */ 238 public void idleTimeout(int ms) { 239 this.idleTimeout = valueToUpdate(ms, 0, Integer.MAX_VALUE); 240 } 241 242 private int valueToUpdate(int value, int min, int max) { 243 return max(min, min(max, value)); 244 } 245 }