Files
Sprinter-SDCC/applications/PoP/roomtest/tests-host
Александр Петров 61d4255091 testkit: модульные тесты под ucsim_z80 + планы покрытия
Обвязка для быстрых тестов plain-C логики: секунды вместо прогона в MAME,
без образа диска.  ucsim_z80 идёт в комплекте нашего SDCC — новых
зависимостей нет.

ПОЧЕМУ ПОД Z80, А НЕ ХОСТОВЫМ GCC.  У SDCC z80 int 16 бит, у хоста 32, и
расходится это НЕ в объявлениях, а в выражениях: integer promotion
повышает операнды до int независимо от того, объявлены они как uint8_t
или uint16_t.  Перевод кода на фиксированные типы разницу не убирает —
убирает только исполнение с z80-семантикой.  Побочно проверяется
кодогенерация SDCC и модули с inline-asm, которых хостовая сборка не
видит в принципе.

Устройство: crt0_ucsim.s (SP, зануление, main, halt), tcheck.* (итог в
структуру в ОЗУ), run_ucsim.py (гоняет ucsim, дампит tc_result, печатает
отчёт), host-tests.mk (общие правила).  Вывода через printf нет: тестовый
бинарь линкуется без Sprinter-libc.  Через ucsim-simif не идём — номера
его команд плавают между версиями, halt + dump работают везде.

Наборы лежат РЯДОМ с проверяемым кодом, обвязка общая:
  testkit/t_selftest.c                     — самопроверка (sizeof(int)==2)
  applications/PoP/roomtest/tests-host/    — движок PoP

Первый содержательный набор — t_geom: сверяет рукописный asm-LCG из
pop_geom.c с наивной 32-битной формулой на 128 шагах.  Заявка «бит-в-бит
как в SDLPoP» до сих пор держалась на комментарии.  Тест проверен
мутацией: порча эталонной константы даёт красный.

Планы дальнейшего покрытия:
  docs/host-tests-plan.md                    — libc и libbgi (не начато)
  applications/PoP/docs/host_tests_plan.md   — движок PoP

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 22:36:16 +03:00
..

tests-host — модульные тесты движка roomtest

Прогоняются под ucsim_z80, обвязка общая — testkit/ (там же объяснение, почему под z80, а не хостовым gcc, и грабли).

make host-tests                                  # из корня, вместе с остальными
make -C applications/PoP/roomtest/tests-host     # только эти
make -C applications/PoP/roomtest/tests-host t_geom

Что покрыто

набор модуль что проверяет
t_geom pop_geom.c геометрия комнаты (x_bump, y_land, y_to_row) и PRNG оригинала

Главный тест в t_geomgeom_lcg_matches_reference. LCG оригинала (s = s*214013 + 2531011) написан в pop_geom.c на ассемблере по схеме Горнера ради обхода __mullong, и заявка «бит-в-бит как в SDLPoP» до появления теста держалась только на комментарии. Тест сверяет рукописный asm с наивной 32-битной формулой на 128 шагах — и по возвращаемому значению, и по обеим половинам сида.

Что нужно, чтобы двинуться дальше

Следующие на очереди модули (pop_trob, pop_level, pop_map, логика падающих плит) упираются в два шва, и оба затрагивают продукт:

  1. Доступ к странице уровня. pop_level.c ходит по абсолютным адресам ((uint8_t *)(LVL_DATA_OFF + …) после gfx_w0_map) — в тестах это обращение в никуда. Нужен макрос вида W0PTR(off): на таргете как сейчас, в тестах — смещение в обычном массиве.
  2. Журналирующий рендерер вместо pop_bg/pop_gdraw — не заглушка, а запись вызовов, чтобы проверять «какой тайл помечен к перерисовке, каким кодом, с каким счётчиком страниц». BUG-GATE-ANIM-1 был ровно такой формы.

После этого bug_closed.md превращается в готовый список регрессионных кейсов: у каждой записи там есть симптом и ожидаемое поведение.

Отдельно стоит завести тест на BUG-LOOSE-2 — он до сих пор помечен в bug_list.md как непроверенный именно потому, что гонку «уйти из комнаты раньше, чем долетит плита» через мост MAME воспроизвести не удалось. На уровне логики это несколько строк: заспавнить кусок, сменить комнату, тикать до приземления, проверить щебень в данных уровня.