JBR-4990: Fix regression tests for national keyboard layouts on macOS

This commit is contained in:
Nikita Tsarev
2022-11-09 17:44:03 +01:00
committed by jbrbot
parent f8a671912b
commit 601c5e4ca5
6 changed files with 45 additions and 58 deletions

View File

@@ -474,6 +474,8 @@ static NSDictionary* getUnicharToVkCodeDictionary() {
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_QUOTEDBL], @"\"",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_EXCLAMATION_MARK], @"!",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_LESS], @"<",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_INVERTED_EXCLAMATION_MARK], @"\u00a1",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_DOLLAR], @"$",
nil
];
// This is ok to retain a singleton object

View File

@@ -161,6 +161,14 @@ public class ExtendedKeyCodes {
regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE);
regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK);
// Some key codes are commented out.
// They are uppercase versions of lowercase latin letters already present in this key code set.
// This makes key codes consistent with what we see in the events from the OS.
//
// For example, the VK_SEMICOLON key on the German keyboard layout is the letter O umlaut
// when it is pressed, key code equals 0x01000000+0x00F6, but in the upstream OpenJDK,
// the key code returned by getExtendedKeyCodeForChar equals 0x01000000+0x00D6
extendedKeyCodesSet.add(0x01000000+0x0060);
extendedKeyCodesSet.add(0x01000000+0x007C);
extendedKeyCodesSet.add(0x01000000+0x007E);
@@ -185,14 +193,14 @@ public class ExtendedKeyCodes {
extendedKeyCodesSet.add(0x01000000+0x00BD);
extendedKeyCodesSet.add(0x01000000+0x00BE);
extendedKeyCodesSet.add(0x01000000+0x00BF);
extendedKeyCodesSet.add(0x01000000+0x00C4);
extendedKeyCodesSet.add(0x01000000+0x00C5);
extendedKeyCodesSet.add(0x01000000+0x00C6);
extendedKeyCodesSet.add(0x01000000+0x00C7);
extendedKeyCodesSet.add(0x01000000+0x00D1);
extendedKeyCodesSet.add(0x01000000+0x00D6);
// extendedKeyCodesSet.add(0x01000000+0x00C4);
// extendedKeyCodesSet.add(0x01000000+0x00C5);
// extendedKeyCodesSet.add(0x01000000+0x00C6);
// extendedKeyCodesSet.add(0x01000000+0x00C7);
// extendedKeyCodesSet.add(0x01000000+0x00D1);
// extendedKeyCodesSet.add(0x01000000+0x00D6);
extendedKeyCodesSet.add(0x01000000+0x00D7);
extendedKeyCodesSet.add(0x01000000+0x00D8);
// extendedKeyCodesSet.add(0x01000000+0x00D8);
extendedKeyCodesSet.add(0x01000000+0x00DF);
extendedKeyCodesSet.add(0x01000000+0x00E0);
extendedKeyCodesSet.add(0x01000000+0x00E1);

View File

@@ -18,7 +18,6 @@ import java.awt.event.KeyEvent;
import java.util.HashMap;
import static java.awt.event.KeyEvent.*;
import static sun.awt.event.KeyEvent.*; /* comment this line to compile with jbrsdk8 */
/*
* Class containing common key functionality
@@ -54,11 +53,7 @@ public class Key {
int getKeyCode() {
KeyChar keyChar = mappedKeyChars.getKeyChar();
char ch = keyChar.getChar();
if (latinKeyCodesMap.containsKey(ch)) {
// TODO Fix this in jbruntime
// KeyEvent.getExtendedKeyCodeForChar(ch) does not return corresponding VK_ constant for non-English keys
return latinKeyCodesMap.get(ch);
} else if (keyChar.isDead() && deadKeyCodesMap.containsKey(ch)) {
if (keyChar.isDead() && deadKeyCodesMap.containsKey(ch)) {
// KeyEvent.getExtendedKeyCodeForChar(ch) does not return corresponding VK_ constant for dead keys
return deadKeyCodesMap.get(ch);
} else {
@@ -91,49 +86,6 @@ public class Key {
return mappedKeyChars.getKeyChar(modifier).isDead();
}
// TODO Remove this map when KeyEvent.getExtendedKeyCodeForChar(ch) is fixed for latin keys in jbruntime
// Map storing latin chars and corresponding VK_ codes
private static final HashMap<Character, Integer> latinKeyCodesMap = new HashMap<Character, Integer>() {
{
// Please see:
// jbruntime/src/java.desktop/share/classes/sun/awt/event/KeyEvent.java
put((char) 0x00DF, VK_ESZETT);
put((char) 0x00E0, VK_A_WITH_GRAVE);
put((char) 0x00E1, VK_A_WITH_ACUTE);
put((char) 0x00E2, VK_A_WITH_CIRCUMFLEX);
put((char) 0x00E3, VK_A_WITH_TILDE);
put((char) 0x00E4, VK_A_WITH_DIAERESIS);
put((char) 0x00E5, VK_A_WITH_RING_ABOVE);
put((char) 0x00E6, VK_AE);
put((char) 0x00E7, VK_C_WITH_CEDILLA);
put((char) 0x00E8, VK_E_WITH_GRAVE);
put((char) 0x00E9, VK_E_WITH_ACUTE);
put((char) 0x00EA, VK_E_WITH_CIRCUMFLEX);
put((char) 0x00EB, VK_E_WITH_DIAERESIS);
put((char) 0x00EC, VK_I_WITH_GRAVE);
put((char) 0x00ED, VK_I_WITH_GRAVE);
put((char) 0x00EE, VK_I_WITH_CIRCUMFLEX);
put((char) 0x00EF, VK_I_WITH_DIAERESIS);
put((char) 0x00F0, VK_ETH);
put((char) 0x00F1, VK_N_WITH_TILDE);
put((char) 0x00F2, VK_O_WITH_GRAVE);
put((char) 0x00F3, VK_O_WITH_ACUTE);
put((char) 0x00F4, VK_O_WITH_CIRCUMFLEX);
put((char) 0x00F5, VK_O_WITH_TILDE);
put((char) 0x00F6, VK_O_WITH_DIAERESIS);
put((char) 0x00F7, VK_DIVISION_SIGN);
put((char) 0x00F8, VK_O_WITH_SLASH);
put((char) 0x00F9, VK_U_WITH_GRAVE);
put((char) 0x00FA, VK_U_WITH_ACUTE);
put((char) 0x00FB, VK_U_WITH_CIRCUMFLEX);
put((char) 0x00FC, VK_U_WITH_DIAERESIS);
put((char) 0x00FD, VK_Y_WITH_ACUTE);
put((char) 0x00FE, VK_THORN);
put((char) 0x00FF, VK_Y_WITH_DIAERESIS);
}
};
// Map storing possible dead key chars and corresponding VK_ codes
private static final HashMap<Character, Integer> deadKeyCodesMap = new HashMap<Character, Integer>() {
{
@@ -167,4 +119,9 @@ public class Key {
put((char) 0x309C, VK_DEAD_SEMIVOICED_SOUND);
}
};
@Override
public String toString() {
return this.vkName;
}
}

View File

@@ -26,7 +26,6 @@
* Enumerates keys under test for com.apple.keylayout.German (macOS 10.14.5)
*/
public enum Layout_GERMAN implements LayoutKey {
// Enum name must be the same as KeyEvent.VK_ constant name corresponding to the key on US keyboard layout
// Note that '\u0000' may be used if no char is mapped to a key + modifier or if one wants to skip its testing

View File

@@ -25,7 +25,8 @@ import java.util.stream.Collectors;
public enum Modifier {
E(),
//A(KeyEvent.VK_ALT),
A(KeyEvent.VK_ALT),
// TODO: uncomment the following line this once JBR-3860 is fixed
//S(KeyEvent.VK_SHIFT),
//SA(KeyEvent.VK_SHIFT, KeyEvent.VK_ALT),
@@ -105,4 +106,18 @@ public enum Modifier {
}
return Arrays.stream(modifiers).boxed().map(i -> KeyEvent.getKeyText(i)).collect(Collectors.joining(" "));
}
public String toPlaintextString() {
if (modifiers.length == 0) {
return "no";
}
var result = new StringBuilder();
var list = Arrays.stream(modifiers).boxed().toList();
if (list.contains(KeyEvent.VK_CONTROL)) result.append("Control");
if (list.contains(KeyEvent.VK_ALT)) result.append("Option");
if (list.contains(KeyEvent.VK_SHIFT)) result.append("Shift");
if (list.contains(KeyEvent.VK_META)) result.append("Command");
return result.toString();
}
}

View File

@@ -383,6 +383,7 @@ public class NationalLayoutTest {
// Go over all keys defined for the layout
for(LayoutKey layoutKey : layout.getLayoutKeys()) {
System.err.printf("KEYPRESS: key=%s, modifier=%s\n", layoutKey.getKey(), modifier.toPlaintextString());
// Clean up synchronized lists which store pressed key codes and typed chars
keysPressed = new CopyOnWriteArrayList();
@@ -392,6 +393,11 @@ public class NationalLayoutTest {
// Get Key object from LayoutKey enum
Key key = layoutKey.getKey();
if (key.isDead() || key.isDead(modifier)) {
// TODO: Disable skipping testing dead keys once they work properly on macOS
continue;
}
// Obtain the key code for the current layout
int keyCode = key.getKeyCode();