#!/usr/bin/env python3 """Behavioral smoke tests for build_pinmux_csv.py.""" import csv import json import subprocess import sys import tempfile from pathlib import Path SCRIPT = Path(__file__).with_name("build_pinmux_csv.py") HEADERS = ["引脚号", "功能名称", "引脚名称", "有效电平", "FMUX寄存器", "FMUX当前值", "FMUX默认值", "FMUX_list"] def run(payload): with tempfile.TemporaryDirectory() as tmp: root = Path(tmp) source = root / "input.json" output = root / "out.csv" source.write_text(json.dumps(payload, ensure_ascii=False), encoding="utf-8") result = subprocess.run( [sys.executable, str(SCRIPT), "--input", str(source), "--output", str(output)], text=True, capture_output=True, check=False, ) data = output.read_bytes() if output.exists() else b"" return result, data def valid_row(): return { "pin_number": "A12", "function_name": "CAM_RST0", "pin_name": "PAD_MIPI_TXM4", "is_gpio": True, "active_level": "低有效", "fmux_register": "0x030010A4", "fmux_current": "3", "fmux_default": "0", "fmux_list": "0:XGPIOA_20; 1:CAM_MCLK0; 3:GPIOA_20", } def main(): result, data = run({"project_name": "测试 项目", "rows": [valid_row()]}) assert result.returncode == 0, result.stderr assert data.startswith(b"\xef\xbb\xbf") rows = list(csv.reader(data.decode("utf-8-sig").splitlines())) assert rows[0] == HEADERS assert len(rows) == 2 and rows[1][0] == "A12" bad = valid_row() bad["active_level"] = None result, data = run({"project_name": "bad", "rows": [bad]}) assert result.returncode == 2 and not data assert "GPIO 有效电平无效" in result.stderr duplicate = valid_row() result, data = run({"project_name": "dup", "rows": [valid_row(), duplicate]}) assert result.returncode == 2 and not data assert "引脚号重复" in result.stderr mismatched_mux = valid_row() mismatched_mux["fmux_current"] = "7" result, data = run({"project_name": "mux", "rows": [mismatched_mux]}) assert result.returncode == 2 and not data assert "FMUX当前值 7 未出现在 FMUX_list" in result.stderr print("Pinmux CSV behavioral tests passed") return 0 if __name__ == "__main__": raise SystemExit(main())