"""Project file emitter regression.""" import json from tools.epro2.kicad.pro_writer import write_kicad_pro def test_pro_carries_filename_and_root_sheet_uuid(): """The .kicad_pro must record (a) its own filename so KiCad confirms the basename matches the .kicad_sch / .kicad_pcb siblings, and (b) the root sheet uuid in the `sheets` array — that's how KiCad binds the project to the schematic root. A `sheets: []` pro file works for "open a one-off PCB" but loses cross-tool navigation in the schematic editor.""" text = write_kicad_pro("EchoEar-CoreBoard", root_sheet_uuid="abc-123") j = json.loads(text) assert j["meta"]["filename"] == "EchoEar-CoreBoard.kicad_pro" assert j["sheets"] == [["abc-123", ""]] def test_pro_without_root_uuid_emits_empty_sheets_array(): """When called for a board that has only a PCB (the SCH was DELETE_DOC), there's no root sheet uuid. Emit `sheets: []` so the project file still parses — KiCad will simply not show a schematic editor on open.""" text = write_kicad_pro("OnlyPcb", root_sheet_uuid=None) j = json.loads(text) assert j["sheets"] == [] def test_pro_top_level_keys_present_for_kicad_8(): """KiCad 8 expects certain top-level keys to exist (it'll backfill missing ones but with a "save changes?" prompt every open). Smoke-test: assert the keys that GUI reads at startup.""" text = write_kicad_pro("X") j = json.loads(text) for key in ("board", "meta", "schematic", "sheets", "net_settings"): assert key in j, f"missing top-level key: {key}"