#!/usr/bin/env python3 """Behavioral tests for validate_gpio_plan.py.""" import copy import validate_gpio_plan def valid_plan() -> dict[str, object]: return { "schema_version": 1, "project": "CV1841CP-BOARD_dualos", "validation_mode": "emxres-config", "sources": ["schematic.pdf page 3", "GPIO List row 12"], "confirmation": { "confirmed": True, "confirmed_at": "2026-09-02T10:00:00+08:00", "summary": "用户确认整张 GPIO 实施表", }, "signals": [ { "function": "CAM_RST0", "pad": "PAD_MIPI_TXP2", "mux": "XGPIOC_17", "gpio": "C17", "direction": "output", "active_level": "low", "boot_value": 0, "runtime_owner": "camera", "dts_consumers": ["mipi_rx.snsr-reset"], "source_evidence": ["schematic.pdf page 3"], "decision": "confirmed", "note": "early reset", }, { "function": "CAM_MCLK0", "pad": "PAD_MIPI_TXP0", "mux": "CAM_MCLK0", "gpio": None, "direction": "peripheral", "active_level": None, "boot_value": None, "runtime_owner": "camera", "dts_consumers": [], "source_evidence": ["schematic.pdf page 3"], "decision": "inherited", "note": "camera clock", }, ], } def main() -> int: result = validate_gpio_plan.validate_plan(valid_plan()) assert result["passed"] is True, result candidate = valid_plan() candidate["confirmation"] = {"confirmed": False} candidate["signals"][0]["decision"] = "provisional" candidate["signals"][0]["active_level"] = "unknown" candidate_result = validate_gpio_plan.validate_plan(candidate, allow_unconfirmed=True) assert candidate_result["passed"] is True, candidate_result assert candidate_result["warnings"] assert validate_gpio_plan.validate_plan(candidate)["passed"] is False duplicate = copy.deepcopy(valid_plan()) duplicate["signals"].append(copy.deepcopy(duplicate["signals"][0])) duplicate["signals"][-1]["function"] = "WIFI_PWREN" duplicate_result = validate_gpio_plan.validate_plan(duplicate) assert duplicate_result["passed"] is False assert any("重复 Pad" in error for error in duplicate_result["errors"]) assert any("重复 GPIO" in error for error in duplicate_result["errors"]) invalid_input = copy.deepcopy(valid_plan()) invalid_input["signals"][0]["direction"] = "input" invalid_input["signals"][0]["boot_value"] = 1 assert validate_gpio_plan.validate_plan(invalid_input)["passed"] is False print("GPIO plan behavioral tests passed") return 0 if __name__ == "__main__": raise SystemExit(main())