tests-host: покадровый харнесс сценариев Кида (физика + зацеп)
Проверять физику Кида глазами в MAME дорого и ненадёжно: ошибка почти всегда не в одной функции, а в РАСХОЖДЕНИИ ТРАЕКТОРИИ через несколько кадров. Харнесс гоняет тот же кадр, что и главный цикл (pop_ctrl_tick -> kid_tick -> pop_phys_tick -> pop_loose_tick), и сравнивает трассу состояния с эталоном. - scene.c/.h — раннер: комната + стартовая поза + скрипт ввода -> трасса; sc_kid_at_x задаёт точный X (исход часто зависит от фазы внутри тайла). - stubs.c/.h — libc/libbgi/соседние модули; read() реально отдаёт kid_data.bin (иначе kdat_ok=0 и play_seq молчит — трасса замирает). - t_phys.c — 9 характеризующих сценариев, 1723 сверки (golden/). - t_grab.c — окно зацепа: существует, достижимо коротким шагом, не зависит от рисунка нажатий. - record_golden.py — снятие эталона по одному сценарию за прогон. - testkit/host-tests.mk — CODE_LOC настраиваемый, EXTRA_INC/EXTRA_CFLAGS. Именно харнесс дал доказательство, что физика зацепа у нас верна, и тем самым перевёл поиск BUG-GRAB-1 на клавиатуру. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* stubs.h — интерфейс тестового окружения (см. stubs.c).
|
||||
*
|
||||
* Что тест может задавать: «нажатые» клавиши (tk_key_down) и модификаторы
|
||||
* тайлов комнаты (tk_modif). Что может проверять: журнал обращений
|
||||
* физики к соседним модулям (tk_log).
|
||||
*/
|
||||
#ifndef POP_TESTS_STUBS_H
|
||||
#define POP_TESTS_STUBS_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* ---- клавиатура ------------------------------------------------------ */
|
||||
#define TK_KEYS_MAX 6
|
||||
extern uint16_t tk_keys[TK_KEYS_MAX];
|
||||
void tk_keys_clear(void);
|
||||
void tk_key_down(uint16_t code);
|
||||
|
||||
/* ---- комната --------------------------------------------------------- */
|
||||
extern uint8_t tk_modif[30]; /* room_modif текущей комнаты */
|
||||
extern uint8_t tk_start_room; /* что вернёт pop_level_start_room */
|
||||
|
||||
/* ---- журнал обращений ------------------------------------------------ */
|
||||
#define TK_LOG_MAX 24
|
||||
|
||||
enum {
|
||||
TK_TROB = 1, /* a=room b=tilepos c=type */
|
||||
TK_BUTTON, /* a=room b=tilepos c=type */
|
||||
TK_REDRAW, /* a=tilepos b=kind c=pages */
|
||||
TK_REDRAW_ABOVE, /* a=col b=kind c=pages */
|
||||
TK_MOB_SPAWN /* a=row b=col */
|
||||
};
|
||||
|
||||
typedef struct { uint8_t kind, a, b, c; } tk_log_e;
|
||||
typedef struct { uint8_t n, overflow; tk_log_e e[TK_LOG_MAX]; } tk_log_t;
|
||||
|
||||
extern tk_log_t tk_log;
|
||||
void tk_log_clear(void);
|
||||
|
||||
/* Сколько записей данного вида в журнале (0 = не было). */
|
||||
uint8_t tk_log_count(uint8_t kind);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user