Skip to content

Commit dcc318c

Browse files
Victor RudometovPaul Hohensee
authored andcommitted
8297481: Create a regression test for JDK-4424517
Backport-of: e2d71c0a0d654841e3e591beeaa04b44c6e6b37f
1 parent 0bf122c commit dcc318c

File tree

1 file changed

+212
-0
lines changed

1 file changed

+212
-0
lines changed
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
/*
2+
* Copyright (c) 2002, 2022, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
24+
/*
25+
* @test
26+
* @key headful
27+
* @bug 4424517
28+
* @summary Verify the mapping of various KeyEvents with their KeyLocations
29+
* is as expected.
30+
* @run main KeyEventLocationTest
31+
*/
32+
33+
import java.awt.BorderLayout;
34+
import java.awt.EventQueue;
35+
import java.awt.Frame;
36+
import java.awt.Label;
37+
import java.awt.Robot;
38+
import java.awt.event.KeyEvent;
39+
import java.awt.event.KeyListener;
40+
import java.awt.event.MouseEvent;
41+
42+
import javax.swing.SwingUtilities;
43+
44+
public class KeyEventLocationTest {
45+
46+
private static volatile Frame frame;
47+
private static volatile boolean keyPressed;
48+
private static volatile boolean keyReleased;
49+
private static volatile boolean keyTyped;
50+
private static volatile Robot robot;
51+
private static volatile int xLocation;
52+
private static volatile int yLocation;
53+
private static volatile int width;
54+
private static volatile int height;
55+
private static volatile Label label = new Label();
56+
private static volatile String currentString = "";
57+
58+
private static int[] keyEvents = { KeyEvent.VK_0, KeyEvent.VK_1,
59+
KeyEvent.VK_2, KeyEvent.VK_3, KeyEvent.VK_4, KeyEvent.VK_5,
60+
KeyEvent.VK_6, KeyEvent.VK_7, KeyEvent.VK_8, KeyEvent.VK_9,
61+
KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C, KeyEvent.VK_D,
62+
KeyEvent.VK_E, KeyEvent.VK_F, KeyEvent.VK_G, KeyEvent.VK_H,
63+
KeyEvent.VK_I, KeyEvent.VK_J, KeyEvent.VK_K, KeyEvent.VK_L,
64+
KeyEvent.VK_M, KeyEvent.VK_N, KeyEvent.VK_O, KeyEvent.VK_P,
65+
KeyEvent.VK_Q, KeyEvent.VK_R, KeyEvent.VK_S, KeyEvent.VK_T,
66+
KeyEvent.VK_U, KeyEvent.VK_V, KeyEvent.VK_W, KeyEvent.VK_X,
67+
KeyEvent.VK_Y, KeyEvent.VK_Z, KeyEvent.VK_BACK_QUOTE,
68+
KeyEvent.VK_BACK_SLASH, KeyEvent.VK_BACK_SPACE,
69+
KeyEvent.VK_CLOSE_BRACKET, KeyEvent.VK_COMMA, KeyEvent.VK_EQUALS,
70+
KeyEvent.VK_ESCAPE, KeyEvent.VK_MINUS, KeyEvent.VK_OPEN_BRACKET,
71+
KeyEvent.VK_PERIOD, KeyEvent.VK_QUOTE, KeyEvent.VK_SEMICOLON,
72+
KeyEvent.VK_SLASH, KeyEvent.VK_SPACE };
73+
74+
private static int specialKeyEvents[] = { KeyEvent.VK_F1, KeyEvent.VK_F2,
75+
KeyEvent.VK_F3, KeyEvent.VK_F4, KeyEvent.VK_F5, KeyEvent.VK_F6,
76+
KeyEvent.VK_F7, KeyEvent.VK_F8, KeyEvent.VK_F9, KeyEvent.VK_F10 };
77+
78+
private static void createGUI() {
79+
frame = new Frame("Test frame");
80+
frame.setLayout(new BorderLayout());
81+
frame.setAlwaysOnTop(true);
82+
83+
frame.addKeyListener(new KeyListener() {
84+
public void keyPressed(KeyEvent event) {
85+
try {
86+
handleEvent("keyPressed", event);
87+
} catch (Exception e) {
88+
e.printStackTrace();
89+
}
90+
keyPressed = true;
91+
}
92+
93+
public void keyReleased(KeyEvent event) {
94+
try {
95+
handleEvent("keyReleased", event);
96+
} catch (Exception e) {
97+
e.printStackTrace();
98+
}
99+
keyReleased = true;
100+
}
101+
102+
public void keyTyped(KeyEvent event) {
103+
try {
104+
handleEvent("keyTyped", event);
105+
} catch (Exception e) {
106+
e.printStackTrace();
107+
}
108+
keyTyped = true;
109+
}
110+
111+
private void handleEvent(String eventString, KeyEvent event)
112+
throws Exception {
113+
label.setText(eventString + " triggered for " + event);
114+
if ((event.getID() == KeyEvent.KEY_TYPED
115+
&& event.getKeyLocation() != KeyEvent.KEY_LOCATION_UNKNOWN)
116+
|| ((event.getID() == KeyEvent.KEY_PRESSED
117+
|| event.getID() == KeyEvent.KEY_PRESSED)
118+
&& event.getKeyLocation()
119+
!= KeyEvent.KEY_LOCATION_STANDARD)) {
120+
throw new Exception("FAIL: Incorrect KeyLocation: "
121+
+ event.getKeyLocation() + " returned when "
122+
+ eventString + " triggered for " + event.getKeyChar());
123+
}
124+
}
125+
});
126+
label.setText("Current Event: ");
127+
frame.add(label, BorderLayout.SOUTH);
128+
frame.setSize(600, 300);
129+
frame.setLocationRelativeTo(null);
130+
frame.setVisible(true);
131+
frame.toFront();
132+
}
133+
134+
private static void doTest() throws Exception {
135+
robot = new Robot();
136+
robot.setAutoWaitForIdle(true);
137+
robot.setAutoDelay(100);
138+
139+
SwingUtilities.invokeAndWait(() -> {
140+
xLocation = frame.getLocationOnScreen().x;
141+
yLocation = frame.getLocationOnScreen().y;
142+
width = frame.getWidth();
143+
height = frame.getHeight();
144+
});
145+
146+
robot.mouseMove(xLocation + width / 2, yLocation + height / 2);
147+
robot.mousePress(MouseEvent.BUTTON1_MASK);
148+
robot.mouseRelease(MouseEvent.BUTTON1_MASK);
149+
150+
for (int i = 0; i < keyEvents.length; i++) {
151+
resetValues();
152+
robot.keyPress(keyEvents[i]);
153+
robot.delay(200);
154+
if (!keyPressed) {
155+
throw new Exception(
156+
"FAIL: keyPressed did not get triggered for "
157+
+ KeyEvent.getKeyText(keyEvents[i]));
158+
}
159+
robot.keyRelease(keyEvents[i]);
160+
robot.delay(200);
161+
if (!keyReleased) {
162+
throw new Exception(
163+
"FAIL: keyReleased did not get triggered for "
164+
+ KeyEvent.getKeyText(keyEvents[i]));
165+
}
166+
robot.delay(200);
167+
if (!keyTyped) {
168+
throw new Exception("FAIL: keyTyped did not get triggered for "
169+
+ KeyEvent.getKeyText(keyEvents[i]));
170+
}
171+
}
172+
173+
for (int i = 0; i < specialKeyEvents.length; i++) {
174+
resetValues();
175+
robot.keyPress(specialKeyEvents[i]);
176+
robot.delay(200);
177+
if (!keyPressed) {
178+
throw new Exception("FAIL: keyPressed did not get triggered"
179+
+ " for " + KeyEvent.getKeyText(specialKeyEvents[i]));
180+
}
181+
robot.keyRelease(specialKeyEvents[i]);
182+
robot.delay(200);
183+
if (!keyReleased) {
184+
throw new Exception("FAIL: keyReleased got triggered for "
185+
+ KeyEvent.getKeyText(specialKeyEvents[i]));
186+
}
187+
robot.delay(200);
188+
if (keyTyped) {
189+
throw new Exception("FAIL: keyTyped got triggered for "
190+
+ KeyEvent.getKeyText(specialKeyEvents[i]));
191+
}
192+
}
193+
}
194+
195+
private static void resetValues() {
196+
keyPressed = false;
197+
keyReleased = false;
198+
keyTyped = false;
199+
}
200+
201+
public static void main(String[] args) throws Exception {
202+
try {
203+
EventQueue.invokeAndWait(() -> createGUI());
204+
doTest();
205+
System.out.println("Test Passed");
206+
} finally {
207+
if (frame != null)
208+
EventQueue.invokeAndWait(() -> frame.dispose());
209+
}
210+
}
211+
}
212+

0 commit comments

Comments
 (0)