RFR: 8314906: [testbug] Create behavior tests for text input controls [v5]
Andy Goryachev
angorya at openjdk.org
Mon Sep 18 21:16:45 UTC 2023
On Mon, 18 Sep 2023 20:51:47 GMT, Martin Fox <duke at openjdk.org> wrote:
>> I am running this on macOS 13.5.1 with several keyboard layouts enabled.
>>
>> A test that does keyPress(KeyCode.A) followed by a keyRelease(KeyCode.A) generates the following sequence of events:
>>
>> With the US layout:
>>
>>
>> KeyEvent [source = TextArea at 7da926e[styleClass=text-input text-area], target = TextArea at 7da926e[styleClass=text-input text-area], eventType = KEY_PRESSED, consumed = false, character = , text = a, code = A]
>> KeyEvent [source = TextArea at 7da926e[styleClass=text-input text-area], target = TextArea at 7da926e[styleClass=text-input text-area], eventType = KEY_TYPED, consumed = false, character = a, text = , code = UNDEFINED]
>> KeyEvent [source = TextArea at 7da926e[styleClass=text-input text-area], target = TextArea at 7da926e[styleClass=text-input text-area], eventType = KEY_RELEASED, consumed = false, character = , text = a, code = A]
>>
>>
>> With the French layout:
>>
>>
>> KeyEvent [source = TextArea at 75ffb50a[styleClass=text-input text-area], target = TextArea at 75ffb50a[styleClass=text-input text-area], eventType = KEY_PRESSED, consumed = false, character = , text = q, code = A]
>> KeyEvent [source = TextArea at 75ffb50a[styleClass=text-input text-area], target = TextArea at 75ffb50a[styleClass=text-input text-area], eventType = KEY_TYPED, consumed = false, character = q, text = , code = UNDEFINED]
>> KeyEvent [source = TextArea at 75ffb50a[styleClass=text-input text-area], target = TextArea at 75ffb50a[styleClass=text-input text-area], eventType = KEY_RELEASED, consumed = false, character = , text = q, code = A]
>>
>>
>> And with a cyrillic layout it generates whatever cyrillic letter is mapped to the key. So, basically, KeyCode is more like a scan code, which means there is no reliable way to test key bindings using Robot, unless we limit ourselves (and the test) to the US layout. Or is there another way?
>>
>> <img width="612" alt="Screenshot 2023-09-18 at 13 19 51" src="https://github.com/openjdk/jfx/assets/107069028/8bd8745c-8973-449f-bf17-0473f5c0e0b6">
>
> This is the behavior we saw on the Mac before PR #425 was integrated. As of JavaFX 21 keyPress(KeyCode.A) should generate an 'a' and never a 'q' on all Latin layouts and all platforms (on a Cyrillic layout you'll still get a Cyrillic character).
>
> I can't reproduce this with the test app (tests/manual/events/KeyboardTest.java). Is there a test in this PR I should be trying?
You could try this code (using this PR's code):
public class KeyboardLayoutTest extends TextInputBehaviorRobotTest<TextArea> {
public KeyboardLayoutTest() {
super(new TextArea());
}
@BeforeEach
@Override
public void beforeEach() {
super.beforeEach();
control.setWrapText(true);
}
@Test
public void testTyping() throws Exception {
KeyCode[] codes = {
KeyCode.A
};
execute(
exe(() -> {
control.addEventFilter(KeyEvent.ANY, (ev) -> {
System.out.println(ev);
ev.consume();
});
})
);
for(KeyCode cd: codes) {
Util.runAndWait(() -> {
robot.keyPress(cd);
robot.keyRelease(cd);
});
}
}
}
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1221#discussion_r1329290052
More information about the openjfx-dev
mailing list