8302525: Write a test to check various components send Events while mouse and key are used simultaneously
Reviewed-by: serb
This commit is contained in:
parent
9a797228f3
commit
c7517b3dec
@ -0,0 +1,556 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.awt.Button;
|
||||
import java.awt.Canvas;
|
||||
import java.awt.Checkbox;
|
||||
import java.awt.Choice;
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.FlowLayout;
|
||||
import java.awt.Frame;
|
||||
import java.awt.List;
|
||||
import java.awt.Point;
|
||||
import java.awt.Robot;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @key headful
|
||||
* @bug 8302525
|
||||
* @summary Test performs various mouse and key operations to check events are getting triggered properly.
|
||||
* @run main MouseAndKeyEventStressTest
|
||||
*/
|
||||
public class MouseAndKeyEventStressTest {
|
||||
|
||||
private volatile static int mouseButtonTypes[] =
|
||||
{ InputEvent.BUTTON1_DOWN_MASK, InputEvent.BUTTON2_DOWN_MASK,
|
||||
InputEvent.BUTTON3_DOWN_MASK };
|
||||
private volatile static String mouseButtonNames[] =
|
||||
{ "BUTTON1", "BUTTON2", "BUTTON3" };
|
||||
|
||||
private static Frame frame;
|
||||
private volatile static Canvas canvas;
|
||||
private volatile static Button button;
|
||||
private volatile static List list;
|
||||
private volatile static Choice choice;
|
||||
private volatile static Checkbox checkbox;
|
||||
private volatile static Component[] components;
|
||||
|
||||
private volatile static boolean keyPressed;
|
||||
private volatile static boolean keyReleased;
|
||||
private volatile static boolean mousePressed;
|
||||
private volatile static boolean mouseReleased;
|
||||
private volatile static boolean actionPerformed;
|
||||
private volatile static boolean itemEventPerformed;
|
||||
|
||||
private volatile static Robot robot;
|
||||
private volatile static Point compAt;
|
||||
private volatile static Dimension compSize;
|
||||
|
||||
private static void initializeGUI() {
|
||||
frame = new Frame("Test Frame");
|
||||
frame.setLayout(new FlowLayout());
|
||||
canvas = new Canvas();
|
||||
canvas.setSize(50, 50);
|
||||
canvas.setBackground(Color.red);
|
||||
button = new Button("Button");
|
||||
list = new List();
|
||||
list.add("One");
|
||||
list.add("Two");
|
||||
list.add("Three");
|
||||
choice = new Choice();
|
||||
for (int i = 0; i < 8; i++) {
|
||||
choice.add("Choice " + i);
|
||||
}
|
||||
choice.select(3);
|
||||
checkbox = new Checkbox("Checkbox");
|
||||
|
||||
components = new Component[] { canvas, button, list, choice, checkbox };
|
||||
|
||||
button.addActionListener((actionEvent) -> {
|
||||
actionPerformed = true;
|
||||
System.out.println("button Got an actionEvent: " + actionEvent);
|
||||
});
|
||||
checkbox.addItemListener((itemEvent) -> {
|
||||
itemEventPerformed = true;
|
||||
System.out.println("checkbox Got a ItemEvent: " + itemEvent);
|
||||
});
|
||||
list.addItemListener((itemEvent) -> {
|
||||
itemEventPerformed = true;
|
||||
System.out.println("List Got a ItemEvent: " + itemEvent);
|
||||
});
|
||||
choice.addItemListener((itemEvent) -> {
|
||||
itemEventPerformed = true;
|
||||
System.out.println("Choice Got a ItemEvent: " + itemEvent);
|
||||
});
|
||||
for (int i = 0; i < components.length; i++) {
|
||||
components[i].addKeyListener(new KeyAdapter() {
|
||||
|
||||
public void keyPressed(KeyEvent ke) {
|
||||
System.out.println("Got a keyPressedSource: " + ke);
|
||||
keyPressed = true;
|
||||
}
|
||||
|
||||
public void keyReleased(KeyEvent ke) {
|
||||
System.out.println("Got a keyReleasedSource: " + ke);
|
||||
keyReleased = true;
|
||||
}
|
||||
});
|
||||
components[i].addMouseListener(new MouseAdapter() {
|
||||
|
||||
public void mousePressed(MouseEvent me) {
|
||||
mousePressed = true;
|
||||
System.out.println("Got a mousePressSource: " + me);
|
||||
}
|
||||
|
||||
public void mouseReleased(MouseEvent me) {
|
||||
mouseReleased = true;
|
||||
System.out.println("Got a mouseReleaseSource: " + me);
|
||||
}
|
||||
|
||||
});
|
||||
frame.add(components[i]);
|
||||
}
|
||||
|
||||
frame.pack();
|
||||
frame.setLocationRelativeTo(null);
|
||||
frame.setVisible(true);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
try {
|
||||
EventQueue.invokeAndWait(MouseAndKeyEventStressTest::initializeGUI);
|
||||
doTest();
|
||||
} finally {
|
||||
EventQueue.invokeAndWait(MouseAndKeyEventStressTest::disposeFrame);
|
||||
}
|
||||
}
|
||||
|
||||
private static void doTest() throws Exception {
|
||||
robot = new Robot();
|
||||
robot.setAutoDelay(100);
|
||||
robot.waitForIdle();
|
||||
|
||||
canvasMouseKeyTest();
|
||||
buttonMouseKeyTest();
|
||||
listMouseKeyTest();
|
||||
choiceMouseKeyTest();
|
||||
checkboxMouseKeyTest();
|
||||
|
||||
System.out.println("Test passed!");
|
||||
}
|
||||
|
||||
private static void canvasMouseKeyTest() throws Exception {
|
||||
Component component = canvas;
|
||||
robot.waitForIdle();
|
||||
|
||||
for (int i = 0; i < mouseButtonTypes.length; i++) {
|
||||
resetValues();
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
compAt = component.getLocationOnScreen();
|
||||
compSize = component.getSize();
|
||||
});
|
||||
|
||||
robot.mouseMove(compAt.x + compSize.width / 2,
|
||||
compAt.y + compSize.height / 2);
|
||||
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
|
||||
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: Moving focus. mousePressed event did not occur for "
|
||||
+ component.getClass());
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyPress(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyPressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: keyPressed event " + "did not occur for "
|
||||
+ component.getClass() + " for key A");
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mousePress(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mousePressed event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mouseRelease(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
if (!mouseReleased) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mouseReleased event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyRelease(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyReleased) {
|
||||
throw new RuntimeException("FAIL: keyReleased event "
|
||||
+ "did not occur for " + component.getClass());
|
||||
}
|
||||
|
||||
keyType(KeyEvent.VK_ESCAPE);
|
||||
robot.waitForIdle();
|
||||
}
|
||||
System.out.println("Test passed:" + component);
|
||||
}
|
||||
|
||||
private static void buttonMouseKeyTest() throws Exception {
|
||||
Component component = button;
|
||||
robot.waitForIdle();
|
||||
|
||||
for (int i = 0; i < mouseButtonTypes.length; i++) {
|
||||
resetValues();
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
compAt = component.getLocationOnScreen();
|
||||
compSize = component.getSize();
|
||||
});
|
||||
|
||||
robot.mouseMove(compAt.x + compSize.width / 2,
|
||||
compAt.y + compSize.height / 2);
|
||||
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
|
||||
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: Moving focus. mousePressed event did not occur for "
|
||||
+ component.getClass());
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyPress(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyPressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: keyPressed event " + "did not occur for "
|
||||
+ component.getClass() + " for key A");
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mousePress(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mousePressed event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mouseRelease(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
|
||||
if (!actionPerformed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: action event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
if (!mouseReleased) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mouseReleased event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyRelease(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyReleased) {
|
||||
throw new RuntimeException("FAIL: keyReleased event "
|
||||
+ "did not occur for " + component.getClass());
|
||||
}
|
||||
|
||||
keyType(KeyEvent.VK_ESCAPE);
|
||||
robot.waitForIdle();
|
||||
}
|
||||
System.out.println("Test passed:" + component);
|
||||
}
|
||||
|
||||
private static void listMouseKeyTest() throws Exception {
|
||||
Component component = list;
|
||||
robot.waitForIdle();
|
||||
|
||||
for (int i = 0; i < mouseButtonTypes.length; i++) {
|
||||
resetValues();
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
compAt = component.getLocationOnScreen();
|
||||
compSize = component.getSize();
|
||||
});
|
||||
|
||||
robot.mouseMove(compAt.x + compSize.width / 2,
|
||||
compAt.y + compSize.height / 2);
|
||||
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
|
||||
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: Moving focus. mousePressed event did not occur for "
|
||||
+ component.getClass());
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyPress(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyPressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: keyPressed event " + "did not occur for "
|
||||
+ component.getClass() + " for key A");
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mousePress(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mousePressed event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mouseRelease(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
|
||||
if (!itemEventPerformed) {
|
||||
throw new RuntimeException("FAIL: Item event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
if (!mouseReleased) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mouseReleased event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyRelease(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyReleased) {
|
||||
throw new RuntimeException("FAIL: keyReleased event "
|
||||
+ "did not occur for " + component.getClass());
|
||||
}
|
||||
|
||||
keyType(KeyEvent.VK_ESCAPE);
|
||||
robot.waitForIdle();
|
||||
}
|
||||
System.out.println("Test passed:" + component);
|
||||
}
|
||||
|
||||
private static void choiceMouseKeyTest() throws Exception {
|
||||
Component component = choice;
|
||||
robot.waitForIdle();
|
||||
|
||||
for (int i = 0; i < mouseButtonTypes.length; i++) {
|
||||
resetValues();
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
compAt = component.getLocationOnScreen();
|
||||
compSize = component.getSize();
|
||||
});
|
||||
|
||||
robot.mouseMove(compAt.x + compSize.width / 2,
|
||||
compAt.y + compSize.height / 2);
|
||||
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
|
||||
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: Moving focus. mousePressed event did not occur for "
|
||||
+ component.getClass());
|
||||
}
|
||||
|
||||
if (component instanceof Choice) {
|
||||
keyType(KeyEvent.VK_ESCAPE);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyPress(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyPressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: keyPressed event " + "did not occur for "
|
||||
+ component.getClass() + " for key A");
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mousePress(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mousePressed event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
boolean isMac =
|
||||
System.getProperty("os.name").toLowerCase().contains("os x");
|
||||
if (isMac) {
|
||||
// Choice's pop-up menu is drawn in front of choice. So
|
||||
// choice can not get mouse events generated by robot,
|
||||
// that's why test is made to dispath event.
|
||||
MouseEvent me =
|
||||
new MouseEvent(choice, MouseEvent.MOUSE_RELEASED,
|
||||
System.currentTimeMillis(), mouseButtonTypes[i],
|
||||
compSize.width, compSize.height, 1, false);
|
||||
choice.dispatchEvent(me);
|
||||
} else {
|
||||
robot.mouseRelease(mouseButtonTypes[i]);
|
||||
}
|
||||
robot.waitForIdle();
|
||||
|
||||
if (!mouseReleased) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mouseReleased event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
robot.mouseMove(compAt.x + compSize.width / 2,
|
||||
compAt.y + compSize.height + 30);
|
||||
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
|
||||
|
||||
robot.waitForIdle();
|
||||
|
||||
if (!itemEventPerformed) {
|
||||
throw new RuntimeException("FAIL: Item event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyRelease(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyReleased) {
|
||||
throw new RuntimeException("FAIL: keyReleased event "
|
||||
+ "did not occur for " + component.getClass());
|
||||
}
|
||||
|
||||
keyType(KeyEvent.VK_ESCAPE);
|
||||
robot.waitForIdle();
|
||||
}
|
||||
System.out.println("Test passed:" + component);
|
||||
}
|
||||
|
||||
private static void checkboxMouseKeyTest() throws Exception {
|
||||
Component component = checkbox;
|
||||
robot.waitForIdle();
|
||||
for (int i = 0; i < mouseButtonTypes.length; i++) {
|
||||
|
||||
resetValues();
|
||||
EventQueue.invokeAndWait(() -> {
|
||||
compAt = component.getLocationOnScreen();
|
||||
compSize = component.getSize();
|
||||
});
|
||||
|
||||
robot.mouseMove(compAt.x + compSize.width / 2,
|
||||
compAt.y + compSize.height / 2);
|
||||
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
|
||||
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
|
||||
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: Moving focus. mousePressed event did not occur for "
|
||||
+ component.getClass());
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyPress(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyPressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: keyPressed event " + "did not occur for "
|
||||
+ component.getClass() + " for key A");
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mousePress(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
if (!mousePressed) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mousePressed event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.mouseRelease(mouseButtonTypes[i]);
|
||||
robot.waitForIdle();
|
||||
if (!mouseReleased) {
|
||||
throw new RuntimeException(
|
||||
"FAIL: mouseReleased event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
if (!itemEventPerformed) {
|
||||
throw new RuntimeException("FAIL: Item event did not occur for "
|
||||
+ component.getClass() + " for " + mouseButtonNames[i]);
|
||||
}
|
||||
|
||||
resetValues();
|
||||
robot.keyRelease(KeyEvent.VK_A);
|
||||
robot.waitForIdle();
|
||||
if (!keyReleased) {
|
||||
throw new RuntimeException("FAIL: keyReleased event "
|
||||
+ "did not occur for " + component.getClass());
|
||||
}
|
||||
|
||||
keyType(KeyEvent.VK_ESCAPE);
|
||||
robot.waitForIdle();
|
||||
}
|
||||
System.out.println("Test passed:" + component);
|
||||
}
|
||||
|
||||
private static void resetValues() {
|
||||
keyPressed = false;
|
||||
keyReleased = false;
|
||||
mousePressed = false;
|
||||
mouseReleased = false;
|
||||
}
|
||||
|
||||
private static void keyType(int key) throws Exception {
|
||||
robot.keyPress(key);
|
||||
robot.keyRelease(key);
|
||||
}
|
||||
|
||||
public static void disposeFrame() {
|
||||
if (frame != null) {
|
||||
frame.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user