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