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