#!/usr/bin/env python3 # -*- coding: utf-8 -*- """录波段格式层(段文件字节布局编解码 + 打包游标 + 段名轮转,wave_store)主机侧纯逻辑单元测试运行器(纯标准库)。 做什么: 用本机 MSVC 编译 test/host/wave_store/wave_store_test.c(它以 #include 纳入 **生产源文件** App/algo/wave_store.c),在 PC 上离线跑 CRC-16/MODBUS 规范锚点、 整段长度等式(32 + 12*ch + pts*ch*2 + 2 == 5250)、段头编解码往返、拒绝清单、 按通道分列的偏移换算、打包游标三段推进与四条拒绝路径、自产字节自检、段文件名 轮转与反解,失败即非 0 退出。零硬件、零烧录、毫秒级。顺带把一段合成段写到 %TEMP% 供 PC 侧读段脚本(test/host/wave_read.py)做只读互验(不参与判定)。 工具链探测 / 编译运行全部委托 test/host/common/unit_test_harness.py。 为什么要主机侧单测(而不是只等台架): 段文件是证据。偏移错一个字节、CRC 少覆盖一段、轮转号回绕错一位,在板子上全是 静默的,只有 PC 脚本或回放页才发现,而那时现场已经没了(口径属主见 docs/子系统设计/故障录波设计说明.md §6.2 与 §6.3)。FatFs 真落盘的短写判失败 (§5.2 第二条)需要板子,不在本套件。 本层为纯逻辑:不 include HAL/CMSIS/RTOS、不调 FatFs,**不需要任何桩目录**。 用法(仓库根目录): python test/host/wave_store/run_unit_test.py 退出码:0=PASS / 1=测试失败 / 2=环境错误。 设计依据:docs/子系统设计/故障录波设计说明.md §5.2 §6.2 §6.3 §8.1; docs/子系统设计/故障录波设计说明.md §10。 创建日期:2026-10-29 """ import os import sys HERE = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.dirname(os.path.dirname(os.path.dirname(HERE))) sys.path.insert(0, os.path.join(ROOT, "test", "host", "common")) from unit_test_harness import TestBuild, run_host_unit_test # noqa: E402 # 无桩目录:wave_store.c 只依赖 stdint/stddef 与 App/algo/wave_store.h。 BUILD = TestBuild( name="Wave Store Tests", src=os.path.join(HERE, "wave_store_test.c"), include_dirs=[ os.path.join(ROOT, "App", "algo"), HERE, ], summary_marker="=== Wave Store Tests:", ) if __name__ == "__main__": sys.exit(run_host_unit_test(BUILD))