"""727 M02 단가산출 기초 넣기(요구서_내역19 · 내역 20-1) — 임시 storage · 실제 M01 읽기만. - 727-1 고르기 창 기초 = 로직마다 한 줄(`logic/M02_Find_Heads.ts` · 옛 창도) · 규격 칸 = 「옵션 N」 - 727-2 첫 기초 = 바탕 · 둘째부터 = 더한줄 세부 펼침(덮개 · 뺀줄 · M01 개정 지문 · 꼬리표) · B09 굳힘 같은 값 - 727-3 넣은 뒤 고른 옵션 = SK `입력값` → 일위대가(펼침) · 굳힘도 그 옵션 """ from __future__ import annotations import json import re import subprocess from pathlib import Path from M01_MasterData import M01_MasterData_Store as m01 from M02_MasterTemplete import M02_Logic_Standard as standard ROOT = Path(__file__).resolve().parents[2] M02 = ROOT / "M02_MasterTemplete" IMPORTS = re.compile(r"^import[^;]*;\n", re.MULTILINE) GF = "GF000099" # 측구터파기 토사 · 원/㎥ · 입력 지역 · 보정작업 def _node(files: list[str], body: str): code = "".join(IMPORTS.sub("", (ROOT / f).read_text("utf-8")) for f in files) got = subprocess.run( ["node", "--experimental-strip-types", "--no-warnings", "--input-type=module-typescript", "-"], input=code + body, capture_output=True, text=True, encoding="utf-8", timeout=60, ) # fmt: skip assert got.returncode == 0, got.stderr return json.loads(got.stdout) def _heads(rows): body = ( f"\nconst rows = {json.dumps(rows, ensure_ascii=False, default=str)};" "\nconsole.log(JSON.stringify(logicHeads(rows, (n) => `옵션 ${n}`)));" ) return _node(["M02_MasterTemplete/logic/M02_Find_Heads.ts"], body) def test_727_1_기초마다_한_줄(): whole = m01.loaded()[1] rows = [] for key in (GF, "GC000269", "GC001109"): rows += standard._rows_of(whole, whole.logic(key), False) assert sum(r["키"] == GF for r in rows) == 3 # 옵션 축 보정작업 두 값 + 바탕 got = _heads(rows) assert [r["키"] for r in got] == [GF, "GC000269", "GC001109"] assert all(r["바꿈"] == {} for r in got) one = got[0] assert one["규격"] == "옵션 1" and one["금액"] == next(r for r in rows if r["키"] == GF)["금액"] assert got[2]["규격"] == "" # 옵션 없는 기초 listed = standard.listing() if listed["준비"]: # 파생 저장본이 있을 때 — 1,461 안팎(로직 수) heads = _heads([{k: r[k] for k in ("키", "규격", "바꿈")} for r in listed["줄"]]) assert len(heads) == len({r["키"] for r in listed["줄"]}) assert 1400 <= len(heads) <= 1600 def test_727_1_두_창_모두_기초_한_줄(): find = (M02 / "M02_MasterTemplete_Find_Pick.ts").read_text("utf-8") old = (M02 / "M02_MasterTemplete_Labor_Pick.ts").read_text("utf-8") assert "std = s?.줄.length ? logicHeads(s.줄) : null;" in find assert "std = got.줄.length ? logicHeads(got.줄) : null;" in old assert "logicOnly" not in find