Files
Aislo/resources/tester/test_m02_hopyo_golden.py
T
eomsangdonandClaude Opus 5.5 8c562812da feat(M02 실무자료): 358-1 후보 묶음 — 이름후보(옛 324 다섯) · 뜻겹침 · 출처 같음 · 책 표시 · 고르기 창 묶음 · 검색 칸 = 품명 낱말 · 일괄 적용(N)
- 서버 줄 맞춤에 이름후보(옛 데스크탑 판과 같음 · 600줄 대조 0 다름) · 후보마다 뜻겹침 · 출처같음(조항 ≥ 0.9) · 책 — 차례 · 무게 · 상태 그대로
- 고르기 창 = 1위 / 출처 같음 / 이름 닮은 로직 / 숫자만 닮음(접힘 · 뜻 안 겹치는 후보 회색 끝) · 같은 이름 책 표시
- 버튼 명사형 — 일괄 적용(N) · 엑셀 보기 · 다른 로직 검색 · 재료비 있는 줄은 다른 자재 검색도
- 시험: match 이름후보 다섯 · 되메우기 · 다웰바 · golden 다섯 안 ∪ 이름후보 · screen 묶음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte
2026-10-16 20:55:48 +09:00

98 lines
3.3 KiB
Python

"""338-1 골든(느림 · 2~4 분) — 정답 표(사람 136 · 새 파일 51)를 실물 엑셀 여덟 파일(읽기만)로 맞춰
설계 7-3 기준 수치 · master_data 원본 그대로 · 셈 무게. 우리 지문 캐시가 없으면 처음 ≈ 40 초 더."""
import time
import pytest
from M02_MasterTemplete import M02_Hopyo_Match as hm
from M02_MasterTemplete import M02_Hopyo_Ours as ours
from resources.tester import helper_m02_hopyo_golden as golden
from resources.tester.test_m02_hopyo_excel import master_hash
LABELED = ("북부청임도", "북부청사방", "동부청영월")
@pytest.fixture(scope="module")
def run():
before = master_hash()
if not ours.ready():
ours.build()
t0 = time.time()
res = golden.evaluate()
return {"결과": res, "시간": time.time() - t0, "원본": before}
@pytest.fixture(scope="module")
def no_seeds():
keep = hm._seeds
hm._seeds = lambda: {}
hm._targets.cache_clear()
try:
yield golden.evaluate(LABELED)
finally:
hm._seeds = keep
hm._targets.cache_clear()
def test_모든_파일_모든_줄(run):
res = run["결과"]
assert not res["못읽음"] and len(res["읽음"]) == 8
assert {lab["id"] for lab in golden.labels()} == set(res["줄"])
def test_사람_126_순위(run):
got = golden.metrics(run["결과"], {"사람"})
assert got["줄"] == 126
assert got["1순위"] >= 116 # 92%
assert got["다섯 안"] >= 122 # 96%
def test_북부청_92_조합_전(run):
rows = [r for r in run["결과"]["줄"].values() if r["lab"]["파일"] in LABELED[:2]]
have = [r for r in rows if r["lab"]["정답"]]
ok = sum((r["셈"].get("지문차례") or [None])[0] in r["lab"]["정답"] for r in have)
assert len(have) == 92 and ok >= 81 # 88%
def test_판정_맞음_다른_점_옵션(run):
got = golden.metrics(run["결과"], {"사람"})
assert got["맞음"] >= 55 and got["맞음 틀림"] <= 2
assert got["다른 점 틀림"] <= 2
assert got["옵션까지"] >= 50
def test_새_파일_맞음_틀림(run):
got = golden.metrics(run["결과"], {"자동", "씨앗", "자동+씨앗"})
assert got["줄"] == 51 and got["맞음 틀림"] <= 3
def test_조합_맞음(run):
got = golden.metrics(run["결과"], {"사람"})
assert got["조합 호표"] == 83 and got["조합 맞음"] >= 60 # 72%
def test_씨앗_끔_1순위(no_seeds):
got = golden.metrics(no_seeds, {"사람"})
assert got["줄"] == 126 and got["1순위"] >= 111 # 88%
def test_원본_그대로_셈_무게(run):
assert master_hash() == run["원본"]
assert run["결과"]["시간"]["북부청임도"] <= 300 # 북부청 임도 맞춤 셈 ≤ 5 분
def test_이름후보_묶음_덧(run):
"""358-1 — 이름후보(옛 324 다섯) = 묶음 덧 · 숫자 차례 그대로 → 다섯 안 ∪ 이름후보 ≥ 다섯 안."""
have = [
r for r in run["결과"]["줄"].values() if r["lab"]["무리"] == "사람" and r["lab"]["정답"]
]
got = hm.targets()
five = [set(r["셈"]["차례"][:5]) for r in have]
named = [{c["로직"] for c in hm.name_cands(r["lab"], got)} for r in have]
near = sum(bool(f & set(r["lab"]["정답"])) for f, r in zip(five, have, strict=True))
both = sum(
bool((f | n) & set(r["lab"]["정답"])) for f, n, r in zip(five, named, have, strict=True)
)
assert both >= near >= 122