A tree patched by another version of sdl-relative-mouse.patch (an older checkout, or CI's cached third_party, whose key now includes the patches) has the listener put back as SDL has it before the patch is applied, rather than failing the apply and turning the Android build off. The patch is regenerated with git diff, with its context lines.
The engine's real functions, taken from the sources and compiled against a
fake world, so a fix can carry a test CI runs without game assets. A test is
tests/<name>.c (fake world and cases, CHECK) and tests/test_<name>.py (takes
the code, enums and constants from the sources, builds, runs each case under
pytest). Each test has negative controls: the code with a deliberate fault
must fail a named CHECK. CI runs pytest on tools/harness, so new tests need
no workflow change.
- test_object_bounds_cache: collision's loop over a crowded fake world gathers
the same features with the cache, as objects move and after invalidation;
a stale cache is detected.
- test_widget_pool: widgets.c's pool fills to its size and refuses (64 slots
against 128 players' rifles, #145), frees and reuses, and frees a failed
widget's slot.