#!/usr/bin/env python3 # # Call with pytest. Requires XKB_CONFIG_ROOT to be set import os import pytest import subprocess import sys from pathlib import Path def _xkb_config_root(): path = os.getenv("XKB_CONFIG_ROOT") assert path is not None, "Environment variable XKB_CONFIG_ROOT must be set" print(f"Using {path}") xkbpath = Path(path) assert (xkbpath / "symbols").exists(), f"{path} is not an XKB installation" return xkbpath @pytest.fixture def xkb_config_root(): return _xkb_config_root() def pytest_generate_tests(metafunc): # for any test_foo function with an argument named xkb_symbols, # make it a list of tuples in the form (us, dvorak) # The list is generated by scanning all xkb symbol files and extracting the # various sections if "xkb_symbols" in metafunc.fixturenames: xkb_symbols = [] # This skips the *_vndr directories, they're harder to test for symbols_file in _xkb_config_root().glob("symbols/*"): if symbols_file.is_dir(): continue with open(symbols_file) as f: print(f"Found file {symbols_file}") for line in f: if not line.startswith('xkb_symbols "'): continue section = line.split('"')[1] xkb_symbols.append((symbols_file.name, section)) assert xkb_symbols metafunc.parametrize("xkb_symbols", xkb_symbols) def test_xkbcomp(xkb_config_root, xkb_symbols): layout, variant = xkb_symbols keymap = """ xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+%s(%s)" }; }; """ % ( layout, variant, ) print(keymap) args = [ "xkbcomp", "-w0", # reduce warning nose "-xkb", "-I", # disable system includes f"-I{xkb_config_root}", "-", "-", # from stdin, to stdout ] p = subprocess.run(args, input=keymap, encoding="utf-8", capture_output=True) if p.stderr: print(p.stderr, file=sys.stderr) if p.returncode != 0: print(p.stdout) if p.returncode < 0: print(f"xkbcomp exited with signal {-p.returncode}", file=sys.stderr) assert p.returncode == 0