"""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