#!/usr/bin/env python3 # -*- coding: utf-8 -*- """录波环(故障录波数据面·滚动环与触发冻结状态机,wave_ring)主机侧纯逻辑单元测试运行器(纯标准库)。 做什么: 用本机 MSVC 编译 test/host/wave_ring/wave_ring_test.c(它以 #include 纳入 **生产源文件** App/algo/wave_ring.c + App/algo/wave_store.c),在 PC 上离线跑 环形态与预算、触发到封段的逐拍时序、段内容与点序(列序 = 语义序)、SEALED 期间 写指针真冻结、封存交棒握手、读窗夹取与跨环回绕、ACK 与冷却、轮转号推进规则, 失败即非 0 退出。零硬件、零烧录、毫秒级。 工具链探测 / 编译运行全部委托 test/host/common/unit_test_harness.py。 为什么要主机侧单测(而不是只等台架): 本层判据几乎全是结构与并发类(docs/子系统设计/故障录波设计说明.md §4.2 与 §5.2)—— 1 ms 一拍的冻结窗在人工读表下不可观测,"落盘道挂住两秒"这种注入在真机上等于 拿看门狗窗口赌;主机侧可拿影子样本序列逐点钉死。需要板子的判据(注入 1 V/50 Hz 后 FTP 拉回对表)不在本套件,见 docs/子系统设计/故障录波设计说明.md §10 板级行。 本层为纯逻辑:无寄存器、无 RTOS、无文件/外设依赖,**不需要任何桩目录**。 用法(仓库根目录): python test/host/wave_ring/run_unit_test.py 退出码:0=PASS / 1=测试失败 / 2=环境错误。 设计依据:docs/子系统设计/故障录波设计说明.md §4.2 §5.1 §5.2 §6.2 §7; 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_ring.c / wave_store.c 只依赖 stdint/stddef 与本目录两份头。 BUILD = TestBuild( name="Wave Ring Tests", src=os.path.join(HERE, "wave_ring_test.c"), include_dirs=[ os.path.join(ROOT, "App", "algo"), HERE, ], summary_marker="=== Wave Ring Tests:", ) if __name__ == "__main__": sys.exit(run_host_unit_test(BUILD))