- 서버 줄 맞춤에 이름후보(옛 데스크탑 판과 같음 · 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
98 lines
3.3 KiB
Python
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
|