From 85851c9839d620bcbbd07b6ca833f1a5901831cc Mon Sep 17 00:00:00 2001 From: Sven Gothel <sgothel@jausoft.com> Date: Mon, 29 Oct 2012 11:31:00 +0100 Subject: Rename NEWT KeyEvent Unit tests to end w/ AWT, otherwise no AWT classes will be included in unit test run. --- .../opengl/test/junit/newt/TestKeyCodeNEWT.java | 256 ----------------- .../junit/newt/TestKeyEventAutoRepeatNEWT.java | 309 --------------------- .../test/junit/newt/TestKeyEventOrderNEWT.java | 235 ---------------- .../newt/TestKeyPressReleaseUnmaskRepeatNEWT.java | 222 --------------- .../opengl/test/junit/newt/TestNewtKeyCodeAWT.java | 256 +++++++++++++++++ .../junit/newt/TestNewtKeyEventAutoRepeatAWT.java | 309 +++++++++++++++++++++ .../test/junit/newt/TestNewtKeyEventOrderAWT.java | 235 ++++++++++++++++ .../TestNewtKeyPressReleaseUnmaskRepeatAWT.java | 222 +++++++++++++++ 8 files changed, 1022 insertions(+), 1022 deletions(-) delete mode 100644 src/test/com/jogamp/opengl/test/junit/newt/TestKeyCodeNEWT.java delete mode 100644 src/test/com/jogamp/opengl/test/junit/newt/TestKeyEventAutoRepeatNEWT.java delete mode 100644 src/test/com/jogamp/opengl/test/junit/newt/TestKeyEventOrderNEWT.java delete mode 100644 src/test/com/jogamp/opengl/test/junit/newt/TestKeyPressReleaseUnmaskRepeatNEWT.java create mode 100644 src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyCodeAWT.java create mode 100644 src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyEventAutoRepeatAWT.java create mode 100644 src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyEventOrderAWT.java create mode 100644 src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyPressReleaseUnmaskRepeatAWT.java (limited to 'src/test') diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestKeyCodeNEWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestKeyCodeNEWT.java deleted file mode 100644 index 8af0f0246..000000000 --- a/src/test/com/jogamp/opengl/test/junit/newt/TestKeyCodeNEWT.java +++ /dev/null @@ -1,256 +0,0 @@ -/** - * Copyright 2012 JogAmp Community. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of JogAmp Community. - */ - -package com.jogamp.opengl.test.junit.newt; - -import org.junit.After; -import org.junit.Assert; -import org.junit.AfterClass; -import org.junit.Assume; -import org.junit.Before; - -import java.awt.AWTException; -import java.awt.BorderLayout; -import java.awt.Robot; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.EventObject; -import java.util.List; - -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLEventListener; -import javax.swing.JFrame; - -import java.io.IOException; - -import org.junit.BeforeClass; -import org.junit.Test; - -import com.jogamp.newt.awt.NewtCanvasAWT; -import com.jogamp.newt.opengl.GLWindow; -import com.jogamp.opengl.util.Animator; -import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2; - -import com.jogamp.opengl.test.junit.util.*; -import com.jogamp.opengl.test.junit.util.NEWTKeyUtil.CodeSeg; - -/** - * Testing key event order incl. auto-repeat (Bug 601) - * - * <p> - * Note Event order: - * <ol> - * <li>{@link #EVENT_KEY_PRESSED}</li> - * <li>{@link #EVENT_KEY_RELEASED}</li> - * <li>{@link #EVENT_KEY_TYPED}</li> - * </ol> - * </p> - */ -public class TestKeyCodeNEWT extends UITestCase { - static int width, height; - static long durationPerTest = 100; - static long awtWaitTimeout = 1000; - - static GLCapabilities glCaps; - - @BeforeClass - public static void initClass() { - width = 640; - height = 480; - glCaps = new GLCapabilities(null); - } - - @AfterClass - public static void release() { - } - - @Before - public void initTest() { - } - - @After - public void releaseTest() { - } - - @Test - public void test01NEWT() throws AWTException, InterruptedException, InvocationTargetException { - GLWindow glWindow = GLWindow.create(glCaps); - glWindow.setSize(width, height); - glWindow.setVisible(true); - - testImpl(glWindow); - - glWindow.destroy(); - } - - // @Test - public void test02NewtCanvasAWT() throws AWTException, InterruptedException, InvocationTargetException { - GLWindow glWindow = GLWindow.create(glCaps); - - // Wrap the window in a canvas. - final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow); - - // Add the canvas to a frame, and make it all visible. - final JFrame frame1 = new JFrame("Swing AWT Parent Frame: "+ glWindow.getTitle()); - frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER); - frame1.setSize(width, height); - javax.swing.SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame1.setVisible(true); - } } ); - - Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); - - testImpl(glWindow); - - try { - javax.swing.SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame1.setVisible(false); - frame1.dispose(); - }}); - } catch( Throwable throwable ) { - throwable.printStackTrace(); - Assume.assumeNoException( throwable ); - } - glWindow.destroy(); - } - - static CodeSeg[] codeSegments = new CodeSeg[] { - new CodeSeg(0x008, 0x00a, "bs, tab, cr"), - new CodeSeg(0x010, 0x011, "shift, ctrl"), // single alt n/a on windows - new CodeSeg(0x01B, 0x01B, "esc"), - new CodeSeg(0x020, 0x024, "space, up, down, end, home"), - new CodeSeg(0x025, 0x028, "cursor"), - new CodeSeg(0x02C, 0x02F, ", - . /"), - new CodeSeg(0x030, 0x039, "0 - 9"), - new CodeSeg(0x03B, 0x03B, ";"), - new CodeSeg(0x03D, 0x03D, "="), - new CodeSeg(0x041, 0x05A, "a - z"), - new CodeSeg(0x05B, 0x05D, "[ \\ ]"), - // new CodeSeg(0x060, 0x06B, "numpad1"), // can be mapped to normal keycodes - // new CodeSeg(0x06D, 0x06F, "numpad2"), // can be mapped to normal keycodes - new CodeSeg(0x07F, 0x07F, "del"), - // new CodeSeg(0x090, 0x091, "num lock, scroll lock"), - // new CodeSeg(0x070, 0x07B, "F1 - F12"), - // new CodeSeg(0x09A, 0x09D, "prt ins hlp meta"), - new CodeSeg(0x0C0, 0x0C0, "back quote"), - new CodeSeg(0x0DE, 0x0DE, "quote"), - // new CodeSeg(0x0E0, 0x0E3, "cursor kp"), - // new CodeSeg(0x080, 0x08F, "dead-1"), - // new CodeSeg(0x096, 0x0A2, "& ^ \" < > { }"), - // new CodeSeg(0x200, 0x20D, "extra-2"), // @ ; .. - }; - - static void testKeyCode(Robot robot, NEWTKeyAdapter keyAdapter) { - List<List<EventObject>> cse = new ArrayList<List<EventObject>>(); - - for(int i=0; i<codeSegments.length; i++) { - keyAdapter.reset(); - final CodeSeg codeSeg = codeSegments[i]; - // System.err.println("*** Segment "+codeSeg.description); - for(int c=codeSeg.min; c<=codeSeg.max; c++) { - // System.err.println("*** KeyCode 0x"+Integer.toHexString(c)); - AWTRobotUtil.keyPress(0, robot, true, c, 10); - AWTRobotUtil.keyPress(0, robot, false, c, 10); - robot.waitForIdle(); - } - final int codeCount = codeSeg.max - codeSeg.min + 1; - final List<EventObject> queue = keyAdapter.getQueued(); - for(int j=0; j < 10 && queue.size() < 3 * codeCount; j++) { // wait until events are collected - robot.delay(100); - } - final ArrayList<EventObject> events = new ArrayList<EventObject>(queue); - cse.add(events); - } - Assert.assertEquals("KeyCode impl. incomplete", true, NEWTKeyUtil.validateKeyCode(codeSegments, cse, true)); - } - - void testImpl(GLWindow glWindow) throws AWTException, InterruptedException, InvocationTargetException { - final Robot robot = new Robot(); - robot.setAutoWaitForIdle(true); - - GLEventListener demo1 = new RedSquareES2(); - TestListenerCom01AWT.setDemoFields(demo1, glWindow, false); - glWindow.addGLEventListener(demo1); - - NEWTKeyAdapter glWindow1KA = new NEWTKeyAdapter("GLWindow1"); - glWindow1KA.setVerbose(false); - glWindow.addKeyListener(glWindow1KA); - - Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, true)); - AWTRobotUtil.clearAWTFocus(robot); - - // Continuous animation .. - Animator animator = new Animator(glWindow); - animator.start(); - - Thread.sleep(durationPerTest); // manual testing - - glWindow1KA.reset(); - AWTRobotUtil.assertRequestFocusAndWait(null, glWindow, glWindow, null, null); // programmatic - // AWTRobotUtil.assertRequestFocusAndWait(robot, glWindow, glWindow, null, null); // by mouse click - - // - // Test the key event order w/o auto-repeat - // - testKeyCode(robot, glWindow1KA); - - // Remove listeners to avoid logging during dispose/destroy. - glWindow.removeKeyListener(glWindow1KA); - - // Shutdown the test. - animator.stop(); - } - - static int atoi(String a) { - int i=0; - try { - i = Integer.parseInt(a); - } catch (Exception ex) { ex.printStackTrace(); } - return i; - } - - public static void main(String args[]) throws IOException { - for(int i=0; i<args.length; i++) { - if(args[i].equals("-time")) { - durationPerTest = atoi(args[++i]); - } - } - /** - BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); - System.err.println("Press enter to continue"); - System.err.println(stdin.readLine()); - */ - System.out.println("durationPerTest: "+durationPerTest); - String tstname = TestKeyCodeNEWT.class.getName(); - org.junit.runner.JUnitCore.main(tstname); - } - - -} diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestKeyEventAutoRepeatNEWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestKeyEventAutoRepeatNEWT.java deleted file mode 100644 index 22c362dd8..000000000 --- a/src/test/com/jogamp/opengl/test/junit/newt/TestKeyEventAutoRepeatNEWT.java +++ /dev/null @@ -1,309 +0,0 @@ -/** - * Copyright 2012 JogAmp Community. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of JogAmp Community. - */ - -package com.jogamp.opengl.test.junit.newt; - -import org.junit.After; -import org.junit.Assert; -import org.junit.AfterClass; -import org.junit.Assume; -import org.junit.Before; - -import java.awt.AWTException; -import java.awt.BorderLayout; -import java.awt.Robot; -import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; -import java.util.EventObject; -import java.util.List; - -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLEventListener; -import javax.swing.JFrame; - -import java.io.IOException; - -import org.junit.BeforeClass; -import org.junit.Test; - -import com.jogamp.newt.awt.NewtCanvasAWT; -import com.jogamp.newt.event.InputEvent; -import com.jogamp.newt.event.KeyEvent; -import com.jogamp.newt.opengl.GLWindow; -import com.jogamp.opengl.util.Animator; -import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2; - -import com.jogamp.opengl.test.junit.util.*; - -/** - * Testing key event order incl. auto-repeat (Bug 601) - * - * <p> - * Note Event order: - * <ol> - * <li>{@link #EVENT_KEY_PRESSED}</li> - * <li>{@link #EVENT_KEY_RELEASED}</li> - * <li>{@link #EVENT_KEY_TYPED}</li> - * </ol> - * </p> - * <p> - * Auto-Repeat shall behave as follow: - * <pre> - D = pressed, U = released, T = typed - 0 = normal, 1 = auto-repeat - - D(0), [ U(1), T(1), D(1), U(1) T(1) ..], U(0) T(0) - * </pre> - * - * The idea is if you mask out auto-repeat in your event listener - * you just get one long pressed key D/U/T triple. - */ -public class TestKeyEventAutoRepeatNEWT extends UITestCase { - static int width, height; - static long durationPerTest = 100; - static long awtWaitTimeout = 1000; - - static GLCapabilities glCaps; - - @BeforeClass - public static void initClass() { - width = 640; - height = 480; - glCaps = new GLCapabilities(null); - } - - @AfterClass - public static void release() { - } - - @Before - public void initTest() { - } - - @After - public void releaseTest() { - } - - @Test - public void test01NEWT() throws AWTException, InterruptedException, InvocationTargetException { - GLWindow glWindow = GLWindow.create(glCaps); - glWindow.setSize(width, height); - glWindow.setVisible(true); - - testImpl(glWindow); - - glWindow.destroy(); - } - - @Test - public void test02NewtCanvasAWT() throws AWTException, InterruptedException, InvocationTargetException { - GLWindow glWindow = GLWindow.create(glCaps); - - // Wrap the window in a canvas. - final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow); - - // Add the canvas to a frame, and make it all visible. - final JFrame frame1 = new JFrame("Swing AWT Parent Frame: "+ glWindow.getTitle()); - frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER); - frame1.setSize(width, height); - javax.swing.SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame1.setVisible(true); - } } ); - - Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); - - testImpl(glWindow); - - try { - javax.swing.SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame1.setVisible(false); - frame1.dispose(); - }}); - } catch( Throwable throwable ) { - throwable.printStackTrace(); - Assume.assumeNoException( throwable ); - } - glWindow.destroy(); - } - - static void testKeyEventAutoRepeat(Robot robot, NEWTKeyAdapter keyAdapter, int loops, int pressDurationMS) { - System.err.println("KEY Event Auto-Repeat Test: "+loops); - EventObject[][] first = new EventObject[loops][3]; - EventObject[][] last = new EventObject[loops][3]; - - keyAdapter.reset(); - final List<EventObject> keyEvents = keyAdapter.getQueued(); - int firstIdx = 0; - for(int i=0; i<loops; i++) { - System.err.println("+++ KEY Event Auto-Repeat START Input Loop: "+i); - AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_A, pressDurationMS); - robot.waitForIdle(); - AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_A, 1000); // 1s .. no AR anymore - robot.waitForIdle(); - first[i][0] = (KeyEvent) keyEvents.get(firstIdx+0); - first[i][1] = (KeyEvent) keyEvents.get(firstIdx+1); - first[i][2] = (KeyEvent) keyEvents.get(firstIdx+2); - firstIdx = keyEvents.size() - 3; - last[i][0] = (KeyEvent) keyEvents.get(firstIdx+0); - last[i][1] = (KeyEvent) keyEvents.get(firstIdx+1); - last[i][2] = (KeyEvent) keyEvents.get(firstIdx+2); - System.err.println("+++ KEY Event Auto-Repeat END Input Loop: "+i); - - // add a pair of normal press/release in between auto-repeat! - AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_B, 10); - robot.waitForIdle(); - AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_B, 250); - robot.waitForIdle(); - firstIdx = keyEvents.size(); - } - // dumpKeyEvents(keyEvents); - - NEWTKeyUtil.validateKeyEventOrder(keyEvents); - - final boolean hasAR = 0 < keyAdapter.getKeyPressedCount(true) ; - - Assert.assertEquals("Key event count not multiple of 3", 0, keyEvents.size()%3); - final int expTotal = keyEvents.size()/3; - final int expAR = hasAR ? expTotal - loops - loops : 0; - NEWTKeyUtil.validateKeyAdapterStats(keyAdapter, expTotal, expAR); - - if( !hasAR ) { - System.err.println("No AUTO-REPEAT triggered by AWT Robot .. aborting test analysis"); - return; - } - - for(int i=0; i<loops; i++) { - System.err.println("Auto-Repeat Loop "+i+" - Head:"); - NEWTKeyUtil.dumpKeyEvents(Arrays.asList(first[i])); - System.err.println("Auto-Repeat Loop "+i+" - Tail:"); - NEWTKeyUtil.dumpKeyEvents(Arrays.asList(last[i])); - } - for(int i=0; i<loops; i++) { - KeyEvent e = (KeyEvent) first[i][0]; - Assert.assertTrue("1st Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); - Assert.assertTrue("1st Shall be PRESSED, but is "+e, KeyEvent.EVENT_KEY_PRESSED == e.getEventType() ); - Assert.assertTrue("1st Shall not be AR, but is "+e, 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); - - e = (KeyEvent) first[i][1]; - Assert.assertTrue("2nd Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); - Assert.assertTrue("2nd Shall be RELEASED, but is "+e, KeyEvent.EVENT_KEY_RELEASED == e.getEventType() ); - Assert.assertTrue("2nd Shall be AR, but is "+e, 0 != ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); - - e = (KeyEvent) first[i][2]; - Assert.assertTrue("3rd Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); - Assert.assertTrue("3rd Shall be TYPED, but is "+e, KeyEvent.EVENT_KEY_TYPED == e.getEventType() ); - Assert.assertTrue("3rd Shall be AR, but is "+e, 0 != ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); - - e = (KeyEvent) last[i][0]; - Assert.assertTrue("last-2 Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); - Assert.assertTrue("last-2 Shall be PRESSED, but is "+e, KeyEvent.EVENT_KEY_PRESSED == e.getEventType() ); - Assert.assertTrue("last-2 Shall be AR, but is "+e, 0 != ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); - - e = (KeyEvent) last[i][1]; - Assert.assertTrue("last-1 Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); - Assert.assertTrue("last-1 Shall be RELEASED, but is "+e, KeyEvent.EVENT_KEY_RELEASED == e.getEventType() ); - Assert.assertTrue("last-1 Shall not be AR, but is "+e, 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); - - e = (KeyEvent) last[i][2]; - Assert.assertTrue("last-0 Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); - Assert.assertTrue("last-0 Shall be TYPED, but is "+e, KeyEvent.EVENT_KEY_TYPED == e.getEventType() ); - Assert.assertTrue("last-0 Shall not be AR, but is "+e, 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); - } - } - - void testImpl(GLWindow glWindow) throws AWTException, InterruptedException, InvocationTargetException { - final Robot robot = new Robot(); - robot.setAutoWaitForIdle(true); - - GLEventListener demo1 = new RedSquareES2(); - TestListenerCom01AWT.setDemoFields(demo1, glWindow, false); - glWindow.addGLEventListener(demo1); - - NEWTKeyAdapter glWindow1KA = new NEWTKeyAdapter("GLWindow1"); - glWindow1KA.setVerbose(false); - glWindow.addKeyListener(glWindow1KA); - - Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, true)); - AWTRobotUtil.clearAWTFocus(robot); - - // Continuous animation .. - Animator animator = new Animator(glWindow); - animator.start(); - - Thread.sleep(durationPerTest); // manual testing - - glWindow1KA.reset(); - AWTRobotUtil.assertRequestFocusAndWait(null, glWindow, glWindow, null, null); // programmatic - // AWTRobotUtil.assertRequestFocusAndWait(robot, glWindow, glWindow, null, null); // by mouse click - - // - // Test the key event order w/ auto-repeat - // - final int origAutoDelay = robot.getAutoDelay(); - robot.setAutoDelay(10); - try { - testKeyEventAutoRepeat(robot, glWindow1KA, 3, 1000); - } finally { - robot.setAutoDelay(origAutoDelay); - } - - // Remove listeners to avoid logging during dispose/destroy. - glWindow.removeKeyListener(glWindow1KA); - - // Shutdown the test. - animator.stop(); - } - - static int atoi(String a) { - int i=0; - try { - i = Integer.parseInt(a); - } catch (Exception ex) { ex.printStackTrace(); } - return i; - } - - public static void main(String args[]) throws IOException { - for(int i=0; i<args.length; i++) { - if(args[i].equals("-time")) { - durationPerTest = atoi(args[++i]); - } - } - /** - BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); - System.err.println("Press enter to continue"); - System.err.println(stdin.readLine()); - */ - System.out.println("durationPerTest: "+durationPerTest); - String tstname = TestKeyEventAutoRepeatNEWT.class.getName(); - org.junit.runner.JUnitCore.main(tstname); - } - - -} diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestKeyEventOrderNEWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestKeyEventOrderNEWT.java deleted file mode 100644 index 31d9912d1..000000000 --- a/src/test/com/jogamp/opengl/test/junit/newt/TestKeyEventOrderNEWT.java +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Copyright 2012 JogAmp Community. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of JogAmp Community. - */ - -package com.jogamp.opengl.test.junit.newt; - -import org.junit.After; -import org.junit.Assert; -import org.junit.AfterClass; -import org.junit.Assume; -import org.junit.Before; - -import java.awt.AWTException; -import java.awt.BorderLayout; -import java.awt.Robot; -import java.lang.reflect.InvocationTargetException; - -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLEventListener; -import javax.swing.JFrame; - -import java.io.IOException; - -import org.junit.BeforeClass; -import org.junit.Test; - -import com.jogamp.newt.awt.NewtCanvasAWT; -import com.jogamp.newt.opengl.GLWindow; -import com.jogamp.opengl.util.Animator; -import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2; - -import com.jogamp.opengl.test.junit.util.*; - -/** - * Testing key event order incl. auto-repeat (Bug 601) - * - * <p> - * Note Event order: - * <ol> - * <li>{@link #EVENT_KEY_PRESSED}</li> - * <li>{@link #EVENT_KEY_RELEASED}</li> - * <li>{@link #EVENT_KEY_TYPED}</li> - * </ol> - * </p> - */ -public class TestKeyEventOrderNEWT extends UITestCase { - static int width, height; - static long durationPerTest = 100; - static long awtWaitTimeout = 1000; - - static GLCapabilities glCaps; - - @BeforeClass - public static void initClass() { - width = 640; - height = 480; - glCaps = new GLCapabilities(null); - } - - @AfterClass - public static void release() { - } - - @Before - public void initTest() { - } - - @After - public void releaseTest() { - } - - @Test - public void test01NEWT() throws AWTException, InterruptedException, InvocationTargetException { - GLWindow glWindow = GLWindow.create(glCaps); - glWindow.setSize(width, height); - glWindow.setVisible(true); - - testImpl(glWindow); - - glWindow.destroy(); - } - - @Test - public void test02NewtCanvasAWT() throws AWTException, InterruptedException, InvocationTargetException { - GLWindow glWindow = GLWindow.create(glCaps); - - // Wrap the window in a canvas. - final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow); - - // Add the canvas to a frame, and make it all visible. - final JFrame frame1 = new JFrame("Swing AWT Parent Frame: "+ glWindow.getTitle()); - frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER); - frame1.setSize(width, height); - javax.swing.SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame1.setVisible(true); - } } ); - - Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); - - testImpl(glWindow); - - try { - javax.swing.SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame1.setVisible(false); - frame1.dispose(); - }}); - } catch( Throwable throwable ) { - throwable.printStackTrace(); - Assume.assumeNoException( throwable ); - } - glWindow.destroy(); - } - - static void testKeyEventOrder(Robot robot, NEWTKeyAdapter keyAdapter, int loops) { - System.err.println("KEY Event Order Test: "+loops); - keyAdapter.reset(); - for(int i=0; i<loops; i++) { - // 1 - AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_A, 10); - AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_A, 100); - robot.waitForIdle(); - // 2 - AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_B, 10); - AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_B, 100); - robot.waitForIdle(); - // 3 + 4 - AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_A, 10); - AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_B, 10); - AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_A, 10); - AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_B, 10); - robot.waitForIdle(); - // 5 + 6 - AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_A, 10); - AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_B, 10); - AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_B, 10); - AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_A, 10); - robot.waitForIdle(); - } - robot.delay(250); - // dumpKeyEvents(keyAdapter.getQueued()); - - NEWTKeyUtil.validateKeyEventOrder(keyAdapter.getQueued()); - - NEWTKeyUtil.validateKeyAdapterStats(keyAdapter, 6*loops, 0); - } - - void testImpl(GLWindow glWindow) throws AWTException, InterruptedException, InvocationTargetException { - final Robot robot = new Robot(); - robot.setAutoWaitForIdle(true); - - GLEventListener demo1 = new RedSquareES2(); - TestListenerCom01AWT.setDemoFields(demo1, glWindow, false); - glWindow.addGLEventListener(demo1); - - NEWTKeyAdapter glWindow1KA = new NEWTKeyAdapter("GLWindow1"); - glWindow1KA.setVerbose(false); - glWindow.addKeyListener(glWindow1KA); - - Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, true)); - AWTRobotUtil.clearAWTFocus(robot); - - // Continuous animation .. - Animator animator = new Animator(glWindow); - animator.start(); - - Thread.sleep(durationPerTest); // manual testing - - glWindow1KA.reset(); - AWTRobotUtil.assertRequestFocusAndWait(null, glWindow, glWindow, null, null); // programmatic - // AWTRobotUtil.assertRequestFocusAndWait(robot, glWindow, glWindow, null, null); // by mouse click - - // - // Test the key event order w/o auto-repeat - // - testKeyEventOrder(robot, glWindow1KA, 6); - - // Remove listeners to avoid logging during dispose/destroy. - glWindow.removeKeyListener(glWindow1KA); - - // Shutdown the test. - animator.stop(); - } - - static int atoi(String a) { - int i=0; - try { - i = Integer.parseInt(a); - } catch (Exception ex) { ex.printStackTrace(); } - return i; - } - - public static void main(String args[]) throws IOException { - for(int i=0; i<args.length; i++) { - if(args[i].equals("-time")) { - durationPerTest = atoi(args[++i]); - } - } - /** - BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); - System.err.println("Press enter to continue"); - System.err.println(stdin.readLine()); - */ - System.out.println("durationPerTest: "+durationPerTest); - String tstname = TestKeyEventOrderNEWT.class.getName(); - org.junit.runner.JUnitCore.main(tstname); - } - - -} diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestKeyPressReleaseUnmaskRepeatNEWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestKeyPressReleaseUnmaskRepeatNEWT.java deleted file mode 100644 index 6f3b97f0c..000000000 --- a/src/test/com/jogamp/opengl/test/junit/newt/TestKeyPressReleaseUnmaskRepeatNEWT.java +++ /dev/null @@ -1,222 +0,0 @@ -/** - * Copyright 2012 JogAmp Community. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of JogAmp Community. - */ - -package com.jogamp.opengl.test.junit.newt; - -import org.junit.After; -import org.junit.Assert; -import org.junit.AfterClass; -import org.junit.Assume; -import org.junit.Before; - -import java.awt.AWTException; -import java.awt.BorderLayout; -import java.awt.Robot; -import java.lang.reflect.InvocationTargetException; - -import javax.media.opengl.GLCapabilities; -import javax.media.opengl.GLEventListener; -import javax.swing.JFrame; - -import java.io.IOException; - -import org.junit.BeforeClass; -import org.junit.Test; - -import com.jogamp.newt.awt.NewtCanvasAWT; -import com.jogamp.newt.event.InputEvent; -import com.jogamp.newt.event.KeyEvent; -import com.jogamp.newt.event.KeyListener; -import com.jogamp.newt.opengl.GLWindow; -import com.jogamp.opengl.util.Animator; -import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2; - -import com.jogamp.opengl.test.junit.util.*; - -/** - * Testing key press and release events w/o AUTO-REPEAT - */ -public class TestKeyPressReleaseUnmaskRepeatNEWT extends UITestCase { - static int width, height; - static long durationPerTest = 100; - static long awtWaitTimeout = 1000; - - static GLCapabilities glCaps; - - @BeforeClass - public static void initClass() { - width = 640; - height = 480; - glCaps = new GLCapabilities(null); - } - - @AfterClass - public static void release() { - } - - @Before - public void initTest() { - } - - @After - public void releaseTest() { - } - - @Test - public void test01NEWT() throws AWTException, InterruptedException, InvocationTargetException { - GLWindow glWindow = GLWindow.create(glCaps); - glWindow.setSize(width, height); - glWindow.setVisible(true); - - testImpl(glWindow); - - glWindow.destroy(); - } - - // @Test - public void test02NewtCanvasAWT() throws AWTException, InterruptedException, InvocationTargetException { - GLWindow glWindow = GLWindow.create(glCaps); - - // Wrap the window in a canvas. - final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow); - - // Add the canvas to a frame, and make it all visible. - final JFrame frame1 = new JFrame("Swing AWT Parent Frame: "+ glWindow.getTitle()); - frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER); - frame1.setSize(width, height); - javax.swing.SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame1.setVisible(true); - } } ); - - Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); - - testImpl(glWindow); - - try { - javax.swing.SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - frame1.setVisible(false); - frame1.dispose(); - }}); - } catch( Throwable throwable ) { - throwable.printStackTrace(); - Assume.assumeNoException( throwable ); - } - glWindow.destroy(); - } - - void testImpl(GLWindow glWindow) throws AWTException, InterruptedException, InvocationTargetException { - final Robot robot = new Robot(); - robot.setAutoWaitForIdle(true); - - GLEventListener demo1 = new RedSquareES2(); - TestListenerCom01AWT.setDemoFields(demo1, glWindow, false); - glWindow.addGLEventListener(demo1); - - SimpleKeyPressRelease simpleKeyPressRelease = new SimpleKeyPressRelease(); - glWindow.addKeyListener(simpleKeyPressRelease); - - Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, true)); - AWTRobotUtil.clearAWTFocus(robot); - - // Continuous animation .. - Animator animator = new Animator(glWindow); - animator.start(); - - Thread.sleep(durationPerTest); // manual testing - - AWTRobotUtil.assertRequestFocusAndWait(null, glWindow, glWindow, null, null); // programmatic - // AWTRobotUtil.assertRequestFocusAndWait(robot, glWindow, glWindow, null, null); // by mouse click - - // Remove listeners to avoid logging during dispose/destroy. - glWindow.removeKeyListener(simpleKeyPressRelease); - - // Shutdown the test. - animator.stop(); - } - - static int atoi(String a) { - int i=0; - try { - i = Integer.parseInt(a); - } catch (Exception ex) { ex.printStackTrace(); } - return i; - } - - static class SimpleKeyPressRelease implements KeyListener { - int seq; - - SimpleKeyPressRelease() { - reset(); - } - - public void reset() { - seq=0; - } - - @Override - public void keyPressed(KeyEvent e) { - if( 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ) { - seq++; - System.err.println(seq+": "+e); - } - } - - @Override - public void keyReleased(KeyEvent e) { - if( 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ) { - seq++; - System.err.println(seq+": "+e); - } - } - - @Override - public void keyTyped(KeyEvent e) { - } - - } - - public static void main(String args[]) throws IOException { - for(int i=0; i<args.length; i++) { - if(args[i].equals("-time")) { - durationPerTest = atoi(args[++i]); - } - } - /** - BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); - System.err.println("Press enter to continue"); - System.err.println(stdin.readLine()); - */ - System.out.println("durationPerTest: "+durationPerTest); - String tstname = TestKeyPressReleaseUnmaskRepeatNEWT.class.getName(); - org.junit.runner.JUnitCore.main(tstname); - } - - -} diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyCodeAWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyCodeAWT.java new file mode 100644 index 000000000..8af0f0246 --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyCodeAWT.java @@ -0,0 +1,256 @@ +/** + * Copyright 2012 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ + +package com.jogamp.opengl.test.junit.newt; + +import org.junit.After; +import org.junit.Assert; +import org.junit.AfterClass; +import org.junit.Assume; +import org.junit.Before; + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Robot; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.EventObject; +import java.util.List; + +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLEventListener; +import javax.swing.JFrame; + +import java.io.IOException; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.jogamp.newt.awt.NewtCanvasAWT; +import com.jogamp.newt.opengl.GLWindow; +import com.jogamp.opengl.util.Animator; +import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2; + +import com.jogamp.opengl.test.junit.util.*; +import com.jogamp.opengl.test.junit.util.NEWTKeyUtil.CodeSeg; + +/** + * Testing key event order incl. auto-repeat (Bug 601) + * + * <p> + * Note Event order: + * <ol> + * <li>{@link #EVENT_KEY_PRESSED}</li> + * <li>{@link #EVENT_KEY_RELEASED}</li> + * <li>{@link #EVENT_KEY_TYPED}</li> + * </ol> + * </p> + */ +public class TestKeyCodeNEWT extends UITestCase { + static int width, height; + static long durationPerTest = 100; + static long awtWaitTimeout = 1000; + + static GLCapabilities glCaps; + + @BeforeClass + public static void initClass() { + width = 640; + height = 480; + glCaps = new GLCapabilities(null); + } + + @AfterClass + public static void release() { + } + + @Before + public void initTest() { + } + + @After + public void releaseTest() { + } + + @Test + public void test01NEWT() throws AWTException, InterruptedException, InvocationTargetException { + GLWindow glWindow = GLWindow.create(glCaps); + glWindow.setSize(width, height); + glWindow.setVisible(true); + + testImpl(glWindow); + + glWindow.destroy(); + } + + // @Test + public void test02NewtCanvasAWT() throws AWTException, InterruptedException, InvocationTargetException { + GLWindow glWindow = GLWindow.create(glCaps); + + // Wrap the window in a canvas. + final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow); + + // Add the canvas to a frame, and make it all visible. + final JFrame frame1 = new JFrame("Swing AWT Parent Frame: "+ glWindow.getTitle()); + frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER); + frame1.setSize(width, height); + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame1.setVisible(true); + } } ); + + Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); + + testImpl(glWindow); + + try { + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame1.setVisible(false); + frame1.dispose(); + }}); + } catch( Throwable throwable ) { + throwable.printStackTrace(); + Assume.assumeNoException( throwable ); + } + glWindow.destroy(); + } + + static CodeSeg[] codeSegments = new CodeSeg[] { + new CodeSeg(0x008, 0x00a, "bs, tab, cr"), + new CodeSeg(0x010, 0x011, "shift, ctrl"), // single alt n/a on windows + new CodeSeg(0x01B, 0x01B, "esc"), + new CodeSeg(0x020, 0x024, "space, up, down, end, home"), + new CodeSeg(0x025, 0x028, "cursor"), + new CodeSeg(0x02C, 0x02F, ", - . /"), + new CodeSeg(0x030, 0x039, "0 - 9"), + new CodeSeg(0x03B, 0x03B, ";"), + new CodeSeg(0x03D, 0x03D, "="), + new CodeSeg(0x041, 0x05A, "a - z"), + new CodeSeg(0x05B, 0x05D, "[ \\ ]"), + // new CodeSeg(0x060, 0x06B, "numpad1"), // can be mapped to normal keycodes + // new CodeSeg(0x06D, 0x06F, "numpad2"), // can be mapped to normal keycodes + new CodeSeg(0x07F, 0x07F, "del"), + // new CodeSeg(0x090, 0x091, "num lock, scroll lock"), + // new CodeSeg(0x070, 0x07B, "F1 - F12"), + // new CodeSeg(0x09A, 0x09D, "prt ins hlp meta"), + new CodeSeg(0x0C0, 0x0C0, "back quote"), + new CodeSeg(0x0DE, 0x0DE, "quote"), + // new CodeSeg(0x0E0, 0x0E3, "cursor kp"), + // new CodeSeg(0x080, 0x08F, "dead-1"), + // new CodeSeg(0x096, 0x0A2, "& ^ \" < > { }"), + // new CodeSeg(0x200, 0x20D, "extra-2"), // @ ; .. + }; + + static void testKeyCode(Robot robot, NEWTKeyAdapter keyAdapter) { + List<List<EventObject>> cse = new ArrayList<List<EventObject>>(); + + for(int i=0; i<codeSegments.length; i++) { + keyAdapter.reset(); + final CodeSeg codeSeg = codeSegments[i]; + // System.err.println("*** Segment "+codeSeg.description); + for(int c=codeSeg.min; c<=codeSeg.max; c++) { + // System.err.println("*** KeyCode 0x"+Integer.toHexString(c)); + AWTRobotUtil.keyPress(0, robot, true, c, 10); + AWTRobotUtil.keyPress(0, robot, false, c, 10); + robot.waitForIdle(); + } + final int codeCount = codeSeg.max - codeSeg.min + 1; + final List<EventObject> queue = keyAdapter.getQueued(); + for(int j=0; j < 10 && queue.size() < 3 * codeCount; j++) { // wait until events are collected + robot.delay(100); + } + final ArrayList<EventObject> events = new ArrayList<EventObject>(queue); + cse.add(events); + } + Assert.assertEquals("KeyCode impl. incomplete", true, NEWTKeyUtil.validateKeyCode(codeSegments, cse, true)); + } + + void testImpl(GLWindow glWindow) throws AWTException, InterruptedException, InvocationTargetException { + final Robot robot = new Robot(); + robot.setAutoWaitForIdle(true); + + GLEventListener demo1 = new RedSquareES2(); + TestListenerCom01AWT.setDemoFields(demo1, glWindow, false); + glWindow.addGLEventListener(demo1); + + NEWTKeyAdapter glWindow1KA = new NEWTKeyAdapter("GLWindow1"); + glWindow1KA.setVerbose(false); + glWindow.addKeyListener(glWindow1KA); + + Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, true)); + AWTRobotUtil.clearAWTFocus(robot); + + // Continuous animation .. + Animator animator = new Animator(glWindow); + animator.start(); + + Thread.sleep(durationPerTest); // manual testing + + glWindow1KA.reset(); + AWTRobotUtil.assertRequestFocusAndWait(null, glWindow, glWindow, null, null); // programmatic + // AWTRobotUtil.assertRequestFocusAndWait(robot, glWindow, glWindow, null, null); // by mouse click + + // + // Test the key event order w/o auto-repeat + // + testKeyCode(robot, glWindow1KA); + + // Remove listeners to avoid logging during dispose/destroy. + glWindow.removeKeyListener(glWindow1KA); + + // Shutdown the test. + animator.stop(); + } + + static int atoi(String a) { + int i=0; + try { + i = Integer.parseInt(a); + } catch (Exception ex) { ex.printStackTrace(); } + return i; + } + + public static void main(String args[]) throws IOException { + for(int i=0; i<args.length; i++) { + if(args[i].equals("-time")) { + durationPerTest = atoi(args[++i]); + } + } + /** + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + System.err.println("Press enter to continue"); + System.err.println(stdin.readLine()); + */ + System.out.println("durationPerTest: "+durationPerTest); + String tstname = TestKeyCodeNEWT.class.getName(); + org.junit.runner.JUnitCore.main(tstname); + } + + +} diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyEventAutoRepeatAWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyEventAutoRepeatAWT.java new file mode 100644 index 000000000..22c362dd8 --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyEventAutoRepeatAWT.java @@ -0,0 +1,309 @@ +/** + * Copyright 2012 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ + +package com.jogamp.opengl.test.junit.newt; + +import org.junit.After; +import org.junit.Assert; +import org.junit.AfterClass; +import org.junit.Assume; +import org.junit.Before; + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Robot; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.EventObject; +import java.util.List; + +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLEventListener; +import javax.swing.JFrame; + +import java.io.IOException; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.jogamp.newt.awt.NewtCanvasAWT; +import com.jogamp.newt.event.InputEvent; +import com.jogamp.newt.event.KeyEvent; +import com.jogamp.newt.opengl.GLWindow; +import com.jogamp.opengl.util.Animator; +import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2; + +import com.jogamp.opengl.test.junit.util.*; + +/** + * Testing key event order incl. auto-repeat (Bug 601) + * + * <p> + * Note Event order: + * <ol> + * <li>{@link #EVENT_KEY_PRESSED}</li> + * <li>{@link #EVENT_KEY_RELEASED}</li> + * <li>{@link #EVENT_KEY_TYPED}</li> + * </ol> + * </p> + * <p> + * Auto-Repeat shall behave as follow: + * <pre> + D = pressed, U = released, T = typed + 0 = normal, 1 = auto-repeat + + D(0), [ U(1), T(1), D(1), U(1) T(1) ..], U(0) T(0) + * </pre> + * + * The idea is if you mask out auto-repeat in your event listener + * you just get one long pressed key D/U/T triple. + */ +public class TestKeyEventAutoRepeatNEWT extends UITestCase { + static int width, height; + static long durationPerTest = 100; + static long awtWaitTimeout = 1000; + + static GLCapabilities glCaps; + + @BeforeClass + public static void initClass() { + width = 640; + height = 480; + glCaps = new GLCapabilities(null); + } + + @AfterClass + public static void release() { + } + + @Before + public void initTest() { + } + + @After + public void releaseTest() { + } + + @Test + public void test01NEWT() throws AWTException, InterruptedException, InvocationTargetException { + GLWindow glWindow = GLWindow.create(glCaps); + glWindow.setSize(width, height); + glWindow.setVisible(true); + + testImpl(glWindow); + + glWindow.destroy(); + } + + @Test + public void test02NewtCanvasAWT() throws AWTException, InterruptedException, InvocationTargetException { + GLWindow glWindow = GLWindow.create(glCaps); + + // Wrap the window in a canvas. + final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow); + + // Add the canvas to a frame, and make it all visible. + final JFrame frame1 = new JFrame("Swing AWT Parent Frame: "+ glWindow.getTitle()); + frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER); + frame1.setSize(width, height); + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame1.setVisible(true); + } } ); + + Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); + + testImpl(glWindow); + + try { + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame1.setVisible(false); + frame1.dispose(); + }}); + } catch( Throwable throwable ) { + throwable.printStackTrace(); + Assume.assumeNoException( throwable ); + } + glWindow.destroy(); + } + + static void testKeyEventAutoRepeat(Robot robot, NEWTKeyAdapter keyAdapter, int loops, int pressDurationMS) { + System.err.println("KEY Event Auto-Repeat Test: "+loops); + EventObject[][] first = new EventObject[loops][3]; + EventObject[][] last = new EventObject[loops][3]; + + keyAdapter.reset(); + final List<EventObject> keyEvents = keyAdapter.getQueued(); + int firstIdx = 0; + for(int i=0; i<loops; i++) { + System.err.println("+++ KEY Event Auto-Repeat START Input Loop: "+i); + AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_A, pressDurationMS); + robot.waitForIdle(); + AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_A, 1000); // 1s .. no AR anymore + robot.waitForIdle(); + first[i][0] = (KeyEvent) keyEvents.get(firstIdx+0); + first[i][1] = (KeyEvent) keyEvents.get(firstIdx+1); + first[i][2] = (KeyEvent) keyEvents.get(firstIdx+2); + firstIdx = keyEvents.size() - 3; + last[i][0] = (KeyEvent) keyEvents.get(firstIdx+0); + last[i][1] = (KeyEvent) keyEvents.get(firstIdx+1); + last[i][2] = (KeyEvent) keyEvents.get(firstIdx+2); + System.err.println("+++ KEY Event Auto-Repeat END Input Loop: "+i); + + // add a pair of normal press/release in between auto-repeat! + AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_B, 10); + robot.waitForIdle(); + AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_B, 250); + robot.waitForIdle(); + firstIdx = keyEvents.size(); + } + // dumpKeyEvents(keyEvents); + + NEWTKeyUtil.validateKeyEventOrder(keyEvents); + + final boolean hasAR = 0 < keyAdapter.getKeyPressedCount(true) ; + + Assert.assertEquals("Key event count not multiple of 3", 0, keyEvents.size()%3); + final int expTotal = keyEvents.size()/3; + final int expAR = hasAR ? expTotal - loops - loops : 0; + NEWTKeyUtil.validateKeyAdapterStats(keyAdapter, expTotal, expAR); + + if( !hasAR ) { + System.err.println("No AUTO-REPEAT triggered by AWT Robot .. aborting test analysis"); + return; + } + + for(int i=0; i<loops; i++) { + System.err.println("Auto-Repeat Loop "+i+" - Head:"); + NEWTKeyUtil.dumpKeyEvents(Arrays.asList(first[i])); + System.err.println("Auto-Repeat Loop "+i+" - Tail:"); + NEWTKeyUtil.dumpKeyEvents(Arrays.asList(last[i])); + } + for(int i=0; i<loops; i++) { + KeyEvent e = (KeyEvent) first[i][0]; + Assert.assertTrue("1st Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); + Assert.assertTrue("1st Shall be PRESSED, but is "+e, KeyEvent.EVENT_KEY_PRESSED == e.getEventType() ); + Assert.assertTrue("1st Shall not be AR, but is "+e, 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); + + e = (KeyEvent) first[i][1]; + Assert.assertTrue("2nd Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); + Assert.assertTrue("2nd Shall be RELEASED, but is "+e, KeyEvent.EVENT_KEY_RELEASED == e.getEventType() ); + Assert.assertTrue("2nd Shall be AR, but is "+e, 0 != ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); + + e = (KeyEvent) first[i][2]; + Assert.assertTrue("3rd Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); + Assert.assertTrue("3rd Shall be TYPED, but is "+e, KeyEvent.EVENT_KEY_TYPED == e.getEventType() ); + Assert.assertTrue("3rd Shall be AR, but is "+e, 0 != ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); + + e = (KeyEvent) last[i][0]; + Assert.assertTrue("last-2 Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); + Assert.assertTrue("last-2 Shall be PRESSED, but is "+e, KeyEvent.EVENT_KEY_PRESSED == e.getEventType() ); + Assert.assertTrue("last-2 Shall be AR, but is "+e, 0 != ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); + + e = (KeyEvent) last[i][1]; + Assert.assertTrue("last-1 Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); + Assert.assertTrue("last-1 Shall be RELEASED, but is "+e, KeyEvent.EVENT_KEY_RELEASED == e.getEventType() ); + Assert.assertTrue("last-1 Shall not be AR, but is "+e, 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); + + e = (KeyEvent) last[i][2]; + Assert.assertTrue("last-0 Shall be A, but is "+e, KeyEvent.VK_A == e.getKeyCode() ); + Assert.assertTrue("last-0 Shall be TYPED, but is "+e, KeyEvent.EVENT_KEY_TYPED == e.getEventType() ); + Assert.assertTrue("last-0 Shall not be AR, but is "+e, 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ); + } + } + + void testImpl(GLWindow glWindow) throws AWTException, InterruptedException, InvocationTargetException { + final Robot robot = new Robot(); + robot.setAutoWaitForIdle(true); + + GLEventListener demo1 = new RedSquareES2(); + TestListenerCom01AWT.setDemoFields(demo1, glWindow, false); + glWindow.addGLEventListener(demo1); + + NEWTKeyAdapter glWindow1KA = new NEWTKeyAdapter("GLWindow1"); + glWindow1KA.setVerbose(false); + glWindow.addKeyListener(glWindow1KA); + + Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, true)); + AWTRobotUtil.clearAWTFocus(robot); + + // Continuous animation .. + Animator animator = new Animator(glWindow); + animator.start(); + + Thread.sleep(durationPerTest); // manual testing + + glWindow1KA.reset(); + AWTRobotUtil.assertRequestFocusAndWait(null, glWindow, glWindow, null, null); // programmatic + // AWTRobotUtil.assertRequestFocusAndWait(robot, glWindow, glWindow, null, null); // by mouse click + + // + // Test the key event order w/ auto-repeat + // + final int origAutoDelay = robot.getAutoDelay(); + robot.setAutoDelay(10); + try { + testKeyEventAutoRepeat(robot, glWindow1KA, 3, 1000); + } finally { + robot.setAutoDelay(origAutoDelay); + } + + // Remove listeners to avoid logging during dispose/destroy. + glWindow.removeKeyListener(glWindow1KA); + + // Shutdown the test. + animator.stop(); + } + + static int atoi(String a) { + int i=0; + try { + i = Integer.parseInt(a); + } catch (Exception ex) { ex.printStackTrace(); } + return i; + } + + public static void main(String args[]) throws IOException { + for(int i=0; i<args.length; i++) { + if(args[i].equals("-time")) { + durationPerTest = atoi(args[++i]); + } + } + /** + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + System.err.println("Press enter to continue"); + System.err.println(stdin.readLine()); + */ + System.out.println("durationPerTest: "+durationPerTest); + String tstname = TestKeyEventAutoRepeatNEWT.class.getName(); + org.junit.runner.JUnitCore.main(tstname); + } + + +} diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyEventOrderAWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyEventOrderAWT.java new file mode 100644 index 000000000..31d9912d1 --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyEventOrderAWT.java @@ -0,0 +1,235 @@ +/** + * Copyright 2012 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ + +package com.jogamp.opengl.test.junit.newt; + +import org.junit.After; +import org.junit.Assert; +import org.junit.AfterClass; +import org.junit.Assume; +import org.junit.Before; + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Robot; +import java.lang.reflect.InvocationTargetException; + +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLEventListener; +import javax.swing.JFrame; + +import java.io.IOException; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.jogamp.newt.awt.NewtCanvasAWT; +import com.jogamp.newt.opengl.GLWindow; +import com.jogamp.opengl.util.Animator; +import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2; + +import com.jogamp.opengl.test.junit.util.*; + +/** + * Testing key event order incl. auto-repeat (Bug 601) + * + * <p> + * Note Event order: + * <ol> + * <li>{@link #EVENT_KEY_PRESSED}</li> + * <li>{@link #EVENT_KEY_RELEASED}</li> + * <li>{@link #EVENT_KEY_TYPED}</li> + * </ol> + * </p> + */ +public class TestKeyEventOrderNEWT extends UITestCase { + static int width, height; + static long durationPerTest = 100; + static long awtWaitTimeout = 1000; + + static GLCapabilities glCaps; + + @BeforeClass + public static void initClass() { + width = 640; + height = 480; + glCaps = new GLCapabilities(null); + } + + @AfterClass + public static void release() { + } + + @Before + public void initTest() { + } + + @After + public void releaseTest() { + } + + @Test + public void test01NEWT() throws AWTException, InterruptedException, InvocationTargetException { + GLWindow glWindow = GLWindow.create(glCaps); + glWindow.setSize(width, height); + glWindow.setVisible(true); + + testImpl(glWindow); + + glWindow.destroy(); + } + + @Test + public void test02NewtCanvasAWT() throws AWTException, InterruptedException, InvocationTargetException { + GLWindow glWindow = GLWindow.create(glCaps); + + // Wrap the window in a canvas. + final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow); + + // Add the canvas to a frame, and make it all visible. + final JFrame frame1 = new JFrame("Swing AWT Parent Frame: "+ glWindow.getTitle()); + frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER); + frame1.setSize(width, height); + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame1.setVisible(true); + } } ); + + Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); + + testImpl(glWindow); + + try { + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame1.setVisible(false); + frame1.dispose(); + }}); + } catch( Throwable throwable ) { + throwable.printStackTrace(); + Assume.assumeNoException( throwable ); + } + glWindow.destroy(); + } + + static void testKeyEventOrder(Robot robot, NEWTKeyAdapter keyAdapter, int loops) { + System.err.println("KEY Event Order Test: "+loops); + keyAdapter.reset(); + for(int i=0; i<loops; i++) { + // 1 + AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_A, 10); + AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_A, 100); + robot.waitForIdle(); + // 2 + AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_B, 10); + AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_B, 100); + robot.waitForIdle(); + // 3 + 4 + AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_A, 10); + AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_B, 10); + AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_A, 10); + AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_B, 10); + robot.waitForIdle(); + // 5 + 6 + AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_A, 10); + AWTRobotUtil.keyPress(0, robot, true, java.awt.event.KeyEvent.VK_B, 10); + AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_B, 10); + AWTRobotUtil.keyPress(0, robot, false, java.awt.event.KeyEvent.VK_A, 10); + robot.waitForIdle(); + } + robot.delay(250); + // dumpKeyEvents(keyAdapter.getQueued()); + + NEWTKeyUtil.validateKeyEventOrder(keyAdapter.getQueued()); + + NEWTKeyUtil.validateKeyAdapterStats(keyAdapter, 6*loops, 0); + } + + void testImpl(GLWindow glWindow) throws AWTException, InterruptedException, InvocationTargetException { + final Robot robot = new Robot(); + robot.setAutoWaitForIdle(true); + + GLEventListener demo1 = new RedSquareES2(); + TestListenerCom01AWT.setDemoFields(demo1, glWindow, false); + glWindow.addGLEventListener(demo1); + + NEWTKeyAdapter glWindow1KA = new NEWTKeyAdapter("GLWindow1"); + glWindow1KA.setVerbose(false); + glWindow.addKeyListener(glWindow1KA); + + Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, true)); + AWTRobotUtil.clearAWTFocus(robot); + + // Continuous animation .. + Animator animator = new Animator(glWindow); + animator.start(); + + Thread.sleep(durationPerTest); // manual testing + + glWindow1KA.reset(); + AWTRobotUtil.assertRequestFocusAndWait(null, glWindow, glWindow, null, null); // programmatic + // AWTRobotUtil.assertRequestFocusAndWait(robot, glWindow, glWindow, null, null); // by mouse click + + // + // Test the key event order w/o auto-repeat + // + testKeyEventOrder(robot, glWindow1KA, 6); + + // Remove listeners to avoid logging during dispose/destroy. + glWindow.removeKeyListener(glWindow1KA); + + // Shutdown the test. + animator.stop(); + } + + static int atoi(String a) { + int i=0; + try { + i = Integer.parseInt(a); + } catch (Exception ex) { ex.printStackTrace(); } + return i; + } + + public static void main(String args[]) throws IOException { + for(int i=0; i<args.length; i++) { + if(args[i].equals("-time")) { + durationPerTest = atoi(args[++i]); + } + } + /** + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + System.err.println("Press enter to continue"); + System.err.println(stdin.readLine()); + */ + System.out.println("durationPerTest: "+durationPerTest); + String tstname = TestKeyEventOrderNEWT.class.getName(); + org.junit.runner.JUnitCore.main(tstname); + } + + +} diff --git a/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyPressReleaseUnmaskRepeatAWT.java b/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyPressReleaseUnmaskRepeatAWT.java new file mode 100644 index 000000000..6f3b97f0c --- /dev/null +++ b/src/test/com/jogamp/opengl/test/junit/newt/TestNewtKeyPressReleaseUnmaskRepeatAWT.java @@ -0,0 +1,222 @@ +/** + * Copyright 2012 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ + +package com.jogamp.opengl.test.junit.newt; + +import org.junit.After; +import org.junit.Assert; +import org.junit.AfterClass; +import org.junit.Assume; +import org.junit.Before; + +import java.awt.AWTException; +import java.awt.BorderLayout; +import java.awt.Robot; +import java.lang.reflect.InvocationTargetException; + +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLEventListener; +import javax.swing.JFrame; + +import java.io.IOException; + +import org.junit.BeforeClass; +import org.junit.Test; + +import com.jogamp.newt.awt.NewtCanvasAWT; +import com.jogamp.newt.event.InputEvent; +import com.jogamp.newt.event.KeyEvent; +import com.jogamp.newt.event.KeyListener; +import com.jogamp.newt.opengl.GLWindow; +import com.jogamp.opengl.util.Animator; +import com.jogamp.opengl.test.junit.jogl.demos.es2.RedSquareES2; + +import com.jogamp.opengl.test.junit.util.*; + +/** + * Testing key press and release events w/o AUTO-REPEAT + */ +public class TestKeyPressReleaseUnmaskRepeatNEWT extends UITestCase { + static int width, height; + static long durationPerTest = 100; + static long awtWaitTimeout = 1000; + + static GLCapabilities glCaps; + + @BeforeClass + public static void initClass() { + width = 640; + height = 480; + glCaps = new GLCapabilities(null); + } + + @AfterClass + public static void release() { + } + + @Before + public void initTest() { + } + + @After + public void releaseTest() { + } + + @Test + public void test01NEWT() throws AWTException, InterruptedException, InvocationTargetException { + GLWindow glWindow = GLWindow.create(glCaps); + glWindow.setSize(width, height); + glWindow.setVisible(true); + + testImpl(glWindow); + + glWindow.destroy(); + } + + // @Test + public void test02NewtCanvasAWT() throws AWTException, InterruptedException, InvocationTargetException { + GLWindow glWindow = GLWindow.create(glCaps); + + // Wrap the window in a canvas. + final NewtCanvasAWT newtCanvasAWT = new NewtCanvasAWT(glWindow); + + // Add the canvas to a frame, and make it all visible. + final JFrame frame1 = new JFrame("Swing AWT Parent Frame: "+ glWindow.getTitle()); + frame1.getContentPane().add(newtCanvasAWT, BorderLayout.CENTER); + frame1.setSize(width, height); + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame1.setVisible(true); + } } ); + + Assert.assertEquals(true, AWTRobotUtil.waitForVisible(frame1, true)); + + testImpl(glWindow); + + try { + javax.swing.SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame1.setVisible(false); + frame1.dispose(); + }}); + } catch( Throwable throwable ) { + throwable.printStackTrace(); + Assume.assumeNoException( throwable ); + } + glWindow.destroy(); + } + + void testImpl(GLWindow glWindow) throws AWTException, InterruptedException, InvocationTargetException { + final Robot robot = new Robot(); + robot.setAutoWaitForIdle(true); + + GLEventListener demo1 = new RedSquareES2(); + TestListenerCom01AWT.setDemoFields(demo1, glWindow, false); + glWindow.addGLEventListener(demo1); + + SimpleKeyPressRelease simpleKeyPressRelease = new SimpleKeyPressRelease(); + glWindow.addKeyListener(simpleKeyPressRelease); + + Assert.assertEquals(true, AWTRobotUtil.waitForRealized(glWindow, true)); + AWTRobotUtil.clearAWTFocus(robot); + + // Continuous animation .. + Animator animator = new Animator(glWindow); + animator.start(); + + Thread.sleep(durationPerTest); // manual testing + + AWTRobotUtil.assertRequestFocusAndWait(null, glWindow, glWindow, null, null); // programmatic + // AWTRobotUtil.assertRequestFocusAndWait(robot, glWindow, glWindow, null, null); // by mouse click + + // Remove listeners to avoid logging during dispose/destroy. + glWindow.removeKeyListener(simpleKeyPressRelease); + + // Shutdown the test. + animator.stop(); + } + + static int atoi(String a) { + int i=0; + try { + i = Integer.parseInt(a); + } catch (Exception ex) { ex.printStackTrace(); } + return i; + } + + static class SimpleKeyPressRelease implements KeyListener { + int seq; + + SimpleKeyPressRelease() { + reset(); + } + + public void reset() { + seq=0; + } + + @Override + public void keyPressed(KeyEvent e) { + if( 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ) { + seq++; + System.err.println(seq+": "+e); + } + } + + @Override + public void keyReleased(KeyEvent e) { + if( 0 == ( InputEvent.AUTOREPEAT_MASK & e.getModifiers() ) ) { + seq++; + System.err.println(seq+": "+e); + } + } + + @Override + public void keyTyped(KeyEvent e) { + } + + } + + public static void main(String args[]) throws IOException { + for(int i=0; i<args.length; i++) { + if(args[i].equals("-time")) { + durationPerTest = atoi(args[++i]); + } + } + /** + BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); + System.err.println("Press enter to continue"); + System.err.println(stdin.readLine()); + */ + System.out.println("durationPerTest: "+durationPerTest); + String tstname = TestKeyPressReleaseUnmaskRepeatNEWT.class.getName(); + org.junit.runner.JUnitCore.main(tstname); + } + + +} -- cgit v1.2.3