more diagnostics for blinking testKeyboardEventsAreDetected()

This commit is contained in:
Alexey Kudravtsev
2017-02-03 14:04:55 +03:00
parent e93c64333e
commit 462e469d36
2 changed files with 27 additions and 7 deletions
@@ -1141,8 +1141,13 @@ public class IdeEventQueue extends EventQueue {
private final FrequentEventDetector myFrequentEventDetector = new FrequentEventDetector(1009, 100);
@Override
public void postEvent(@NotNull AWTEvent event) {
doPostEvent(event);
}
// return true if posted, false if consumed immediately
boolean doPostEvent(@NotNull AWTEvent event) {
for (PostEventHook listener : myPostEventListeners.getListeners()) {
if (listener.consumePostedEvent(event)) return;
if (listener.consumePostedEvent(event)) return false;
}
myFrequentEventDetector.eventHappened(event);
@@ -1150,6 +1155,7 @@ public class IdeEventQueue extends EventQueue {
myKeyboardEventsPosted.incrementAndGet();
}
super.postEvent(event);
return true;
}
private static boolean isKeyboardEvent(@NotNull AWTEvent event) {
@@ -17,11 +17,15 @@ package com.intellij.ide;
import com.intellij.testFramework.PlatformTestCase;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.util.ReflectionUtil;
import com.intellij.util.ui.UIUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.InvocationEvent;
import java.awt.event.KeyEvent;
import java.util.concurrent.atomic.AtomicInteger;
public class IdeEventQueueTest extends PlatformTestCase {
@@ -42,14 +46,13 @@ public class IdeEventQueueTest extends PlatformTestCase {
assertTrue(EventQueue.isDispatchThread());
IdeEventQueue ideEventQueue = IdeEventQueue.getInstance();
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
assertSame(ideEventQueue, eventQueue);
assertSame(ideEventQueue, Toolkit.getDefaultToolkit().getSystemEventQueue());
PlatformTestUtil.dispatchAllEventsInIdeEventQueue();
int posted = ideEventQueue.myKeyboardEventsPosted.get();
int dispatched = ideEventQueue.myKeyboardEventsDispatched.get();
KeyEvent pressX = new KeyEvent(new JLabel(), KeyEvent.KEY_PRESSED, 1, InputEvent.ALT_DOWN_MASK, 11, 'x');
eventQueue.postEvent(pressX);
postCarefully(pressX);
assertEquals(posted+1, ideEventQueue.myKeyboardEventsPosted.get());
assertEquals(dispatched, ideEventQueue.myKeyboardEventsDispatched.get());
assertEquals(pressX, dispatchAllInvocationEventsUntilOtherEvent(ideEventQueue));
@@ -59,7 +62,8 @@ public class IdeEventQueueTest extends PlatformTestCase {
// do not react to other events
AWTEvent ev2 = new ActionEvent(new JLabel(), ActionEvent.ACTION_PERFORMED, "Command");
eventQueue.postEvent(ev2);
postCarefully(ev2);
assertEquals(posted+1, ideEventQueue.myKeyboardEventsPosted.get());
assertEquals(dispatched+1, ideEventQueue.myKeyboardEventsDispatched.get());
assertEquals(ev2, dispatchAllInvocationEventsUntilOtherEvent(ideEventQueue));
@@ -68,7 +72,8 @@ public class IdeEventQueueTest extends PlatformTestCase {
assertEquals(dispatched+1, ideEventQueue.myKeyboardEventsDispatched.get());
KeyEvent keyRelease = new KeyEvent(new JLabel(), KeyEvent.KEY_RELEASED, 1, InputEvent.ALT_DOWN_MASK, 11, 'x');
eventQueue.postEvent(keyRelease);
postCarefully(keyRelease);
assertEquals(posted+2, ideEventQueue.myKeyboardEventsPosted.get());
assertEquals(dispatched+1, ideEventQueue.myKeyboardEventsDispatched.get());
assertEquals(keyRelease, dispatchAllInvocationEventsUntilOtherEvent(ideEventQueue));
@@ -77,6 +82,15 @@ public class IdeEventQueueTest extends PlatformTestCase {
assertEquals(dispatched+2, ideEventQueue.myKeyboardEventsDispatched.get());
}
private static void postCarefully(AWTEvent event) {
IdeEventQueue ideEventQueue = IdeEventQueue.getInstance();
boolean didPosted = ideEventQueue.doPostEvent(event);
assertTrue("Was not posted: "+event, didPosted);
boolean mustBeConsumed = event.getID() == ActionEvent.ACTION_PERFORMED;
assertEquals(mustBeConsumed, ReflectionUtil.getField(AWTEvent.class, event, boolean.class, "consumed").booleanValue());
assertTrue(ReflectionUtil.getField(AWTEvent.class, event, boolean.class, "isPosted"));
}
// need this because everybody can post some crazy stuff to IdeEventQueue, so we have to filter InvocationEvents out
private static AWTEvent dispatchAllInvocationEventsUntilOtherEvent(IdeEventQueue ideEventQueue) throws InterruptedException {
while (true) {