Files
firmware-lowlevel-development/skills/firmware-lowlevel-bsp-development/scripts/bsp/test_validate_gpio_plan.py
T

84 lines
2.9 KiB
Python

#!/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())