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