29package com.jogamp.opengl.test.junit.newt.event ;
31import java.io.PrintStream ;
32import java.util.ArrayList ;
33import java.util.concurrent.atomic.AtomicInteger;
37import org.junit.Assert ;
38import org.junit.BeforeClass ;
39import org.junit.FixMethodOrder;
40import org.junit.Test ;
41import org.junit.runners.MethodSorters;
43import com.jogamp.common.util.InterruptSource;
44import com.jogamp.common.util.RunnableTask;
45import com.jogamp.newt.event.MouseEvent;
46import com.jogamp.opengl.test.junit.util.AWTRobotUtil;
54@FixMethodOrder(MethodSorters.NAME_ASCENDING)
59 protected static final int TEST_FRAME_X = 100 ;
60 protected static final int TEST_FRAME_Y = 100 ;
62 protected static final int TEST_FRAME_WIDTH = 400 ;
63 protected static final int TEST_FRAME_HEIGHT = 400 ;
65 protected static final int INITIAL_MOUSE_X = TEST_FRAME_X + ( TEST_FRAME_WIDTH / 2 ) ;
66 protected static final int INITIAL_MOUSE_Y = TEST_FRAME_Y + ( TEST_FRAME_HEIGHT / 2 ) ;
68 protected static final int MS_ROBOT_KEY_PRESS_DELAY = 50 ;
69 protected static final int MS_ROBOT_KEY_RELEASE_DELAY = 50 ;
70 protected static final int MS_ROBOT_MOUSE_MOVE_DELAY = 200 ;
72 protected static final int MS_ROBOT_AUTO_DELAY = 50 ;
73 protected static final int MS_ROBOT_POST_TEST_DELAY = 100;
75 protected static final boolean _debug = true ;
76 protected static final PrintStream _debugPrintStream = System.err ;
85 private static class TestMouseListener
implements com.jogamp.newt.event.MouseListener
87 private static final String NO_EVENT_DELIVERY =
"no event delivery" ;
89 private boolean _modifierCheckEnabled ;
90 private int _expectedModifiers;
91 private final AtomicInteger _eventCount =
new AtomicInteger(0);
92 private ArrayList<String> _failures =
new ArrayList<String>() ;
94 public synchronized void setModifierCheckEnabled(
final boolean value ) {
95 _modifierCheckEnabled = value ;
98 public synchronized boolean modifierCheckEnabled() {
99 return _modifierCheckEnabled ;
109 public synchronized void setExpectedModifiers(
final int value ) {
110 _expectedModifiers = value ;
114 public synchronized ArrayList<String> clear() {
115 final ArrayList<String> old = _failures;
122 _failures =
new ArrayList<String>();
123 _failures.add( NO_EVENT_DELIVERY );
127 public ArrayList<String> getFailures(
final int waitEventCount) {
129 for(j=0; j < 20 && _eventCount.get() < waitEventCount; j++) {
130 _robot.delay(MS_ROBOT_AUTO_DELAY);
132 if(0 == _eventCount.get()) {
133 _debugPrintStream.println(
"**** No Event. Waited "+j+
" * "+MS_ROBOT_AUTO_DELAY+
"ms, eventCount "+_eventCount);
138 private synchronized void _checkModifiers(
final com.jogamp.newt.event.MouseEvent hasEvent ) {
139 if( _modifierCheckEnabled ) {
141 final MouseEvent expEvent =
new MouseEvent(hasEvent.getEventType(), hasEvent.getSource(), hasEvent.getWhen(), _expectedModifiers,
142 hasEvent.getX(), hasEvent.getY(), hasEvent.getClickCount(), hasEvent.getButton(),
143 hasEvent.getRotation(), hasEvent.getRotationScale());
145 _checkModifierMask( expEvent, hasEvent, com.jogamp.newt.event.InputEvent.SHIFT_MASK,
"shift" ) ;
146 _checkModifierMask( expEvent, hasEvent, com.jogamp.newt.event.InputEvent.CTRL_MASK,
"ctrl" ) ;
147 _checkModifierMask( expEvent, hasEvent, com.jogamp.newt.event.InputEvent.META_MASK,
"meta" ) ;
148 _checkModifierMask( expEvent, hasEvent, com.jogamp.newt.event.InputEvent.ALT_MASK,
"alt" ) ;
149 _checkModifierMask( expEvent, hasEvent, com.jogamp.newt.event.InputEvent.ALT_GRAPH_MASK,
"graph" ) ;
151 for(
int n = 0 ; n < _numButtonsToTest ; ++n ) {
152 _checkModifierMask( expEvent, hasEvent, com.jogamp.newt.event.InputEvent.getButtonMask( n + 1 ),
"button"+(n+1) ) ;
157 private synchronized void _checkModifierMask(
final com.jogamp.newt.event.MouseEvent expEvent,
final com.jogamp.newt.event.MouseEvent hasEvent,
final int mask,
final String maskS ) {
164 if( _failures.size() == 1 && _failures.get(0).equals( NO_EVENT_DELIVERY ) ) {
168 if( ( hasEvent.getModifiers() & mask ) != ( expEvent.getModifiers() & mask ) ) {
169 final StringBuilder sb =
new StringBuilder();
170 sb.append( com.jogamp.newt.event.MouseEvent.getEventTypeString( hasEvent.getEventType() ) ).append(
": mask ").append(maskS).append(
" 0x").append(Integer.toHexString(mask));
171 sb.append(
", eventCount ").append(_eventCount).append(
", expected:");
172 expEvent.getModifiersString(sb);
173 sb.append(
", have: ");
174 hasEvent.getModifiersString(sb);
175 sb.append(
" - full event: ");
176 hasEvent.toString(sb);
177 _failures.add( sb.toString() ) ;
182 public synchronized void mousePressed(
final com.jogamp.newt.event.MouseEvent event ) {
183 _eventCount.incrementAndGet();
185 _debugPrintStream.println(
"MousePressed "+_eventCount+
": "+event);
187 _checkModifiers( event ) ;
191 public synchronized void mouseReleased(
final com.jogamp.newt.event.MouseEvent event ) {
192 _eventCount.incrementAndGet();
194 _debugPrintStream.println(
"MouseReleased "+_eventCount+
": "+event);
196 _checkModifiers( event ) ;
200 public synchronized void mouseDragged(
final com.jogamp.newt.event.MouseEvent event ) {
201 _eventCount.incrementAndGet();
203 _debugPrintStream.println(
"MouseDragged "+_eventCount+
": "+event);
205 _checkModifiers( event ) ;
213 public synchronized void mouseMoved(
final com.jogamp.newt.event.MouseEvent event ) {
217 _debugPrintStream.println(
"MouseMoved ignored: "+event);
223 public synchronized void mouseClicked(
final com.jogamp.newt.event.MouseEvent event ) {
227 _debugPrintStream.println(
"MouseClicked ignored: "+event);
233 public synchronized void mouseWheelMoved(
final com.jogamp.newt.event.MouseEvent event ) {
236 _debugPrintStream.println(
"MouseWheeleMoved ignored: "+event);
242 public synchronized void mouseEntered(
final com.jogamp.newt.event.MouseEvent event ) {
245 _debugPrintStream.println(
"MouseEntered ignored: "+event);
251 public synchronized void mouseExited(
final com.jogamp.newt.event.MouseEvent event ) {
254 _debugPrintStream.println(
"MouseExited ignored: "+event);
263 private static int _numButtonsToTest ;
264 private static int _awtButtonMasks[] ;
277 case 1 : m = java.awt.event.InputEvent.BUTTON1_MASK;
break;
278 case 2 : m = java.awt.event.InputEvent.BUTTON2_MASK;
break;
279 case 3 : m = java.awt.event.InputEvent.BUTTON3_MASK;
break;
280 default:
throw new IllegalArgumentException(
"Only buttons 1-3 have a MASK value, requested button "+button);
301 _numButtonsToTest = 3 ;
314 _numButtonsToTest = 3 ;
317 if( _numButtonsToTest > com.jogamp.newt.event.MouseEvent.BUTTON_COUNT ) {
318 _numButtonsToTest = com.jogamp.newt.event.MouseEvent.BUTTON_COUNT ;
325 _awtButtonMasks =
new int[_numButtonsToTest] ;
327 for(
int n = 0 ; n < _awtButtonMasks.length ; ++n ) {
328 _awtButtonMasks[n] = getAWTButtonMask( n + 1 );
332 _robot =
new java.awt.Robot() ;
333 _robot.setAutoWaitForIdle(
true ) ;
335 _testMouseListener =
new TestMouseListener() ;
348 }
catch (
final InterruptedException e) { }
351 private void execOffThreadWithOnThreadEventDispatch(
final Runnable testAction)
throws Exception {
352 _testMouseListener.setModifierCheckEnabled(
false ) ;
353 _robot.setAutoDelay( MS_ROBOT_AUTO_DELAY ) ;
356 clearKeyboadAndMouse();
358 _testMouseListener.setModifierCheckEnabled(
true ) ;
361 final RunnableTask rt =
new RunnableTask( testAction,
null,
true, System.err );
364 new InterruptSource.Thread(
null, rt,
"Test-Thread").start();
366 while( rt.isInQueue() ) {
367 System.err.println(
"WAIT-till-done: eventDispatch() #"+i++);
370 final Throwable throwable = rt.getThrowable();
371 if(
null!=throwable) {
372 throw new RuntimeException(throwable);
376 System.err.println(
"WAIT-till-done: DONE");
377 _testMouseListener.setModifierCheckEnabled(
false ) ;
378 clearKeyboadAndMouse();
402 @Test(timeout=180000)
403 public
void test01SingleButtonPressAndRelease() throws Exception {
404 execOffThreadWithOnThreadEventDispatch(
new Runnable() {
408 _doSingleButtonPressAndRelease( 0, 0 );
409 }
catch (
final Exception e) {
throw new RuntimeException(e); }
413 @Test(timeout=180000)
414 public
void test02SingleButtonPressAndReleaseWithShift() throws Exception {
415 execOffThreadWithOnThreadEventDispatch(
new Runnable() {
419 _doSingleButtonPressAndRelease( java.awt.event.KeyEvent.VK_SHIFT, java.awt.event.InputEvent.SHIFT_DOWN_MASK ) ;
420 }
catch (
final Exception e) {
throw new RuntimeException(e); }
424 @Test(timeout=180000)
425 public
void test03SingleButtonPressAndReleaseWithCtrl() throws Exception {
426 execOffThreadWithOnThreadEventDispatch(
new Runnable() {
430 _doSingleButtonPressAndRelease( java.awt.event.KeyEvent.VK_CONTROL, java.awt.event.InputEvent.CTRL_DOWN_MASK ) ;
431 }
catch (
final Exception e) {
throw new RuntimeException(e); }
478 @Test(timeout=180000)
479 public
void test10HoldOneButtonAndPressAnother() throws Exception {
480 execOffThreadWithOnThreadEventDispatch(
new Runnable() {
484 _doHoldOneButtonAndPressAnother( 0, 0 ) ;
485 }
catch (
final Exception e) {
throw new RuntimeException(e); }
489 @Test(timeout=180000)
490 public
void test20PressAllButtonsInSequence() throws Exception {
491 execOffThreadWithOnThreadEventDispatch(
new Runnable() {
495 _doPressAllButtonsInSequence( 0, 0 ) ;
496 }
catch (
final Exception e) {
throw new RuntimeException(e); }
500 @Test(timeout=180000)
501 public
void test30SingleButtonClickAndDrag() throws Exception {
502 execOffThreadWithOnThreadEventDispatch(
new Runnable() {
506 _doSingleButtonClickAndDrag( 0, 0 ) ;
507 }
catch (
final Exception e) {
throw new RuntimeException(e); }
513 private void _doSingleButtonPressAndRelease(
final int keyCode,
final int keyModifierMask )
throws Exception {
515 if( _debug ) { _debugPrintStream.println(
"\n>>>> _doSingleButtonPressAndRelease" ) ; }
517 _doKeyPress( keyCode ) ;
519 for (
int n = 0 ; n < _numButtonsToTest ; ++n) {
521 final int awtButtonMask = _awtButtonMasks[n] ;
523 if( _debug ) { _debugPrintStream.println(
"*** pressing button " + ( n + 1 ) ) ; }
524 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | awtButtonMask ) ) ;
525 _robot.mousePress( awtButtonMask ) ;
526 _checkFailures(
"mouse-press("+(n+1)+
")", 1) ;
528 if( _debug ) { _debugPrintStream.println(
"*** releasing button " + ( n + 1 ) ) ; }
529 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | awtButtonMask ) ) ;
530 _robot.mouseRelease( awtButtonMask ) ;
531 _checkFailures(
"mouse-release("+(n+1)+
")", 1) ;
534 _doKeyRelease( keyCode ) ;
539 private void _doHoldOneButtonAndPressAnother(
final int keyCode,
final int keyModifierMask )
throws Exception {
541 if( _debug ) { _debugPrintStream.println(
"\n>>>> _doHoldOneButtonAndPressAnother" ) ; }
543 _doKeyPress( keyCode ) ;
545 for (
int n = 0 ; n < _numButtonsToTest ; ++n) {
547 final int awtButtonMask = _awtButtonMasks[n] ;
549 if( _debug ) { _debugPrintStream.println(
"*** pressing button " + ( n + 1 ) ) ; }
550 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | awtButtonMask ) ) ;
551 _robot.mousePress( awtButtonMask ) ;
552 _checkFailures(
"mouse-press("+(n+1)+
")", 1) ;
554 for (
int m = 0 ; m < _numButtonsToTest ; ++m) {
558 if( _debug ) { _debugPrintStream.println(
"*** pressing additional button " + ( m + 1 ) ) ; }
559 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | awtButtonMask | _awtButtonMasks[m] ) ) ;
560 _robot.mousePress( _awtButtonMasks[m] ) ;
561 _checkFailures(
"mouse-press("+(n+1)+
", "+(m+1)+
")", 1) ;
563 if( _debug ) { _debugPrintStream.println(
"*** releasing additional button " + ( m + 1 ) ) ; }
564 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | awtButtonMask | _awtButtonMasks[m] ) ) ;
565 _robot.mouseRelease( _awtButtonMasks[m] ) ;
566 _checkFailures(
"mouse-release("+(n+1)+
", "+(m+1)+
")", 1) ;
570 if( _debug ) { _debugPrintStream.println(
"*** releasing button " + ( n + 1 ) ) ; }
571 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | awtButtonMask ) ) ;
572 _robot.mouseRelease( awtButtonMask ) ;
573 _checkFailures(
"mouse-release("+(n+1)+
")", 1);
576 _doKeyRelease( keyCode ) ;
581 private void _doPressAllButtonsInSequence(
final int keyCode,
final int keyModifierMask )
throws Exception {
583 if( _debug ) { _debugPrintStream.println(
"\n>>>> _doPressAllButtonsInSequence" ) ; }
585 _doKeyPress( keyCode ) ;
588 int cumulativeAwtModifiers = 0 ;
590 for (
int n = 0 ; n < _numButtonsToTest ; ++n) {
592 cumulativeAwtModifiers |= _awtButtonMasks[n] ;
594 if( _debug ) { _debugPrintStream.println(
"*** pressing button " + ( n + 1 ) ) ; }
595 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | cumulativeAwtModifiers ) ) ;
596 _robot.mousePress( _awtButtonMasks[n] ) ;
597 _checkFailures(
"mouse-press("+(n+1)+
")", 1) ;
600 for (
int n = _numButtonsToTest - 1 ; n >= 0 ; --n) {
602 if( _debug ) { _debugPrintStream.println(
"*** releasing button " + ( n + 1 ) ) ; }
603 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | cumulativeAwtModifiers ) ) ;
604 _robot.mouseRelease( _awtButtonMasks[n] ) ;
605 _checkFailures(
"mouse-release("+(n+1)+
")", 1) ;
607 cumulativeAwtModifiers &= ~_awtButtonMasks[n] ;
611 _doKeyRelease( keyCode ) ;
616 private void _doSingleButtonClickAndDrag(
final int keyCode,
final int keyModifierMask )
throws Exception {
618 if( _debug ) { _debugPrintStream.println(
"\n>>>> _doSingleButtonClickAndDrag" ) ; }
620 _doKeyPress( keyCode ) ;
622 _testMouseListener.setModifierCheckEnabled(
true ) ;
624 for (
int n = 0 ; n < _numButtonsToTest ; ++n) {
626 final int awtButtonMask = _awtButtonMasks[n] ;
628 if( _debug ) { _debugPrintStream.println(
"*** pressing button " + ( n + 1 ) ) ; }
629 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | awtButtonMask ) ) ;
630 _robot.mousePress( awtButtonMask ) ;
631 _checkFailures(
"mouse-press("+(n+1)+
")", 1) ;
634 if( _debug ) { _debugPrintStream.println(
"*** moving mouse" ) ; }
635 final int newX = INITIAL_MOUSE_X + 8, newY = INITIAL_MOUSE_Y + 8;
636 _robot.mouseMove( newX, newY ) ;
637 _robot.delay(MS_ROBOT_MOUSE_MOVE_DELAY);
638 _checkFailures(
"mouse-move("+newX+
", "+newY+
")", 1) ;
640 if( _debug ) { _debugPrintStream.println(
"*** releasing button " + ( n + 1 ) ) ; }
641 _testMouseListener.setExpectedModifiers( _getNewtModifiersForAwtExtendedModifiers( keyModifierMask | awtButtonMask ) ) ;
642 _robot.mouseRelease( awtButtonMask ) ;
643 _checkFailures(
"mouse-release("+(n+1)+
")", 1) ;
645 _testMouseListener.setModifierCheckEnabled(
false ) ;
646 _robot.mouseMove( INITIAL_MOUSE_X, INITIAL_MOUSE_Y ) ;
647 _robot.delay(MS_ROBOT_MOUSE_MOVE_DELAY);
648 _testMouseListener.setModifierCheckEnabled(
true ) ;
651 _doKeyRelease( keyCode ) ;
656 private void _doKeyPress(
final int keyCode ) {
657 AWTRobotUtil.validateAWTEDTIsAlive();
659 final boolean modifierCheckEnabled = _testMouseListener.modifierCheckEnabled() ;
660 _testMouseListener.setModifierCheckEnabled(
false ) ;
661 _robot.keyPress( keyCode ) ;
662 _robot.delay(MS_ROBOT_KEY_PRESS_DELAY);
663 _testMouseListener.setModifierCheckEnabled( modifierCheckEnabled ) ;
669 private void _doKeyRelease(
final int keyCode ) {
670 AWTRobotUtil.validateAWTEDTIsAlive();
672 final boolean modifierCheckEnabled = _testMouseListener.modifierCheckEnabled() ;
673 _testMouseListener.setModifierCheckEnabled(
false ) ;
674 _robot.keyRelease( keyCode ) ;
675 _robot.delay(MS_ROBOT_KEY_RELEASE_DELAY);
676 _testMouseListener.setModifierCheckEnabled( modifierCheckEnabled ) ;
682 private void _checkFailures(
final String descr,
final int waitEventCount) {
683 final ArrayList<String> failures = _testMouseListener.getFailures(waitEventCount) ;
685 _debugPrintStream.print(getSimpleTestName(
".")+
" - "+descr+
": ");
686 final int numFailures = failures.size() ;
687 if( numFailures == 0 ) {
688 _debugPrintStream.println(
" PASSED" ) ;
690 _debugPrintStream.println(
" FAILED" ) ;
691 for(
int n = 0 ; n < numFailures ; ++n ) {
692 _debugPrintStream.print(
" " ) ;
693 _debugPrintStream.println( failures.get(n) ) ;
697 Assert.assertTrue( failures.size() == 0 ) ;
703 eventDispatch(); eventDispatch(); eventDispatch();
704 Thread.sleep( MS_ROBOT_POST_TEST_DELAY ) ;
705 eventDispatch(); eventDispatch(); eventDispatch();
706 _testMouseListener.clear();
712 _releaseModifiers() ;
714 eventDispatchedPostTestDelay();
719 private void _releaseModifiers() {
721 if (_robot !=
null) {
724 _robot.setAutoDelay( MS_ROBOT_AUTO_DELAY ) ;
726 final boolean modifierCheckEnabled = _testMouseListener.modifierCheckEnabled() ;
727 _testMouseListener.setModifierCheckEnabled(
false ) ;
730 _robot.keyRelease( java.awt.event.KeyEvent.VK_SHIFT ) ;
731 _robot.keyRelease( java.awt.event.KeyEvent.VK_CONTROL ) ;
736 for (
int n = 0 ; n < _awtButtonMasks.length ; ++n) {
737 _robot.mouseRelease( _awtButtonMasks[n] ) ;
741 _testMouseListener.setModifierCheckEnabled( modifierCheckEnabled ) ;
745 private void _escape() {
746 if (_robot !=
null) {
747 AWTRobotUtil.validateAWTEDTIsAlive();
748 _robot.keyPress( java.awt.event.KeyEvent.VK_ESCAPE ) ;
749 _robot.keyRelease( java.awt.event.KeyEvent.VK_ESCAPE ) ;
766 private int _getNewtModifiersForAwtExtendedModifiers(
final int awtExtendedModifiers ) {
770 if( ( awtExtendedModifiers & java.awt.event.InputEvent.SHIFT_DOWN_MASK ) != 0 ) {
771 mask |= com.jogamp.newt.event.InputEvent.SHIFT_MASK ;
774 if( ( awtExtendedModifiers & java.awt.event.InputEvent.CTRL_DOWN_MASK ) != 0 ) {
775 mask |= com.jogamp.newt.event.InputEvent.CTRL_MASK ;
778 if( ( awtExtendedModifiers & java.awt.event.InputEvent.META_DOWN_MASK ) != 0 ) {
779 mask |= com.jogamp.newt.event.InputEvent.META_MASK ;
782 if( ( awtExtendedModifiers & java.awt.event.InputEvent.ALT_DOWN_MASK ) != 0 ) {
783 mask |= com.jogamp.newt.event.InputEvent.ALT_MASK ;
786 if( ( awtExtendedModifiers & java.awt.event.InputEvent.ALT_GRAPH_DOWN_MASK ) != 0 ) {
787 mask |= com.jogamp.newt.event.InputEvent.ALT_GRAPH_MASK ;
790 for (
int n = 0 ; n < _numButtonsToTest ; ++n) {
791 if ((awtExtendedModifiers & getAWTButtonMask(n+1)) != 0) {
792 mask |= com.jogamp.newt.event.InputEvent.getButtonMask(n+1) ;
Specifies the the OpenGL profile.
static void initSingleton()
Static initialization of JOGL.
Test whether or not event modifiers are preserved by NEWT.
static TestMouseListener _testMouseListener
static void baseBeforeClass()
Must be called from subclass @BeforeClass code, allowing it to perform its specific initialization fi...
void eventDispatchedPostTestDelay()
static int getAWTButtonMask(final int button)
void clearKeyboadAndMouse()
static java.awt.Robot _robot
static void validateAWTEDTIsAlive()
Throws Error if isAWTEDTAlive() returns false.