#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ADC 采样有效性校验(L1-6)的主机侧单元测试运行器(L0.5,纯标准库)。 做什么: 用本机 MSVC 编译 test/host/adc_health/adc_health_test.c(它以 #include 纳入 **生产源文件** App/algo/adc_health.c),在 PC 上离线跑完整的判定逻辑验证: 首拍建基线 / 健康不误报 / 静默 100ms 门限与恢复留痕 / 丢帧边沿语义 / 序号倒退锁存 / 三类错误计数增量 / tick 回绕 / NULL 守卫 / init 幂等, 失败即非 0 退出。零硬件、零烧录、毫秒级。 工具链探测 / INCLUDE-LIB 拼接 / 编译运行 / 退出码判定全部委托给通用 harness `test/host/common/unit_test_harness.py`(本文件只做声明)。 为什么要主机侧单测(而不是只用板端闭环): 静默/倒退/错误增量在健康台架上不可复现(复现 = 拔芯片/改驱动)——板端只能 证明"健康时不误报",证不了"故障时必报";而 100ms 门限、tick 回绕、事件 边沿语义这些边界只有合成计数序列能精确构造。 本层为**纯逻辑**:无寄存器、无 RTOS、无文件/外设依赖,故**不需要任何桩目录**。 用法(仓库根目录): python test/host/adc_health/run_unit_test.py 或统一用 .venv: & '.venv\\Scripts\\python.exe' test/host/adc_health/run_unit_test.py 退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。 设计依据:docs/算法/继电保护功能复现规划.md §3.1(L1-6); docs/测试说明/测试开发标准流程.md §4.2(L0.5 主机侧单测)。 创建日期:2026-10-11 """ import os import sys HERE = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.dirname(os.path.dirname(os.path.dirname(HERE))) # harness 位于 test/host/common/ sys.path.insert(0, os.path.join(ROOT, "test", "host", "common")) from unit_test_harness import TestBuild, run_host_unit_test # noqa: E402 # 无桩目录:被测代码为纯逻辑(adc_health.c 仅依赖 stdint.h 与自身头)。 BUILD = TestBuild( name="ADC Health Tests", src=os.path.join(HERE, "adc_health_test.c"), include_dirs=[ os.path.join(ROOT, "App", "algo"), HERE, ], summary_marker="=== ADC Health Tests:", ) if __name__ == "__main__": sys.exit(run_host_unit_test(BUILD))