97 lines
3.2 KiB
Python
97 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Behavioral tests for the bundled CV18 GPIO pinout catalog."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
|
|
SCRIPT = Path(__file__).with_name("query_builtin_pinout.py")
|
|
SPEC = importlib.util.spec_from_file_location("query_builtin_pinout", SCRIPT)
|
|
assert SPEC is not None and SPEC.loader is not None
|
|
MODULE = importlib.util.module_from_spec(SPEC)
|
|
SPEC.loader.exec_module(MODULE)
|
|
|
|
|
|
def selected_id(chip: str) -> str:
|
|
return str(MODULE.select_document(chip)["id"])
|
|
|
|
|
|
def main() -> int:
|
|
expected = {
|
|
"CV1810": "cv181xc",
|
|
"CV1811C": "cv181xc",
|
|
"CV1812CPA": "cv181xc",
|
|
"CV1812HP": "cv181xh",
|
|
"CV1815JA": "cv1815j",
|
|
"CV1841CP": "cv184xc",
|
|
"CV1842CP": "cv184xc",
|
|
"CV1842HP": "cv184xh",
|
|
"CV1843HP": "cv184xh",
|
|
}
|
|
for chip, identifier in expected.items():
|
|
assert selected_id(chip) == identifier, chip
|
|
|
|
try:
|
|
MODULE.select_document("CV1801B")
|
|
except MODULE.PinoutError as exc:
|
|
assert "没有对应" in str(exc)
|
|
else:
|
|
raise AssertionError("unsupported chips must fail closed")
|
|
|
|
manifest = MODULE.load_manifest()
|
|
assert len(manifest) == 5
|
|
for document in manifest:
|
|
sheet, rows = MODULE.load_pin_rows(document["path"])
|
|
assert "管腳信息表" in sheet or "管脚信息表" in sheet
|
|
assert rows
|
|
results, unmatched = MODULE.query_rows(rows, ["SD0_CLK", "GPIOA_7"], "exact")
|
|
assert not unmatched, document["id"]
|
|
assert [item["query"] for item in results] == ["SD0_CLK", "GPIOA_7"]
|
|
gpio_matches = results[1]["matches"]
|
|
assert any(
|
|
mux.get("function") == "XGPIOA[7]"
|
|
for row in gpio_matches
|
|
for mux in row["muxes"]
|
|
)
|
|
|
|
with tempfile.TemporaryDirectory() as temporary:
|
|
project = Path(temporary) / "CV1815JA-misleading-name"
|
|
project.mkdir()
|
|
config = project / "buildEnvConfig.sh"
|
|
config.write_text("export EP_CHIP='CV1842HP'\n", encoding="utf-8")
|
|
result = MODULE.run(project, None, ["SD0_CLK"], "exact")
|
|
assert result["passed"] is True
|
|
assert result["chip"] == "CV1842HP"
|
|
assert result["pinout"]["id"] == "cv184xh"
|
|
assert result["chip_evidence"]["source"] == "project-buildEnvConfig"
|
|
|
|
config.write_text("EP_CHIP=CV1811C\nEP_CHIP=CV1841CP\n", encoding="utf-8")
|
|
try:
|
|
MODULE.project_chip(project)
|
|
except MODULE.PinoutError as exc:
|
|
assert "唯一确定" in str(exc)
|
|
else:
|
|
raise AssertionError("ambiguous EP_CHIP must fail closed")
|
|
|
|
config.write_text("EP_CHIP=$CV1841CP\n", encoding="utf-8")
|
|
try:
|
|
MODULE.project_chip(project)
|
|
except MODULE.PinoutError as exc:
|
|
assert "静态芯片名称" in str(exc)
|
|
else:
|
|
raise AssertionError("dynamic EP_CHIP must fail closed")
|
|
|
|
result = MODULE.run(None, "CV1841CP", ["NOT_A_REAL_PIN"], "exact")
|
|
assert result["passed"] is False
|
|
assert result["unmatched"] == ["NOT_A_REAL_PIN"]
|
|
|
|
print("Bundled CV18 GPIO pinout behavioral tests passed")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|