libx52/tools/test_layout_allowlist_sync.py

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())