fix(830-7): 일괄 시험 계산이 고르기 빈 입력 로직을 건너뜀으로 셈 — GC001199~1201 IndexError 해소

- check_master.calc_all: 고르기 목록이 빈 입력이 있는 로직(내 기계 전용 식)은 멈춤이 아닌 「건너뜀」 — 결과는 (통과 · 멈춤 · 건너뜀 키) 셋 · 계산전부 출력에 건너뜀 수와 키
- 호출 시험 둘(test_masterdata_check · test_713_4)을 셋 묶음에 맞춤
- 나머지 1,517 개 시험 계산 결과 그대로 · 정본 · 금액 안 바뀜

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-14 16:19:45 +09:00
co-authored by Claude Sonnet 5.5
parent 459e23c763
commit e119d467bf
3 changed files with 15 additions and 10 deletions
+11 -6
View File
@@ -519,19 +519,24 @@ def 시험입력(row: dict) -> dict:
return given
def calc_all(files: dict[str, dict], whole: mf.Master) -> tuple[int, list[str]]:
"""로직 전부를 시험 입력으로 돌림 — (통과 수, 멈춘 줄 목록)."""
passed, stuck = 0, []
def calc_all(files: dict[str, dict], whole: mf.Master) -> tuple[int, list[str], list[str]]:
"""로직 전부를 시험 입력으로 돌림 — (통과 수, 멈춘 줄 목록, 건너뜀 키 목록).
고르기 목록이 빈 입력이 있는 로직(GC001199~1201 = 내 기계 전용 식 · M01 정본 기계가 안 씀)은
고를 값이 없어 건너뜀 — 멈춤으로 세지 않음."""
passed, stuck, skipped = 0, [], []
for data in files.values():
if data.get("그룹") != "로직":
continue
for row in data.get("줄", []):
if any(i.get("고르기") == [] for i in row.get("입력", [])):
skipped.append(str(row["키"]))
continue
try:
mf.run(whole, str(row["키"]), 시험입력(row))
passed += 1
except mf.FormulaError as err:
stuck.append(f"{row['키']} {row.get('이름')} · {err}")
return passed, stuck
return passed, stuck, skipped
def _value(text: str):
@@ -549,8 +554,8 @@ def main(argv: list[str]) -> int:
return 0
if mode == "계산전부":
files, whole = load(), master()
passed, stuck = calc_all(files, whole)
print(f"(계산) 통과 {passed} · 멈춤 {len(stuck)}")
passed, stuck, skipped = calc_all(files, whole)
print(f"(계산) 통과 {passed} · 멈춤 {len(stuck)} · 건너뜀 {len(skipped)} {skipped}")
for line in stuck:
print(" " + line)
return 0
+2 -2
View File
@@ -74,7 +74,7 @@ def test_방제_열_여덟_플랜트_한_표() -> None:
"압력배관용 탄소강관 KSD3562 SCH#40",
}
whole = cm.mf.Master(files)
passed, stuck = cm.calc_all(files, whole)
assert not stuck and passed == sum(
passed, stuck, skipped = cm.calc_all(files, whole)
assert not stuck and passed + len(skipped) == sum(
1 for d in files.values() if d.get("그룹") == "로직" for _ in d["줄"]
)
+2 -2
View File
@@ -1008,7 +1008,7 @@ def test_품셈재료_고르기_칸이_옛_파일에_있음():
def test_로직_일괄_시험계산():
"""로직 전부를 시험 입력으로 돌림 — 멈춤은 데이터 결손(관리자 값·규격 미지정)만."""
files = cm.load()
passed, stuck = cm.calc_all(files, mf.Master(files))
passed, stuck, _ = cm.calc_all(files, mf.Master(files))
assert passed >= 1279
남은_까닭 = (
"관리자가 채울 값",
@@ -1085,7 +1085,7 @@ def test_테스트_대상_로직_입력에_설명(whole):
def test_표_조건_조합이_없어_멈추지_않음():
"""표에 없는 조합(오거비트 혼합층 등)으로는 시험 계산을 돌리지 않음 — 「맞는 줄 0개」 0건."""
files = cm.load()
_, stuck = cm.calc_all(files, mf.Master(files))
_, stuck, _ = cm.calc_all(files, mf.Master(files))
assert [x for x in stuck if "맞는 줄" in x] == []