diff options
author | Sven Gothel <[email protected]> | 2012-01-18 23:24:42 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2012-01-18 23:24:42 +0100 |
commit | 60d91b002fa941ab971ff9ed5ad6002f72c92af1 (patch) | |
tree | 6d7f53aca4cd3c180b1758a859e5cd387a4dc19e /src | |
parent | ab3c5678527ba2e4f092b7426527b8053d12e790 (diff) |
UI Test / AWTRobotUtil: Relax and fix focus tests
- toFront*(..) uses the AWT Window focus state, instead of our AWTWindowFocusAdapter,
which removes false negatives.
Often the focus is already hold on the Window where no focus change
will be recognized by our AWTWindowFocusAdapter.
- assertRequestFocusAndWait(..) recovers from lack of focus-lost event
(if received focus-gained) and only dumps the case - returns success.
- Since assertRequestFocusAndWait(..) implicitly tests the passed
FocusAdapter and relaxes the constraints (see above)
no more post-call assertions on the FocusAdapter is being performed (removed).
- assertRequestFocusAndWait(..) is no more used on AWT Window or Frame,
see 1st note above!
Diffstat (limited to 'src')
5 files changed, 70 insertions, 39 deletions
diff --git a/src/test/com/jogamp/opengl/test/junit/jogl/newt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java b/src/test/com/jogamp/opengl/test/junit/jogl/newt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java index 213d3ad05..bacf54506 100644 --- a/src/test/com/jogamp/opengl/test/junit/jogl/newt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java +++ b/src/test/com/jogamp/opengl/test/junit/jogl/newt/TestSwingAWTRobotUsageBeforeJOGLInitBug411.java @@ -157,7 +157,9 @@ public class TestSwingAWTRobotUsageBeforeJOGLInitBug411 extends UITestCase { robot = new Robot(); robot.setAutoWaitForIdle(true); - AWTRobotUtil.toFront(robot, frame); + Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame, true)); + AWTRobotUtil.clearAWTFocus(robot); + AWTRobotUtil.toFrontAndRequestFocus(robot, frame); AWTRobotUtil.requestFocus(robot, button); System.err.println("TestSwingAWTRobotUsageBeforeJOGLInitBug411.setup(): Before JOGL init"); @@ -195,7 +197,7 @@ public class TestSwingAWTRobotUsageBeforeJOGLInitBug411 extends UITestCase { } }); - AWTRobotUtil.toFront(robot, frame); + AWTRobotUtil.toFrontAndRequestFocus(robot, frame); drawable.addGLEventListener(new GearsES2()); @@ -214,6 +216,7 @@ public class TestSwingAWTRobotUsageBeforeJOGLInitBug411 extends UITestCase { drawable.addGLEventListener(new SwingGLAction()); Point p0 = canvas.getLocationOnScreen(); + p0.translate(10,10); robot.mouseMove( (int) ( p0.getX() + .5 ) , (int) ( p0.getY() + .5 ) ); robot.mousePress(InputEvent.BUTTON1_MASK); 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 fe7fef09f..bb67e77ea 100644 --- a/src/test/com/jogamp/opengl/test/junit/newt/TestFocus01SwingAWTRobot.java +++ b/src/test/com/jogamp/opengl/test/junit/newt/TestFocus01SwingAWTRobot.java @@ -35,7 +35,6 @@ import org.junit.Assume; import java.awt.AWTException; import java.awt.BorderLayout; import java.awt.Button; -import java.awt.Color; import java.awt.Robot; import java.lang.reflect.InvocationTargetException; @@ -132,7 +131,10 @@ public class TestFocus01SwingAWTRobot extends UITestCase { public void run() { frame1.setVisible(true); } } ); - Assert.assertTrue(AWTRobotUtil.toFront(robot, frame1)); + Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); + Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow1, true)); + AWTRobotUtil.clearAWTFocus(robot); + Assert.assertTrue(AWTRobotUtil.toFrontAndRequestFocus(robot, frame1)); Thread.sleep(durationPerTest); // manual testing @@ -145,7 +147,6 @@ 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 @@ -153,9 +154,6 @@ public class TestFocus01SwingAWTRobot extends UITestCase { System.err.println("FOCUS AWT Button request"); EventCountAdapterUtil.reset(eventCountAdapters); AWTRobotUtil.assertRequestFocusAndWait(robot, button, button, buttonFA, frame1FA); - Assert.assertEquals(true, buttonFA.focusGained()); - Assert.assertEquals(false, frame1FA.focusGained()); - Assert.assertEquals(true, frame1FA.focusLost()); Assert.assertEquals(false, glWindow1FA.focusGained()); Assert.assertEquals(false, newtCanvasAWTFA.focusGained()); System.err.println("FOCUS AWT Button sync"); @@ -166,9 +164,6 @@ public class TestFocus01SwingAWTRobot extends UITestCase { System.err.println("FOCUS NEWT Canvas/GLWindow request"); EventCountAdapterUtil.reset(eventCountAdapters); AWTRobotUtil.assertRequestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonFA); - Assert.assertEquals(true, glWindow1FA.focusGained()); - Assert.assertEquals(false, buttonFA.focusGained()); - Assert.assertEquals(true, buttonFA.focusLost()); Assert.assertEquals(false, newtCanvasAWTFA.focusGained()); System.err.println("FOCUS NEWT Canvas/GLWindow sync"); AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, glWindow1, glWindow1KA); 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 b9eb748b7..a0efa53ad 100644 --- a/src/test/com/jogamp/opengl/test/junit/newt/TestFocus02SwingAWTRobot.java +++ b/src/test/com/jogamp/opengl/test/junit/newt/TestFocus02SwingAWTRobot.java @@ -156,7 +156,10 @@ public class TestFocus02SwingAWTRobot extends UITestCase { public void run() { jFrame1.setVisible(true); } } ); - Assert.assertTrue(AWTRobotUtil.toFront(robot, jFrame1)); + Assert.assertEquals(true, AWTRobotUtil.waitForVisible(jFrame1, true)); + Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow1, true)); + AWTRobotUtil.clearAWTFocus(robot); + Assert.assertTrue(AWTRobotUtil.toFrontAndRequestFocus(robot, jFrame1)); int wait=0; while(wait<awtWaitTimeout/10 && glWindow1.getTotalFPSFrames()<1) { Thread.sleep(awtWaitTimeout/100); wait++; } @@ -167,7 +170,6 @@ public class TestFocus02SwingAWTRobot extends UITestCase { // Continuous animation .. Animator animator1 = new Animator(glWindow1); animator1.start(); - AWTRobotUtil.assertRequestFocusAndWait(robot, jFrame1, jFrame1, jFrame1FA, null); Thread.sleep(durationPerTest); // manual testing @@ -176,13 +178,9 @@ public class TestFocus02SwingAWTRobot extends UITestCase { System.err.println("FOCUS AWT Button Outer request"); EventCountAdapterUtil.reset(eventCountAdapters); AWTRobotUtil.assertRequestFocusAndWait(robot, buttonNorthOuter, buttonNorthOuter, buttonNorthOuterFA, jFrame1FA); - Assert.assertEquals(true, buttonNorthOuterFA.focusGained()); - Assert.assertEquals(false, jFrame1FA.focusGained()); - Assert.assertEquals(true, jFrame1FA.focusLost()); Assert.assertEquals(false, glWindow1FA.focusGained()); Assert.assertEquals(false, newtCanvasAWTFA.focusGained()); Assert.assertEquals(false, buttonNorthInnerFA.focusGained()); - Assert.assertEquals(false, jFrame1FA.focusGained()); System.err.println("FOCUS AWT Button Outer sync"); AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, buttonNorthOuter, buttonNorthOuterKA); AWTRobotUtil.assertMouseClick(robot, java.awt.event.InputEvent.BUTTON1_MASK, 1, @@ -195,12 +193,8 @@ public class TestFocus02SwingAWTRobot extends UITestCase { System.err.println("FOCUS NEWT Canvas/GLWindow request"); EventCountAdapterUtil.reset(eventCountAdapters); AWTRobotUtil.assertRequestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonNorthOuterFA); - Assert.assertEquals(true, glWindow1FA.focusGained()); - Assert.assertEquals(false, buttonNorthOuterFA.focusGained()); - Assert.assertEquals(true, buttonNorthOuterFA.focusLost()); Assert.assertEquals(false, newtCanvasAWTFA.focusGained()); Assert.assertEquals(false, buttonNorthInnerFA.focusGained()); - Assert.assertEquals(false, buttonNorthOuterFA.focusGained()); Assert.assertEquals(false, jFrame1FA.focusGained()); System.err.println("FOCUS NEWT Canvas/GLWindow sync"); AWTRobotUtil.assertKeyType(robot, java.awt.event.KeyEvent.VK_A, 2, glWindow1, glWindow1KA); @@ -216,9 +210,6 @@ public class TestFocus02SwingAWTRobot extends UITestCase { System.err.println("FOCUS AWT Button request"); EventCountAdapterUtil.reset(eventCountAdapters); AWTRobotUtil.assertRequestFocusAndWait(robot, buttonNorthInner, buttonNorthInner, buttonNorthInnerFA, glWindow1FA); - Assert.assertEquals(true, buttonNorthInnerFA.focusGained()); - Assert.assertEquals(false, glWindow1FA.focusGained()); - Assert.assertEquals(true, glWindow1FA.focusLost()); Assert.assertEquals(false, newtCanvasAWTFA.focusGained()); Assert.assertEquals(false, buttonNorthOuterFA.focusGained()); Assert.assertEquals(false, jFrame1FA.focusGained()); @@ -235,9 +226,6 @@ public class TestFocus02SwingAWTRobot extends UITestCase { EventCountAdapterUtil.reset(eventCountAdapters); AWTRobotUtil.assertRequestFocusAndWait(robot, newtCanvasAWT, newtCanvasAWT.getNEWTChild(), glWindow1FA, buttonNorthInnerFA); Assert.assertTrue(AWTRobotUtil.waitForFocusCount(false, newtCanvasAWTFA)); - Assert.assertEquals(true, glWindow1FA.focusGained()); - Assert.assertEquals(false, buttonNorthInnerFA.focusGained()); - Assert.assertEquals(true, buttonNorthInnerFA.focusLost()); Assert.assertEquals(false, newtCanvasAWTFA.focusGained()); Assert.assertEquals(false, buttonNorthOuterFA.focusGained()); Assert.assertEquals(false, jFrame1FA.focusGained()); diff --git a/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParentingFocusTraversal01AWT.java b/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParentingFocusTraversal01AWT.java index b23c17022..7444b438e 100644 --- a/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParentingFocusTraversal01AWT.java +++ b/src/test/com/jogamp/opengl/test/junit/newt/parenting/TestParentingFocusTraversal01AWT.java @@ -191,7 +191,9 @@ public class TestParentingFocusTraversal01AWT extends UITestCase { }}); Assert.assertEquals(true, AWTRobotUtil.waitForVisible(glWindow1, true)); Assert.assertEquals(newtCanvasAWT1.getNativeWindow(),glWindow1.getParent()); - + AWTRobotUtil.clearAWTFocus(robot); + Assert.assertTrue(AWTRobotUtil.toFrontAndRequestFocus(robot, frame1)); + Assert.assertEquals(true, animator1.isAnimating()); Assert.assertEquals(false, animator1.isPaused()); Assert.assertNotNull(animator1.getThread()); @@ -203,7 +205,6 @@ public class TestParentingFocusTraversal01AWT extends UITestCase { // initial focus on bWest // AWTRobotUtil.assertRequestFocusAndWait(robot, cWest, cWest, bWestFA, null); - Assert.assertEquals(true, bWestFA.focusGained()); Thread.sleep(durationPerTest/numFocus); // 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 a27bdd7a2..b626ed282 100644 --- a/src/test/com/jogamp/opengl/test/junit/util/AWTRobotUtil.java +++ b/src/test/com/jogamp/opengl/test/junit/util/AWTRobotUtil.java @@ -37,6 +37,7 @@ import java.awt.KeyboardFocusManager; import java.awt.Robot; import java.awt.Toolkit; +import javax.media.nativewindow.NativeWindow; import javax.media.opengl.awt.GLCanvas; import org.junit.Assert; @@ -52,6 +53,20 @@ public class AWTRobotUtil { public static final int TIME_SLICE = TIME_OUT / POLL_DIVIDER ; public static Integer AWT_CLICK_TO = null; + public static void clearAWTFocus(Robot robot) throws InterruptedException, InvocationTargetException, AWTException { + if(null == robot) { + robot = new Robot(); + robot.setAutoWaitForIdle(true); + } + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + System.err.println("******** clearAWTFocus.0"); + KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner(); + }}); + robot.delay(ROBOT_DELAY); + System.err.println("******** clearAWTFocus.X"); + } + public static java.awt.Point getCenterLocation(Object obj, boolean onTitleBarIfWindow) throws InterruptedException, InvocationTargetException { Component comp = null; @@ -99,9 +114,10 @@ public class AWTRobotUtil { * * @return True if the Window became the global focused Window within TIME_OUT */ - public static boolean toFront(Robot robot, final java.awt.Window window) + public static boolean toFrontAndRequestFocus(Robot robot, final java.awt.Window window) throws AWTException, InterruptedException, InvocationTargetException { + // just for event tracing .. AWTWindowFocusAdapter winFA = new AWTWindowFocusAdapter("window"); window.addWindowFocusListener(winFA); @@ -110,7 +126,7 @@ public class AWTRobotUtil { robot.setAutoWaitForIdle(true); } java.awt.Point p0 = getCenterLocation(window, false); - System.err.println("robot pos: "+p0); + System.err.println("toFront: robot pos: "+p0); robot.mouseMove( (int) p0.getX(), (int) p0.getY() ); robot.delay(ROBOT_DELAY); @@ -123,11 +139,18 @@ public class AWTRobotUtil { robot.delay(ROBOT_DELAY); int wait; - for (wait=0; wait<POLL_DIVIDER && !winFA.focusGained(); wait++) { + for (wait=0; wait<POLL_DIVIDER && !window.hasFocus(); wait++) { Thread.sleep(TIME_SLICE); } + final boolean success = wait<POLL_DIVIDER; window.removeWindowFocusListener(winFA); - return wait<POLL_DIVIDER; + if(!success) { + System.err.println("*** AWTRobotUtil.toFrontAndRequestFocus() UI failure"); + System.err.println("*** window: "+window); + System.err.println("*** window.hasFocus(): "+window.hasFocus()); + Thread.dumpStack(); + } + return success; } /** @@ -143,7 +166,7 @@ public class AWTRobotUtil { } java.awt.Point p0 = getCenterLocation(obj, onTitleBarIfWindow); - System.err.println("robot pos: "+p0); + System.err.println("centerMouse: robot pos: "+p0+", onTitleBarIfWindow: "+onTitleBarIfWindow); robot.mouseMove( (int) p0.getX(), (int) p0.getY() ); robot.delay(ROBOT_DELAY); @@ -190,9 +213,11 @@ public class AWTRobotUtil { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { comp.requestFocus(); + System.err.println("requestFocus: AWT Component"); }}); } else { win.requestFocus(); + System.err.println("requestFocus: NEWT Component"); } } else { final int mouseButton = java.awt.event.InputEvent.BUTTON1_MASK; @@ -201,7 +226,9 @@ public class AWTRobotUtil { robot.waitForIdle(); robot.mousePress(mouseButton); robot.mouseRelease(mouseButton); - robot.delay( getClickTimeout(obj) + 1 ); + final int d = getClickTimeout(obj) + 1; + robot.delay( d ); + System.err.println("requestFocus: click, d: "+d+" ms"); } } @@ -275,10 +302,27 @@ public class AWTRobotUtil { hasFocus = waitForFocus(waitForFocus, gain, lost); } if(!hasFocus) { - System.err.println("requestFocus: "+requestFocus); - System.err.println("waitForFocus: "+waitForFocus); - System.err.println("gain: "+gain); - System.err.println("lost: "+lost); + System.err.print("*** AWTRobotUtil.assertRequestFocusAndWait() "); + if(gain.focusGained() && !lost.focusLost()) { + // be error tolerant here, some impl. may lack focus-lost events (OS X) + System.err.println("minor UI failure"); + hasFocus = true; + } else { + System.err.println("major UI failure"); + } + if(requestFocus instanceof Component) { + System.err.println("*** requestFocus.hasFocus() - AWT: "+((Component)requestFocus).hasFocus()); + } else if(requestFocus instanceof NativeWindow) { + System.err.println("*** requestFocus.hasFocus() - NW: "+((NativeWindow)requestFocus).hasFocus()); + } + if(waitForFocus instanceof Component) { + System.err.println("*** waitForFocus.hasFocus() - AWT: "+((Component)waitForFocus).hasFocus()); + } else if(waitForFocus instanceof NativeWindow) { + System.err.println("*** waitForFocus.hasFocus() - NW: "+((NativeWindow)waitForFocus).hasFocus()); + } + System.err.println("*** gain: "+gain); + System.err.println("*** lost: "+lost); + Thread.dumpStack(); } Assert.assertTrue("Did not gain focus", hasFocus); } |