"""713-3 지킴 — 로직 목록 덧칸(묶음 · 작업량 부모 · 부르는/불리는 수 · 관련) · 정본 그대로 · 줄 수 그대로.""" from __future__ import annotations from M01_MasterData import M01_MasterData_Router as router from M01_MasterData import M01_MasterData_Store_List as store_list COLS = {"묶음", "묶음수", "작업량", "부모", "부르는수", "불리는수", "관련", "인재경"} def test_목록_줄_수_그대로_덧칸_다_있음() -> None: got = router.get_logics()["logics"] assert len(got) == 1461 # 묶음은 화면 접기만 — 목록 줄은 정본 로직 수 그대로(713-4 뒤 1,461) assert all(COLS <= set(x) for x in got) def test_묶음_작업량_부르기() -> None: more = store_list.extras() # 한 절에 로직 둘 넘음(조사 12-B ㉯ 323 → 713-4 합침 · 지움 뒤 307) assert sum(1 for v in more.values() if v["묶음"]) == 307 work = {k for k, v in more.items() if v["작업량"]} assert len(work) == 21 # 27 − 터파기 작업량 6(713-4 · 단가 로직 안에 품음) assert more["GF000098"]["부모"] == ["GF000099"] # 측구터파기 작업량 → 단가 로직 밑 assert more["GC000268"]["불리는수"] >= 300 # 기계경비 로직 assert sum(1 for v in more.values() if v["부르는수"]) == 506 assert more["GC000294"]["관련"] == ["GC000292"] # 비고 「1-5-6(주③)」 # 인재경 줄 수 = 712-1 묶음 파생 · 못 가른 「하위」 = 복합 하위 로직 부르기 31(조사 12-B ③4) assert sum(v["인재경"]["하위"] for v in more.values()) == 31 assert more["GF000101"]["인재경"] == {"인력": 1, "재료": 0, "경비": 1, "하위": 0} def test_관련은_해석_글과_넓은_절을_뺌() -> None: more = store_list.extras() assert all(len(v["관련"]) <= store_list._WIDE for v in more.values()) assert not any(k in v["관련"] for k, v in more.items()) # 자기 자신 없음 def test_화면_접기_같은_절_작업량_찾는_중엔_펼침() -> None: import json import shutil import subprocess from pathlib import Path import pytest if shutil.which("node") is None: pytest.skip("node 가 없음") root = Path(__file__).resolve().parents[2] url = (root / "M01_MasterData/logic/M01_MasterData_logic_list_fold.ts").as_uri() src = f""" import {{ foldRows }} from "{url}"; const items = [ {{ key: "A", group: "f|9-12" }}, {{ key: "W", parents: ["A"] }}, {{ key: "B", group: "f|9-12" }}, {{ key: "C", group: "f|9-12" }}, {{ key: "D" }}, ]; const keys = (rows) => rows.map((r) => [r.item.key, r.depth, r.hidden ?? 0]); console.log(JSON.stringify({{ shut: keys(foldRows(items, new Set(), false)), open: keys(foldRows(items, new Set(["A"]), false)), flat: keys(foldRows(items, new Set(), true)).length, }})); """ done = subprocess.run( ["node", "--experimental-strip-types", "--input-type=module", "-e", src], capture_output=True, text=True, encoding="utf-8", timeout=60, cwd=root, ) assert done.returncode == 0, done.stderr got = json.loads(done.stdout) assert got["shut"] == [["A", 0, 3], ["D", 0, 0]] # 묶음 나머지 둘 + 작업량 하나 접힘 assert got["open"] == [["A", 0, 3], ["W", 1, 0], ["B", 1, 0], ["C", 1, 0], ["D", 0, 0]] assert got["flat"] == 5