61d4255091
Обвязка для быстрых тестов 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>
47 lines
3.2 KiB
Markdown
47 lines
3.2 KiB
Markdown
# 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_geom` — `geom_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 воспроизвести не удалось. На
|
||
уровне логики это несколько строк: заспавнить кусок, сменить комнату,
|
||
тикать до приземления, проверить щебень в данных уровня.
|