3fe083331f
Проверять физику Кида глазами в 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>
44 lines
1.6 KiB
C
44 lines
1.6 KiB
C
/*
|
|
* 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
|