mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
Команд в CATEngine больше трёхсот, и проверять их поимённо бессмысленно: список отстанет от кода в первую же неделю. Поэтому стенд ходит по кодам перебором AA..ZZ (незнакомый движок отсеет сам, ответив «?;») и проверяет свойства, которые обязаны выполняться на всём наборе сразу. Круговой прогон: то, что команда отдала на опрос, она обязана принять обратно. Это ловит расхождение ширин GET и SET — клиент, который читает значение и пишет его назад, обычная идиома логгеров. Read-only статусы (IF, ID, ZZIF, ZZID) исключены списком: их ответ — составной снимок, обратно его не пишут ни Kenwood, ни Thetis. Мусор в поле: разбор не имеет права упасть ни на одном аргументе (сборка с -Criot: диапазоны, переполнения, приведения типов) и обязан отвечать либо ничем, либо «?;»/«E;», либо ОДНИМ корректным кадром — лишняя ';' внутри ответа для клиента означает две команды вместо одной, и дальше он читает мусор. Отдельным прогоном на чистом радио: нечисловое поле не имеет права ничего перестроить. Числовые формы в этот прогон не входят намеренно — «ZZFA00000000000;» синтаксически законна, и решать её судьбу должен контроллер, а не разбор. Радио подставное (TFakeRadio): ни движка, ни железа, но геттеры и сеттеры настоящие, поэтому видно не «команда ответила», а ЧТО она изменила. Плюс точечные регрессии на дефекты, которые уже случались: заглушка, молча правившая радио (ZZVB копировал VFO A в VFO B прямо на опросе), ошибочные алиасы, нечисловое поле как индекс 0, ширины полей. ★-B в обоих стендах (и в TCI тоже). Не «для чистоты»: fpc сверяет .ppu с исходником по времени с точностью до секунды, и правка, попавшая в ту же секунду, что и прошлая сборка, молча не подхватывается — стенд выносит вердикт о СТАРОМ коде. Это хуже, чем не запускаться вовсе, и ловится обычно на негативном контроле, когда исходник меняют туда-обратно (на нём и поймалось). Полная пересборка графа стенда занимает около секунды. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
36 lines
2.7 KiB
Bash
Executable File
36 lines
2.7 KiB
Bash
Executable File
#!/bin/sh
|
||
# Стенд TCI: сборка и прогон. Запускать откуда угодно — скрипт сам перейдёт
|
||
# в свой каталог. Возвращает ненулевой код, если хоть одна проверка провалена.
|
||
#
|
||
# Флаги те же, что у демона (см. build-ewsdrd.sh), и по тем же причинам:
|
||
# -Mobjfpc — командный режим по умолчанию: включает вложенные комментарии.
|
||
# С -Mdelphi {$MODE Delphi} внутри шапки WebUtils.pas закрывает
|
||
# комментарий раньше времени, и компиляция падает на
|
||
# «illegal character». Юниты дальше сами ставят свой {$mode}.
|
||
# -dHEADLESS — PlatformUtils не тянет Forms (LCL): стенду виджетсет не нужен,
|
||
# а без этого сборка требует всю LCL.
|
||
# ★Каталог .ppu — свой, с именем НЕ «lib», и путь абсолютный. Относительное
|
||
# «lib/<cpu>-<os>» компилятор ищет и относительно -Fu, то есть находит units
|
||
# GUI-сборки в корне проекта — а там PlatformUtils собран с LCL, и стенд падает
|
||
# на линковке с «undefined reference to TC_$FORMS_$$_SCREEN».
|
||
# libwdsp нужна только части E (сквозной прогон через движок); без неё эта
|
||
# часть сообщает о пропуске, а остальные идут как обычно.
|
||
set -e
|
||
cd "$(dirname "$0")"
|
||
HERE=$(pwd)
|
||
CPU=$(fpc -iTP)
|
||
OS=$(fpc -iTO)
|
||
OUTUNITS="$HERE/units/${CPU}-${OS}"
|
||
OUT="$HERE/bin/${CPU}-${OS}"
|
||
mkdir -p "$OUTUNITS" "$OUT"
|
||
# ★-B (пересобрать всё) обязателен, а не «для чистоты»: fpc сверяет .ppu с
|
||
# исходником по времени с точностью до секунды, и правка, попавшая в ту же
|
||
# секунду, что и прошлая сборка, молча не подхватывается. Стенд тогда выносит
|
||
# ВЕРДИКТ О СТАРОМ КОДЕ — хуже, чем не запускаться вовсе (ловится это обычно на
|
||
# негативном контроле, когда исходник меняют туда-обратно). Полная пересборка
|
||
# графа стенда занимает около секунды.
|
||
fpc -B -Mobjfpc -O2 -dHEADLESS \
|
||
-Fu../.. -FU"$OUTUNITS" -k-L/usr/local/lib \
|
||
-o"$OUT/tcitest" tcitest.pas
|
||
exec "$OUT/tcitest" "$@"
|