aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2011-05-01 06:40:46 +0200
committerSven Gothel <[email protected]>2011-05-01 06:40:46 +0200
commitcf2ebbf3e584e7f7a15c323633a495b119ece37e (patch)
tree666ea397394763b5a0dda24614aa53e5db2d526a
parent05a11c5918f12e376d89b0fcb237e4afe356278c (diff)
UI Tests/Robot: Attempt to stabilize UI tests (focus/input)
Focus: Always programmatic, clear global focus state upfront Key/Mouse Input: Retry w/ optional focus request if lost .. Dropped redundant robot delays, ie between keypress/release.
-rw-r--r--make/build-test.xml1
-rwxr-xr-xmake/scripts/tests.sh6
-rw-r--r--src/test/com/jogamp/opengl/test/junit/newt/TestFocus01SwingAWTRobot.java26
-rw-r--r--src/test/com/jogamp/opengl/test/junit/newt/TestFocus02SwingAWTRobot.java110
-rw-r--r--src/test/com/jogamp/opengl/test/junit/util/AWTRobotUtil.java265
5 files changed, 245 insertions, 163 deletions
diff --git a/make/build-test.xml b/make/build-test.xml
index 18b131594..9dfc526c9 100644
--- a/make/build-test.xml
+++ b/make/build-test.xml
@@ -45,6 +45,7 @@
<delete includeEmptyDirs="true" quiet="true">
<fileset dir="${build.test}" />
<fileset dir="." includes="*.tga" />
+ <fileset file="${jogl.test.jar}" />
</delete>
</target>
diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh
index 03c27c103..37194f602 100755
--- a/make/scripts/tests.sh
+++ b/make/scripts/tests.sh
@@ -72,7 +72,7 @@ function jrun() {
#D_ARGS="-Djogl.debug.GraphicsConfiguration"
#D_ARGS="-Djogl.debug.GLCanvas -Djogl.debug.GraphicsConfiguration"
#D_ARGS="-Djogl.debug.GLCanvas"
- D_ARGS="-Djogl.debug.DebugGL -Djogl.debug.GLDebugMessageHandler"
+ #D_ARGS="-Djogl.debug.DebugGL -Djogl.debug.GLDebugMessageHandler"
#D_ARGS="-Djogl.debug.DebugGL -Djogl.debug.TraceGL"
#D_ARGS="-Djogl.debug.GLDebugMessageHandler -Dnewt.debug.Window -Dnewt.debug.Display -Dnewt.debug.EDT"
#D_ARGS="-Djogl.debug.GLDebugMessageHandler"
@@ -172,7 +172,7 @@ function testawtmt() {
#testawt com.jogamp.opengl.test.junit.jogl.newt.TestSwingAWTRobotUsageBeforeJOGLInitBug411
#testawt com.jogamp.opengl.test.junit.jogl.demos.gl2.gears.newt.TestGearsNewtAWTWrapper
#testawt com.jogamp.opengl.test.junit.newt.TestEventSourceNotAWTBug
-#testawt com.jogamp.opengl.test.junit.newt.TestFocus01SwingAWTRobot
+testawt com.jogamp.opengl.test.junit.newt.TestFocus01SwingAWTRobot
#testawt com.jogamp.opengl.test.junit.newt.TestFocus02SwingAWTRobot
#testawt com.jogamp.opengl.test.junit.newt.TestListenerCom01AWT
#testawt com.jogamp.opengl.test.junit.newt.parenting.TestParenting01aAWT
@@ -207,7 +207,7 @@ function testawtmt() {
#
#testnoawt com.jogamp.opengl.test.junit.jogl.glsl.TestTransformFeedbackVaryingsBug407NEWT $*
#testnoawt com.jogamp.opengl.test.junit.jogl.glsl.TestGLSLSimple01NEWT $*
-testnoawt com.jogamp.opengl.test.junit.jogl.glsl.TestGLSLShaderState01NEWT $*
+#testnoawt com.jogamp.opengl.test.junit.jogl.glsl.TestGLSLShaderState01NEWT $*
#testnoawt com.jogamp.opengl.test.junit.jogl.glsl.TestGLSLShaderState02NEWT $*
#testnoawt com.jogamp.opengl.test.junit.graph.TestRegionRendererNEWT01 $*
diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestFocus01SwingAWTRobot.java b/src/test/com/jogamp/opengl/test/junit/newt/TestFocus01SwingAWTRobot.java
index 8be7d1c85..79196bd4c 100644
--- a/src/test/com/jogamp/opengl/test/junit/newt/TestFocus01SwingAWTRobot.java
+++ b/src/test/com/jogamp/opengl/test/junit/newt/TestFocus01SwingAWTRobot.java
@@ -119,6 +119,8 @@ public class TestFocus01SwingAWTRobot extends UITestCase {
// Add the canvas to a frame, and make it all visible.
JFrame frame1 = new JFrame("Swing AWT Parent Frame: "
+ glWindow1.getTitle());
+ AWTFocusAdapter frame1FA = new AWTFocusAdapter("frame1");
+ frame1.addFocusListener(frame1FA);
frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER);
Button button = new Button("Click me ..");
AWTFocusAdapter buttonFA = new AWTFocusAdapter("Button");
@@ -141,29 +143,31 @@ public class TestFocus01SwingAWTRobot extends UITestCase {
// Continuous animation ..
Animator animator = new Animator(glWindow1);
animator.start();
+ AWTRobotUtil.assertRequestFocusAndWait(robot, frame1, frame1, frame1FA, null);
// Button Focus
Thread.sleep(100); // allow event sync
+
System.err.println("FOCUS AWT Button request");
EventCountAdapterUtil.reset(eventCountAdapters);
- Assert.assertTrue(AWTRobotUtil.requestFocusAndWait(robot, button, button, buttonFA, null));
- Assert.assertEquals(1, buttonFA.getCount());
- Assert.assertEquals(0, glWindow1FA.getCount());
- Assert.assertEquals(0, newtCanvasAWTFA.getCount());
+ AWTRobotUtil.assertRequestFocusAndWait(robot, button, button, buttonFA, null);
+ Assert.assertEquals(true, buttonFA.hasFocus());
+ Assert.assertEquals(false, glWindow1FA.hasFocus());
+ Assert.assertEquals(false, newtCanvasAWTFA.hasFocus());
System.err.println("FOCUS AWT Button sync");
- Assert.assertEquals(2, AWTRobotUtil.testKeyType(robot, 2, button, buttonKA));
+ AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, button, buttonKA);
// Request the AWT focus, which should automatically provide the NEWT window with focus.
Thread.sleep(100); // allow event sync
System.err.println("FOCUS NEWT Canvas/GLWindow request");
EventCountAdapterUtil.reset(eventCountAdapters);
- Assert.assertTrue(AWTRobotUtil.requestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonFA));
- Assert.assertTrue(AWTRobotUtil.waitForCount(0, newtCanvasAWTFA));
- Assert.assertEquals(1, glWindow1FA.getCount());
- Assert.assertEquals(0, newtCanvasAWTFA.getCount());
- Assert.assertEquals(-1, buttonFA.getCount()); // lost focus
+ AWTRobotUtil.assertRequestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonFA);
+ Assert.assertTrue(AWTRobotUtil.waitForFocusCount(false, newtCanvasAWTFA));
+ Assert.assertEquals(true, glWindow1FA.hasFocus());
+ Assert.assertEquals(false, newtCanvasAWTFA.hasFocus());
+ Assert.assertEquals(false, buttonFA.hasFocus());
System.err.println("FOCUS NEWT Canvas/GLWindow sync");
- Assert.assertEquals(2, AWTRobotUtil.testKeyType(robot, 2, glWindow1, glWindow1KA));
+ AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, glWindow1, glWindow1KA);
Assert.assertEquals("AWT parent canvas received keyboard events", 0, newtCanvasAWTKA.getCount());
// Remove listeners to avoid logging during dispose/destroy.
diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestFocus02SwingAWTRobot.java b/src/test/com/jogamp/opengl/test/junit/newt/TestFocus02SwingAWTRobot.java
index 996ce9ca8..47d986fcb 100644
--- a/src/test/com/jogamp/opengl/test/junit/newt/TestFocus02SwingAWTRobot.java
+++ b/src/test/com/jogamp/opengl/test/junit/newt/TestFocus02SwingAWTRobot.java
@@ -172,82 +172,82 @@ public class TestFocus02SwingAWTRobot extends UITestCase {
// Continuous animation ..
Animator animator1 = new Animator(glWindow1);
animator1.start();
+ AWTRobotUtil.assertRequestFocusAndWait(robot, jFrame1, jFrame1, jFrame1FA, null);
// Button Outer Focus
Thread.sleep(100); // allow event sync
System.err.println("FOCUS AWT Button Outer request");
EventCountAdapterUtil.reset(eventCountAdapters);
- Assert.assertTrue(AWTRobotUtil.requestFocusAndWait(robot, buttonNorthOuter, buttonNorthOuter, buttonNorthOuterFA, null));
- Assert.assertEquals(1, buttonNorthOuterFA.getCount());
- Assert.assertEquals(0, glWindow1FA.getCount());
- Assert.assertEquals(0, newtCanvasAWTFA.getCount());
- Assert.assertEquals(0, buttonNorthInnerFA.getCount());
- Assert.assertEquals(0, jFrame1FA.getCount());
+ AWTRobotUtil.assertRequestFocusAndWait(robot, buttonNorthOuter, buttonNorthOuter, buttonNorthOuterFA, null);
+ Assert.assertEquals(true, buttonNorthOuterFA.hasFocus());
+ Assert.assertEquals(false, glWindow1FA.hasFocus());
+ Assert.assertEquals(false, newtCanvasAWTFA.hasFocus());
+ Assert.assertEquals(false, buttonNorthInnerFA.hasFocus());
+ Assert.assertEquals(false, jFrame1FA.hasFocus());
System.err.println("FOCUS AWT Button Outer sync");
- Assert.assertEquals(2, AWTRobotUtil.testKeyType(robot, 2, buttonNorthOuter, buttonNorthOuterKA));
- Assert.assertEquals(1, AWTRobotUtil.testMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1,
- buttonNorthOuter, buttonNorthOuterMA));
- Assert.assertEquals(3, AWTRobotUtil.testMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 2,
- buttonNorthOuter, buttonNorthOuterMA));
+ AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, buttonNorthOuter, buttonNorthOuterKA);
+ AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1,
+ buttonNorthOuter, buttonNorthOuterMA);
+ AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 2,
+ buttonNorthOuter, buttonNorthOuterMA);
// NEWT Focus
Thread.sleep(100); // allow event sync
System.err.println("FOCUS NEWT Canvas/GLWindow request");
EventCountAdapterUtil.reset(eventCountAdapters);
- Assert.assertTrue(AWTRobotUtil.requestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonNorthOuterFA));
- Assert.assertTrue(AWTRobotUtil.waitForCount(0, newtCanvasAWTFA));
- Assert.assertEquals(1, glWindow1FA.getCount());
- Assert.assertEquals(0, newtCanvasAWTFA.getCount());
- Assert.assertEquals(0, buttonNorthInnerFA.getCount());
- Assert.assertEquals(-1, buttonNorthOuterFA.getCount()); // lost focus
- Assert.assertEquals(0, jFrame1FA.getCount());
+ AWTRobotUtil.assertRequestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonNorthOuterFA);
+ Assert.assertTrue(AWTRobotUtil.waitForFocusCount(false, newtCanvasAWTFA));
+ Assert.assertEquals(true, glWindow1FA.hasFocus());
+ Assert.assertEquals(false, newtCanvasAWTFA.hasFocus());
+ Assert.assertEquals(false, buttonNorthInnerFA.hasFocus());
+ Assert.assertEquals(false, buttonNorthOuterFA.hasFocus());
+ Assert.assertEquals(false, jFrame1FA.hasFocus());
System.err.println("FOCUS NEWT Canvas/GLWindow sync");
- Assert.assertEquals(2, AWTRobotUtil.testKeyType(robot, 2, glWindow1, glWindow1KA));
+ AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, glWindow1, glWindow1KA);
Assert.assertEquals("AWT parent canvas received keyboard events", 0, newtCanvasAWTKA.getCount());
- Assert.assertEquals(1, AWTRobotUtil.testMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1,
- glWindow1, glWindow1MA));
- Assert.assertEquals(3, AWTRobotUtil.testMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 2,
- glWindow1, glWindow1MA));
+ AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1,
+ glWindow1, glWindow1MA);
+ AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 2,
+ glWindow1, glWindow1MA);
Assert.assertEquals("AWT parent canvas received mouse events", 0, newtCanvasAWTMA.getCount());
// Button Inner Focus
Thread.sleep(100); // allow event sync
System.err.println("FOCUS AWT Button request");
EventCountAdapterUtil.reset(eventCountAdapters);
- Assert.assertTrue(AWTRobotUtil.requestFocusAndWait(robot, buttonNorthInner, buttonNorthInner, buttonNorthInnerFA, glWindow1FA));
- Assert.assertEquals(1, buttonNorthInnerFA.getCount());
- Assert.assertEquals(-1, glWindow1FA.getCount()); // lost focus
- Assert.assertEquals(0, newtCanvasAWTFA.getCount());
- Assert.assertEquals(0, buttonNorthOuterFA.getCount());
- Assert.assertEquals(0, jFrame1FA.getCount());
+ AWTRobotUtil.assertRequestFocusAndWait(robot, buttonNorthInner, buttonNorthInner, buttonNorthInnerFA, glWindow1FA);
+ Assert.assertEquals(true, buttonNorthInnerFA.hasFocus());
+ Assert.assertEquals(false, glWindow1FA.hasFocus());
+ Assert.assertEquals(false, newtCanvasAWTFA.hasFocus());
+ Assert.assertEquals(false, buttonNorthOuterFA.hasFocus());
+ Assert.assertEquals(false, jFrame1FA.hasFocus());
System.err.println("FOCUS AWT Button sync");
- Assert.assertEquals(2, AWTRobotUtil.testKeyType(robot, 2, buttonNorthInner, buttonNorthInnerKA));
- Assert.assertEquals(1, AWTRobotUtil.testMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1,
- buttonNorthInner, buttonNorthInnerMA));
- Assert.assertEquals(3, AWTRobotUtil.testMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 2,
- buttonNorthInner, buttonNorthInnerMA));
+ AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, buttonNorthInner, buttonNorthInnerKA);
+ AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1,
+ buttonNorthInner, buttonNorthInnerMA);
+ AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 2,
+ buttonNorthInner, buttonNorthInnerMA);
// NEWT Focus
Thread.sleep(100); // allow event sync
System.err.println("FOCUS NEWT Canvas/GLWindow request");
EventCountAdapterUtil.reset(eventCountAdapters);
- Assert.assertTrue(AWTRobotUtil.requestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonNorthInnerFA));
- Assert.assertTrue(AWTRobotUtil.waitForCount(0, newtCanvasAWTFA));
- Assert.assertEquals(1, glWindow1FA.getCount());
- Assert.assertEquals(0, newtCanvasAWTFA.getCount());
- Assert.assertEquals(-1, buttonNorthInnerFA.getCount()); // lost focus
- Assert.assertEquals(0, buttonNorthOuterFA.getCount());
- Assert.assertEquals(0, jFrame1FA.getCount());
+ AWTRobotUtil.assertRequestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonNorthInnerFA);
+ Assert.assertTrue(AWTRobotUtil.waitForFocusCount(false, newtCanvasAWTFA));
+ Assert.assertEquals(true, glWindow1FA.hasFocus());
+ Assert.assertEquals(false, newtCanvasAWTFA.hasFocus());
+ Assert.assertEquals(false, buttonNorthInnerFA.hasFocus());
+ Assert.assertEquals(false, buttonNorthOuterFA.hasFocus());
+ Assert.assertEquals(false, jFrame1FA.hasFocus());
System.err.println("FOCUS NEWT Canvas/GLWindow sync");
- Assert.assertEquals(2, AWTRobotUtil.testKeyType(robot, 2, glWindow1, glWindow1KA));
+ AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, glWindow1, glWindow1KA);
Assert.assertEquals("AWT parent canvas received keyboard events", 0, newtCanvasAWTKA.getCount());
- Assert.assertEquals(1, AWTRobotUtil.testMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1,
- glWindow1, glWindow1MA));
- Assert.assertEquals(3, AWTRobotUtil.testMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 2,
- glWindow1, glWindow1MA));
+ AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1,
+ glWindow1, glWindow1MA);
+ AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 2,
+ glWindow1, glWindow1MA);
Assert.assertEquals("AWT parent canvas received mouse events", 0, newtCanvasAWTMA.getCount());
-
animator1.stop();
Assert.assertEquals(false, animator1.isAnimating());
@@ -284,7 +284,9 @@ public class TestFocus02SwingAWTRobot extends UITestCase {
return i;
}
- public static void main(String args[]) throws IOException {
+ public static void main(String args[])
+ throws IOException, AWTException, InterruptedException, InvocationTargetException
+ {
for(int i=0; i<args.length; i++) {
if(args[i].equals("-time")) {
durationPerTest = atoi(args[++i]);
@@ -294,8 +296,16 @@ public class TestFocus02SwingAWTRobot extends UITestCase {
}
System.err.println("durationPerTest "+durationPerTest);
System.err.println("waitReparent "+waitReparent);
- String tstname = TestFocus02SwingAWTRobot.class.getName();
- org.junit.runner.JUnitCore.main(tstname);
+ if(true) {
+ String tstname = TestFocus02SwingAWTRobot.class.getName();
+ org.junit.runner.JUnitCore.main(tstname);
+ } else {
+ TestFocus02SwingAWTRobot.initClass();
+ TestFocus02SwingAWTRobot test = new TestFocus02SwingAWTRobot();
+ test.testFocus01ProgrFocus();
+ test.testFocus02RobotFocus();
+ TestFocus02SwingAWTRobot.release();
+ }
}
}
diff --git a/src/test/com/jogamp/opengl/test/junit/util/AWTRobotUtil.java b/src/test/com/jogamp/opengl/test/junit/util/AWTRobotUtil.java
index d0f9172bc..07f25ec40 100644
--- a/src/test/com/jogamp/opengl/test/junit/util/AWTRobotUtil.java
+++ b/src/test/com/jogamp/opengl/test/junit/util/AWTRobotUtil.java
@@ -40,16 +40,23 @@ import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
+
import javax.media.opengl.awt.GLCanvas;
import javax.swing.JFrame;
+import org.junit.Assert;
+
public class AWTRobotUtil {
- public static int TIME_OUT = 1000; // 1s
- public static int ROBOT_DELAY = 50; // ms
- public static int POLL_DIVIDER = 20; // TO/20
+ static final boolean DEBUG = false;
+
+ public static int RETRY_NUMBER = 5;
+ public static int ROBOT_DELAY = 100; // ms
+ public static int TIME_OUT = 1000; // 1s
+ public static int POLL_DIVIDER = 20; // TO/20
+ public static int TIME_SLICE = TIME_OUT / POLL_DIVIDER ;
- public static Point getCenterLocation(Object obj, boolean frameTitlebar)
+ public static Point getCenterLocation(Object obj)
throws InterruptedException, InvocationTargetException {
Component comp = null;
com.jogamp.newt.Window win = null;
@@ -66,7 +73,7 @@ public class AWTRobotUtil {
if(null!=comp) {
Point p0 = comp.getLocationOnScreen();
Rectangle r0 = comp.getBounds();
- if( frameTitlebar && comp instanceof JFrame ) {
+ if( comp instanceof JFrame ) {
JFrame jFrame = (JFrame) comp;
Container cont = jFrame.getContentPane();
Point p1 = cont.getLocationOnScreen();
@@ -102,7 +109,7 @@ public class AWTRobotUtil {
robot = new Robot();
robot.setAutoWaitForIdle(true);
}
- Point p0 = getCenterLocation(window, false);
+ Point p0 = getCenterLocation(window);
System.err.println("robot pos: "+p0);
robot.mouseMove( (int) p0.getX(), (int) p0.getY() );
robot.delay(ROBOT_DELAY);
@@ -118,7 +125,7 @@ public class AWTRobotUtil {
KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
int wait;
for (wait=0; wait<POLL_DIVIDER && window != kfm.getFocusedWindow(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
return wait<POLL_DIVIDER;
}
@@ -134,7 +141,7 @@ public class AWTRobotUtil {
robot.setAutoWaitForIdle(true);
}
- Point p0 = getCenterLocation(obj, false);
+ Point p0 = getCenterLocation(obj);
System.err.println("robot pos: "+p0);
robot.mouseMove( (int) p0.getX(), (int) p0.getY() );
@@ -147,37 +154,41 @@ public class AWTRobotUtil {
*/
public static void requestFocus(Robot robot, Object obj)
throws AWTException, InterruptedException, InvocationTargetException {
- Component comp = null;
- com.jogamp.newt.Window win = null;
+ final Component comp;
+ final com.jogamp.newt.Window win;
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
+
if(obj instanceof com.jogamp.newt.Window) {
win = (com.jogamp.newt.Window) obj;
+ comp = null;
} else if(obj instanceof Component) {
+ win = null;
comp = (Component) obj;
} else {
throw new RuntimeException("Neither AWT nor NEWT: "+obj);
}
-
- if(null == robot) {
- if(null!=comp) {
- final Component f_comp = comp;
- javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
- public void run() {
- f_comp.requestFocus();
- }});
- } else {
- win.requestFocus();
- }
- return;
+
+ if(null!=comp) {
+ javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ comp.requestFocus();
+ }});
+ } else {
+ win.requestFocus();
}
+ }
- centerMouse(robot, obj);
-
- robot.delay(ROBOT_DELAY);
- robot.mousePress(InputEvent.BUTTON1_MASK);
- robot.delay(ROBOT_DELAY);
- robot.mouseRelease(InputEvent.BUTTON1_MASK);
- robot.delay(ROBOT_DELAY);
+ public static boolean hasFocus(Object obj) {
+ if(obj instanceof Component) {
+ final Component comp = (Component) obj;
+ final KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
+ return comp == kfm.getPermanentFocusOwner();
+ } else if(obj instanceof com.jogamp.newt.Window) {
+ return ((com.jogamp.newt.Window) obj).hasFocus();
+ } else {
+ throw new RuntimeException("Neither AWT nor NEWT: "+obj);
+ }
}
/**
@@ -187,15 +198,15 @@ public class AWTRobotUtil {
public static boolean waitForFocus(Object obj) throws InterruptedException {
int wait;
if(obj instanceof Component) {
- Component comp = (Component) obj;
- KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
+ final Component comp = (Component) obj;
+ final KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
for (wait=0; wait<POLL_DIVIDER && comp != kfm.getPermanentFocusOwner(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
} else if(obj instanceof com.jogamp.newt.Window) {
- com.jogamp.newt.Window win = (com.jogamp.newt.Window) obj;
+ final com.jogamp.newt.Window win = (com.jogamp.newt.Window) obj;
for (wait=0; wait<POLL_DIVIDER && !win.hasFocus(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
} else {
throw new RuntimeException("Neither AWT nor NEWT: "+obj);
@@ -207,49 +218,76 @@ public class AWTRobotUtil {
*
* @return True if the Window became the global focused Window within TIME_OUT
*/
- public static boolean waitForFocus(Object obj, int gainT0, EventCountAdapter gain,
- int lostT0, EventCountAdapter lost) throws InterruptedException {
+ public static boolean waitForFocus(Object obj, FocusEventCountAdapter gain,
+ FocusEventCountAdapter lost) throws InterruptedException {
if(!waitForFocus(obj)) {
return false;
}
+ if(null == gain) {
+ return true;
+ }
+
int wait;
for (wait=0; wait<POLL_DIVIDER; wait++) {
- int gainT1 = gain.getCount();
- int lostT1 = (null!=lost) ? lost.getCount() : -1;
- if(gainT1-gainT0==1 && lostT1-lostT0==-1) {
+ if( ( null == lost || !lost.hasFocus() ) && gain.hasFocus() ) {
return true;
}
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
return false;
}
- public static boolean requestFocusAndWait(Robot robot, Object requestFocus, Object waitForFocus)
+ public static void assertRequestFocusAndWait(Robot robot, Object requestFocus, Object waitForFocus,
+ FocusEventCountAdapter gain, FocusEventCountAdapter lost)
throws AWTException, InterruptedException, InvocationTargetException {
- requestFocus(robot, requestFocus);
- return waitForFocus(waitForFocus);
+ int i = 0;
+ boolean hasFocus = false;
+
+ for(i=0; i < RETRY_NUMBER && !hasFocus; i++) {
+ requestFocus(robot, requestFocus);
+ hasFocus = waitForFocus(waitForFocus, gain, lost);
+ }
+ Assert.assertTrue("Did not gain focus", hasFocus);
}
- public static boolean requestFocusAndWait(Robot robot, Object requestFocus, Object waitForFocus,
- EventCountAdapter gain, EventCountAdapter lost)
- throws AWTException, InterruptedException, InvocationTargetException {
-
- int gainT0 = gain.getCount();
- int lostT0 = (null!=lost) ? lost.getCount() : 0;
-
- requestFocus(robot, requestFocus);
- return waitForFocus(waitForFocus, gainT0, gain, lostT0, lost);
+ static int keyType(int i, Robot robot, int keyCode,
+ Object obj, InputEventCountAdapter counter) throws InterruptedException, AWTException, InvocationTargetException
+ {
+ int tc = 0;
+ int j;
+ final long t0 = System.currentTimeMillis();
+
+ for(j=0; 1 > tc && j<RETRY_NUMBER; j++) {
+ if(!hasFocus(obj)) {
+ // focus lost for some reason, regain it programmatic
+ if(DEBUG) { System.err.println(i+":"+j+" KC1.0: "+counter+" - regain focus"); }
+ requestFocus(null, obj);
+ }
+ final int c0 = counter.getCount();
+ if(DEBUG) { System.err.println(i+":"+j+" KC1.1: "+counter); }
+ robot.waitForIdle();
+ robot.keyPress(keyCode);
+ robot.keyRelease(keyCode);
+ if(DEBUG) { System.err.println(i+":"+j+" KC1.2: "+counter); }
+ tc = counter.getCount() - c0;
+ for (int wait=0; wait<POLL_DIVIDER && 1 > tc; wait++) {
+ robot.delay(TIME_SLICE);
+ tc = counter.getCount() - c0;
+ }
+ if(DEBUG) { System.err.println(i+":"+j+" KC1.X: tc "+tc+", "+counter); }
+ }
+ Assert.assertEquals("Key ("+i+":"+j+") not typed one time", 1, tc);
+ return (int) ( System.currentTimeMillis() - t0 ) ;
}
-
+
/**
- * @param keyTypedCounter shall return the number of keys typed (press + release)
- * @return True if typeCount keys within TIME_OUT has been received
+ * @param keyCode TODO
+ * @param counter shall return the number of keys typed (press + release)
*/
- public static int testKeyType(Robot robot, int typeCount, Object obj, EventCountAdapter keyTypedCounter)
+ public static void assertKeyType(Robot robot, int keyCode, int typeCount,
+ Object obj, InputEventCountAdapter counter)
throws AWTException, InterruptedException, InvocationTargetException {
- Component comp = null;
- com.jogamp.newt.Window win = null;
if(null == robot) {
robot = new Robot();
@@ -258,30 +296,59 @@ public class AWTRobotUtil {
centerMouse(robot, obj);
- int c0 = keyTypedCounter.getCount();
+ Assert.assertEquals("Key already pressed", false, counter.isPressed());
+
+ if(DEBUG) {
+ System.err.println("**************************************");
+ System.err.println("KC0: "+counter);
+ }
+
+ final int c0 = counter.getCount();
for(int i=0; i<typeCount; i++) {
- robot.keyPress(java.awt.event.KeyEvent.VK_A);
- robot.delay(ROBOT_DELAY);
- robot.keyRelease(java.awt.event.KeyEvent.VK_A);
- robot.delay(ROBOT_DELAY);
+ keyType(i, robot, keyCode, obj, counter);
}
- // Wait for the key events to be processed.
- int wait;
- for (wait=0; wait<POLL_DIVIDER && (keyTypedCounter.getCount()-c0)<typeCount; wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
- }
- return keyTypedCounter.getCount()-c0;
+ if(DEBUG) { System.err.println("KC3.0: "+counter); }
+ Assert.assertEquals("Wrong key count", typeCount, counter.getCount()-c0);
}
+ static int mouseClick(int i, Robot robot, int mouseButton,
+ Object obj, InputEventCountAdapter counter) throws InterruptedException, AWTException, InvocationTargetException
+ {
+ int j;
+ int tc = 0;
+ final long t0 = System.currentTimeMillis();
+
+ for(j=0; 1 > tc && j<RETRY_NUMBER; j++) {
+ if(!hasFocus(obj)) {
+ // focus lost for some reason, regain it programmatic
+ if(DEBUG) { System.err.println(i+":"+j+" MC1.0: "+counter+" - regain focus"); }
+ requestFocus(null, obj);
+ }
+ final int c0 = counter.getCount();
+ if(DEBUG) { System.err.println(i+":"+j+" MC1.1: "+counter); }
+ robot.waitForIdle();
+ robot.mousePress(mouseButton);
+ robot.mouseRelease(mouseButton);
+ if(DEBUG) { System.err.println(i+":"+j+" MC1.2: "+counter); }
+ tc = counter.getCount() - c0;
+ for (int wait=0; wait<POLL_DIVIDER && 1 > tc; wait++) {
+ robot.delay(TIME_SLICE);
+ tc = counter.getCount() - c0;
+ }
+ if(DEBUG) { System.err.println(i+":"+j+" MC1.X: tc "+tc+", "+counter); }
+ }
+ Assert.assertEquals("Mouse ("+i+":"+j+") not clicked one time", 1, tc);
+ return (int) ( System.currentTimeMillis() - t0 ) ;
+ }
+
/**
* @param mouseButton ie InputEvent.BUTTON1_MASK
* @param clickCount ie 1, or 2
- * @return True if the desired clickCount within TIME_OUT has been received
*/
- public static int testMouseClick(Robot robot, int mouseButton, int clickCount,
- Object obj, EventCountAdapter mouseClickCounter)
+ public static void assertMouseClick(Robot robot, int mouseButton, int clickCount,
+ Object obj, InputEventCountAdapter counter)
throws AWTException, InterruptedException, InvocationTargetException {
if(null == robot) {
@@ -293,35 +360,35 @@ public class AWTRobotUtil {
centerMouse(robot, obj);
- robot.delay(2*clickTO);
-
- int c0 = mouseClickCounter.getCount();
-
+ Assert.assertEquals("Mouse already pressed", false, counter.isPressed());
+
+ if(DEBUG) {
+ System.err.println("**************************************");
+ System.err.println("MC0: "+counter);
+ }
+
+ final int c0 = counter.getCount();
+
for(int i=0; i<clickCount; i++) {
- robot.mousePress(mouseButton);
- robot.delay(clickTO/4);
- robot.mouseRelease(mouseButton);
- robot.delay(clickTO/4);
+ final int waited = mouseClick(i, robot, mouseButton, obj, counter);
+ if(DEBUG) { System.err.println(i+": MC2.X: "+counter+", consumed: "+waited); }
+ robot.delay( clickTO + 1 );
}
- // Wait for the key events to be processed.
- int wait;
- for (wait=0; wait<POLL_DIVIDER && (mouseClickCounter.getCount()-c0)<clickCount; wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
- }
- return mouseClickCounter.getCount()-c0;
+ if(DEBUG) { System.err.println("MC3.0: "+counter); }
+ Assert.assertEquals("Wrong mouse click count", clickCount, counter.getCount() - c0);
}
/**
*
- * @return True if the EventCountAdapter became the desired value within TIME_OUT
+ * @return True if the FocusEventCountAdapter became the desired value within TIME_OUT
*/
- public static boolean waitForCount(int desired, EventCountAdapter eca) throws InterruptedException {
+ public static boolean waitForFocusCount(boolean desired, FocusEventCountAdapter eca) throws InterruptedException {
for (int wait=0; wait<POLL_DIVIDER; wait++) {
- if( eca.getCount() == desired ) {
+ if( eca.hasFocus() == desired ) {
return true;
}
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
return false;
}
@@ -335,12 +402,12 @@ public class AWTRobotUtil {
if(obj instanceof Component) {
Component comp = (Component) obj;
for (wait=0; wait<POLL_DIVIDER && visible != comp.isVisible(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
} else if(obj instanceof com.jogamp.newt.Window) {
com.jogamp.newt.Window win = (com.jogamp.newt.Window) obj;
for (wait=0; wait<POLL_DIVIDER && visible != win.isVisible(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
} else {
throw new RuntimeException("Neither AWT nor NEWT: "+obj);
@@ -357,31 +424,31 @@ public class AWTRobotUtil {
if (obj instanceof Component) {
Component comp = (Component) obj;
for (wait=0; wait<POLL_DIVIDER && realized != comp.isDisplayable(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
// if GLCanvas, ensure it got also painted -> drawable.setRealized(true);
if(wait<POLL_DIVIDER && comp instanceof GLCanvas) {
GLCanvas glcanvas = (GLCanvas) comp;
for (wait=0; wait<POLL_DIVIDER && realized != glcanvas.isRealized(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
if(wait>=POLL_DIVIDER) {
// for some reason GLCanvas hasn't been painted yet, force it!
System.err.println("XXX: FORCE REPAINT PRE - canvas: "+glcanvas);
glcanvas.repaint();
for (wait=0; wait<POLL_DIVIDER && realized != glcanvas.isRealized(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
System.err.println("XXX: FORCE REPAINT POST - canvas: "+glcanvas);
}
for (wait=0; wait<POLL_DIVIDER && realized != glcanvas.isRealized(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
}
} else if(obj instanceof com.jogamp.newt.Window) {
com.jogamp.newt.Window win = (com.jogamp.newt.Window) obj;
for (wait=0; wait<POLL_DIVIDER && realized != win.isNativeValid(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
} else {
throw new RuntimeException("Neither AWT nor NEWT: "+obj);
@@ -414,11 +481,11 @@ public class AWTRobotUtil {
}
int wait;
for (wait=0; wait<POLL_DIVIDER && !closingListener.isWindowClosing(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
if(wait<POLL_DIVIDER && willClose) {
for (wait=0; wait<POLL_DIVIDER && !closingListener.isWindowClosed(); wait++) {
- Thread.sleep(TIME_OUT/POLL_DIVIDER);
+ Thread.sleep(TIME_SLICE);
}
}
return wait<POLL_DIVIDER;