Files
Aislo/resources/tester/test_m01_test_container.py
T
eomsangdonandClaude Sonnet 5 292568e688 feat(M01): 일위대가 로직 테스트 컨테이너 틀 + 방식 A 질문·답 마법사
- 왼쪽 패널에 「일위대가 로직 테스트」 컨테이너 추가 — 공종 10 개 고르기 + 방식 탭 A·B·C (B·C 는 준비 중)
- 방식 A: 공종 → 조건 질문(한 번에 하나) → 재료·기계 고르기 → 결과 호표 · 식 안 보임 · 저장 없음
- 대상 10 개는 복잡도로 재어 고름(scripts/로직_복잡도_재기.py) · 시험 test_m01_test_container.py

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
2026-09-20 21:34:39 +09:00

51 lines
1.7 KiB
Python

"""M01 로직 테스트 컨테이너 — 대상 10 개(틀 파일 TEST_KEYS)가 실제 산림품셈 로직이고 막히지 않았는지.
방식 A·B·C 는 같은 `/calc` 를 씀 — 여기서는 10 개가 모두 첫 선택값으로 셈이 끝까지 가는지만 봄.
"""
from __future__ import annotations
import re
from pathlib import Path
from M01_MasterData import M01_MasterData_Store as store
FRAME = Path(store.__file__).with_name("M01_MasterData_UI_Test.ts")
KEYS = re.findall(r'^\s+"(GF\d{6})",', FRAME.read_text(encoding="utf-8"), re.M)
def _first_inputs(logic: dict) -> dict:
"""고르기 = 첫 값 · 범위 = 아래 끝 · 나머지 = 10 (마법사가 흔히 넣는 값)."""
out = {}
for spec in logic.get("입력") or []:
if spec.get("고르기"):
out[spec["이름"]] = spec["고르기"][0]
elif spec.get("범위"):
out[spec["이름"]] = spec["범위"][0]
else:
out[spec["이름"]] = 10
return out
def test_ten_keys():
assert len(KEYS) == 10 and len(set(KEYS)) == 10
def test_keys_are_forest_logics_and_not_blocked():
for key in KEYS:
one = store.logic(key)
assert one["file"].startswith("로직_산림품셈_"), key
assert not one["blocked"], (key, one["reasons"])
def test_required_three_present():
# 메쌓기 13-4-1 · 노체 9-16-1 · 트럭 운반 10-4 — 끝까지 눌러 보는 셋
assert {"GF000219", "GF000119", "GF000137"} <= set(KEYS)
def test_calc_answers_for_each():
for key in KEYS:
one = store.logic(key)
answer = store.calc(key, _first_inputs(one["logic"]), None, None)
assert isinstance(answer, dict) and "ok" in answer, key