Стенд CAT
Прогон:
test/cat/run.sh
Собирает cattest.pas и запускает его; код возврата ненулевой, если хоть одна
проверка провалена. Внешних библиотек не требует и железа не касается: команды
ходят по подставному радио (TFakeRadio), у которого есть настоящие геттеры и
сеттеры, поэтому видно не только «команда ответила», но и что именно она
изменила.
Зачем он такой
Команд в CATEngine.pas больше трёхсот, и проверять их по одной бессмысленно —
список всё равно отстанет от кода. Поэтому стенд проверяет свойства всего
набора сразу, а по командам ходит перебором AA..ZZ: незнакомый код движок
отсеет сам («?;»), значит новая команда попадает под проверку без правки
стенда.
-
A. Круговой прогон. То, что команда отдала на опрос, она обязана принять обратно. Так ловится классическое расхождение ширин:
ZZGT;отвечалZZGT000;, а на установку принимал ровно один символ — клиент, который читает значение и пишет его назад (обычная идиома логгеров), получал?;. Read-only статусы (IF,ID,ZZIF,ZZID) из прогона исключены списком. -
B. Мусор в поле. Разбор не имеет права упасть ни на одном аргументе (сборка идёт с
-Criot— проверки диапазонов, ввода-вывода, переполнения и приведения типов включены) и обязан отвечать либо ничем, либо?;/E;, либо одним корректным кадром: лишняя;внутри ответа для клиента означает две команды вместо одной, и дальше он читает мусор. Отдельным прогоном на чистом радио проверяется, что нечисловое поле ничего не перестроило: этот класс дефектов («StrToIntDef(s, 0)» → индекс 0) уводил станцию на нулевой диапазон, нулевой фильтр и нулевую громкость. Числовые формы в этот прогон не входят:ZZFA00000000000;— синтаксически законная команда, и решать её судьбу должен контроллер, а не разбор. -
C. Точечные регрессии на дефекты, которые уже случались: заглушка, молча правившая радио (
ZZVBкопировал VFO A в VFO B прямо на опросе), ошибочные алиасы, ширины полей, кенвудовские двойники уже исправленныхZZ-команд (FW/SH/SL/AG/SQ/GT— про них однажды забыли).
Грабли сборки
Те же, что и у стенда TCI (см. test/tci/README.md): -Mobjfpc обязателен, а
каталог .ppu — свой и по абсолютному пути, иначе компилятор подхватит units
GUI-сборки из корня проекта.