84 lines
2.9 KiB
Python
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())
|