- 기준 목록 옵션 줄(바꿈) 뺀 바탕 줄만 · 규격 칸 = 「옵션 N」(새 순수 함수 logic/M02_Find_Heads.ts) — 찾아 넣기 창 · 옛 창(Labor_Pick) 같이 · 옵션 줄 골라도 옵션 버리던 흠 걷음 · 서버 목록 그대로 - 단가산출 상세 [항목 추가] 기초 = 바탕 비었으면 바탕(옛 단추 동작 · 단위 비거나 식이면 기초 결과단위) · logicOnly 걷음 · locale M02_SangeunPickBase 지움 - 낡은 시험 test_721_find_pick 721-1 · 721-2 = 단추 걷음 · logicOnly 없음으로 고침 · 새 시험 test_727_sk_base_add - 기초 줄 1,461(옛 10,053) · GF000099 한 줄 「옵션 1」 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
68 lines
2.9 KiB
Python
68 lines
2.9 KiB
Python
"""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
|