mirror of https://github.com/nirenjan/libx52.git
107 lines
3.8 KiB
Python
Executable File
107 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (C) 2026 Nirenjan Krishnan (nirenjan@nirenjan.org)
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-only WITH Classpath-exception-2.0
|
|
"""Regression checks for layout HID allowlist and token maps (see vkm.h / layout_usage_allowlist.c)."""
|
|
|
|
import pathlib
|
|
import re
|
|
import sys
|
|
|
|
|
|
def _emit_tap(test_cases):
|
|
"""test_cases: iterable of (description, callable). Callable raises on failure."""
|
|
case_list = list(test_cases)
|
|
print("TAP version 13")
|
|
print("1..%d" % len(case_list))
|
|
failed = 0
|
|
for i, (desc, fn) in enumerate(case_list, 1):
|
|
try:
|
|
fn()
|
|
except AssertionError as e:
|
|
failed += 1
|
|
print("not ok %d - %s" % (i, desc))
|
|
msg = str(e) if str(e) else "assertion failed"
|
|
for line in msg.splitlines():
|
|
print("# %s" % line)
|
|
else:
|
|
print("ok %d - %s" % (i, desc))
|
|
return 1 if failed else 0
|
|
|
|
|
|
def main():
|
|
root = pathlib.Path(__file__).resolve().parent.parent
|
|
sys.path.insert(0, str(root / "tools"))
|
|
|
|
import x52compile_layout as x
|
|
|
|
def check_allowed_set():
|
|
expected = frozenset(range(0x04, 0x3A)) | frozenset((0x64,))
|
|
assert x.ALLOWED_KEY_USAGES == expected, "%r != %r" % (x.ALLOWED_KEY_USAGES, expected)
|
|
|
|
def check_allowlist_c_range():
|
|
src = (root / "daemon" / "layout_usage_allowlist.c").read_text(encoding="utf-8")
|
|
assert "usage >= 0x04 && usage <= 0x39" in src, (
|
|
"daemon/layout_usage_allowlist.c: expected main-block range check"
|
|
)
|
|
|
|
def check_allowlist_c_intl():
|
|
src = (root / "daemon" / "layout_usage_allowlist.c").read_text(encoding="utf-8")
|
|
assert "usage == 0x64" in src, (
|
|
"daemon/layout_usage_allowlist.c: expected INTL_BACKSLASH (0x64) check"
|
|
)
|
|
|
|
def check_vkm_modifier_symbols():
|
|
vkm = (root / "vkm" / "vkm.h").read_text(encoding="utf-8")
|
|
for name in (
|
|
"VKM_KEY_MOD_LCTRL",
|
|
"VKM_KEY_MOD_LSHIFT",
|
|
"VKM_KEY_MOD_LALT",
|
|
"VKM_KEY_MOD_LGUI",
|
|
"VKM_KEY_MOD_RCTRL",
|
|
"VKM_KEY_MOD_RSHIFT",
|
|
"VKM_KEY_MOD_RALT",
|
|
"VKM_KEY_MOD_RGUI",
|
|
):
|
|
assert re.search(r"%s\s*=\s*\([^)]+\)" % re.escape(name), vkm), (
|
|
"could not find %s in vkm.h" % name
|
|
)
|
|
|
|
def check_modifier_bits():
|
|
assert x.MODIFIER_TOKEN_TO_BIT["LCTRL"] == 1 << 0 and x.MODIFIER_TOKEN_TO_BIT["RALT"] == 1 << 6, (
|
|
"modifier map mismatch vs expected HID bit layout"
|
|
)
|
|
|
|
def check_tokens_in_allowlist():
|
|
for _tok, usage in x.KEY_TOKEN_TO_USAGE.items():
|
|
assert usage in x.ALLOWED_KEY_USAGES, (
|
|
"token maps outside allowlist: %r -> %#x" % (_tok, usage)
|
|
)
|
|
|
|
def check_usage_from_key_token_a():
|
|
assert x.usage_from_key_token("a") == 0x04
|
|
|
|
def check_usage_from_key_token_space():
|
|
assert x.usage_from_key_token("SPACE") == 0x2C
|
|
|
|
def check_modifier_mask_ctrl_shift():
|
|
assert x.modifier_mask_from_tokens("CTRL+SHIFT") == (1 << 0) | (1 << 1)
|
|
|
|
tests = (
|
|
("ALLOWED_KEY_USAGES matches main block + INTL_BACKSLASH", check_allowed_set),
|
|
("layout_usage_allowlist.c main-block range", check_allowlist_c_range),
|
|
("layout_usage_allowlist.c INTL_BACKSLASH (0x64)", check_allowlist_c_intl),
|
|
("vkm.h modifier symbol names", check_vkm_modifier_symbols),
|
|
("MODIFIER_TOKEN_TO_BIT LCTRL/RALT bits", check_modifier_bits),
|
|
("KEY_TOKEN_TO_USAGE subset of allowlist", check_tokens_in_allowlist),
|
|
("usage_from_key_token(a)", check_usage_from_key_token_a),
|
|
("usage_from_key_token(SPACE)", check_usage_from_key_token_space),
|
|
("modifier_mask_from_tokens(CTRL+SHIFT)", check_modifier_mask_ctrl_shift),
|
|
)
|
|
|
|
return _emit_tap(tests)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|