summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webdriver/actions/key.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webdriver/actions/key.py')
-rw-r--r--testing/web-platform/tests/webdriver/actions/key.py170
1 files changed, 170 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webdriver/actions/key.py b/testing/web-platform/tests/webdriver/actions/key.py
new file mode 100644
index 000000000..d4f313c47
--- /dev/null
+++ b/testing/web-platform/tests/webdriver/actions/key.py
@@ -0,0 +1,170 @@
+import pytest
+
+from support.keys import Keys
+from support.refine import get_keys, filter_dict, get_events
+
+
+def test_lone_keyup_sends_no_events(session, key_reporter, key_chain):
+ key_chain.key_up("a").perform()
+ assert len(get_keys(key_reporter)) == 0
+ assert len(get_events(session)) == 0
+ session.actions.release()
+ assert len(get_keys(key_reporter)) == 0
+ assert len(get_events(session)) == 0
+
+
+# TODO - the harness bails with TIMEOUT before all these subtests complete
+# The timeout is per file, so move to separate file with longer timeout?
+# Need a way to set timeouts in py files (since can't do html meta)
+# @pytest.mark.parametrize("name,expected", ALL_EVENTS.items())
+# def test_webdriver_special_key_sends_keydown(session,
+# key_reporter,
+# key_chain,
+# name,
+# expected):
+# key_chain.key_down(getattr(Keys, name)).perform()
+# # only interested in keydown
+# first_event = get_events(session)[0]
+# # make a copy so we throw out irrelevant keys and compare to events
+# expected = dict(expected)
+# del expected["value"]
+# # check and remove keys that aren't in expected
+# assert first_event["type"] == "keydown"
+# assert first_event["repeat"] == False
+# first_event = filter_dict(first_event, expected)
+# assert first_event == expected
+# # check that printable character was recorded in input field
+# if len(expected["key"]) == 1:
+# assert get_keys(key_reporter) == expected["key"]
+
+
+@pytest.mark.parametrize("value,code", [
+ (u"a", "KeyA",),
+ ("a", "KeyA",),
+ (u"\"", "Quote"),
+ (u",", "Comma"),
+ (u"\u00E0", ""),
+ (u"\u0416", ""),
+ (u"@", "Digit2"),
+ (u"\u2603", ""),
+ (u"\uF6C2", ""), # PUA
+])
+def test_single_printable_key_sends_correct_events(session,
+ key_reporter,
+ key_chain,
+ value,
+ code):
+ key_chain \
+ .key_down(value) \
+ .key_up(value) \
+ .perform()
+ expected = [
+ {"code": code, "key": value, "type": "keydown"},
+ {"code": code, "key": value, "type": "keypress"},
+ {"code": code, "key": value, "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
+ assert get_keys(key_reporter) == value
+
+
+@pytest.mark.parametrize("value", [
+ (u"\U0001F604"),
+ (u"\U0001F60D"),
+])
+def test_single_emoji_records_correct_key(session, key_reporter, key_chain, value):
+ # Not using key_chain.send_keys() because we always want to treat value as
+ # one character here. `len(value)` varies by platform for non-BMP characters,
+ # so we don't want to iterate over value.
+ key_chain \
+ .key_down(value) \
+ .key_up(value) \
+ .perform()
+ # events sent by major browsers are inconsistent so only check key value
+ assert get_keys(key_reporter) == value
+
+
+@pytest.mark.parametrize("value,code,key", [
+ (u"\uE050", "ShiftRight", "Shift"),
+ (u"\uE053", "OSRight", "Meta"),
+ (Keys.CONTROL, "ControlLeft", "Control"),
+])
+def test_single_modifier_key_sends_correct_events(session,
+ key_reporter,
+ key_chain,
+ value,
+ code,
+ key):
+ key_chain \
+ .key_down(value) \
+ .key_up(value) \
+ .perform()
+ all_events = get_events(session)
+ expected = [
+ {"code": code, "key": key, "type": "keydown"},
+ {"code": code, "key": key, "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in all_events]
+ assert events == expected
+ assert len(get_keys(key_reporter)) == 0
+
+
+@pytest.mark.parametrize("value,code,key", [
+ (Keys.ESCAPE, "Escape", "Escape"),
+ (Keys.RIGHT, "ArrowRight", "ArrowRight"),
+])
+def test_single_nonprintable_key_sends_events(session,
+ key_reporter,
+ key_chain,
+ value,
+ code,
+ key):
+ key_chain \
+ .key_down(value) \
+ .key_up(value) \
+ .perform()
+ expected = [
+ {"code": code, "key": key, "type": "keydown"},
+ {"code": code, "key": key, "type": "keypress"},
+ {"code": code, "key": key, "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ if len(events) == 2:
+ # most browsers don't send a keypress for non-printable keys
+ assert events == [expected[0], expected[2]]
+ else:
+ assert events == expected
+ assert len(get_keys(key_reporter)) == 0
+
+
+def test_sequence_of_keydown_printable_keys_sends_events(session,
+ key_reporter,
+ key_chain):
+ key_chain \
+ .key_down("a") \
+ .key_down("b") \
+ .perform()
+ expected = [
+ {"code": "KeyA", "key": "a", "type": "keydown"},
+ {"code": "KeyA", "key": "a", "type": "keypress"},
+ {"code": "KeyB", "key": "b", "type": "keydown"},
+ {"code": "KeyB", "key": "b", "type": "keypress"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
+ assert get_keys(key_reporter) == "ab"
+
+
+def test_sequence_of_keydown_character_keys(session, key_reporter, key_chain):
+ key_chain.send_keys("ef").perform()
+ expected = [
+ {"code": "KeyE", "key": "e", "type": "keydown"},
+ {"code": "KeyE", "key": "e", "type": "keypress"},
+ {"code": "KeyE", "key": "e", "type": "keyup"},
+ {"code": "KeyF", "key": "f", "type": "keydown"},
+ {"code": "KeyF", "key": "f", "type": "keypress"},
+ {"code": "KeyF", "key": "f", "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
+ assert get_keys(key_reporter) == "ef"