Files
Aislo/resources/tester/test_779_2_hopyo_marks.py
T
eomsangdonandClaude Opus 5.5 75db009175 feat(780-1): 일위대가 밖 단가산출도 판정 · 확인 · 칠 — 모든 블록 · 부름 칸 · 빈 블록 「줄 없음」(요구 627)
- Sangeun: 판정 · 확인 몸 = 모든 블록(북부청 임도 49 → 95) · 줄마다 `부름 [호표 번]`([] = 일위대가 밖) ·
  밖 블록 = 이름 · 단위 블록 것 · 근거 없음 · 없는 번만 404 · 하위 밖 블록(울진소광 492 → 83)은 확인 목록에 함께 = 하위 먼저
- SkUnit: 줄 0 블록 = 판정 「줄 없음」 고를줄 1 → 확인해도 못만듦(빈 SK 없음)
- Marks: 블록마다 `부름` · `줄` · `어긋남` = 모든 블록(밖 포함) · 맞춤셈 `판정` 밖 = None 그대로
- 시험 고침(낡은 기대 = 일위대가 안 블록만): 778-5 units 49 → 95(안 49 따로) · 779-2 어긋남 + 밖 4 · 44 · 48 · 77 · 78 ·
  779-5 줄 칠 모든 블록 · 778-5 excel misses 밖 블록 5 · 새 시험 test_780_1_sangeun_outside(밖 확인 · 빈 블록 · 울진소광 · 여덟 파일 459)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 18:08:50 +09:00

83 lines
3.8 KiB
Python

"""779-2 불러오기 엑셀 하이라이트 재료 — 목록 `줄상태` 수 = 줄 수 · 상태 = 확인 창 상태 ·
`hopyo-marks` 길 읽기만(층 폴더 파일 변화 0) · 블록 판정 = 맞춤셈 캐시 · SK = 만든 것."""
import hashlib
from M02_MasterTemplete import M02_Hopyo_Fit as fit
from M02_MasterTemplete import M02_Hopyo_Sangeun as sangeun
from M02_MasterTemplete import M02_Template_Layers as layers
from resources.tester.test_m02_hopyo_excel import NORTH, URL, _post, client # noqa: F401
# ruff: noqa: F811
KEY = "HP-000001"
def _tree(root) -> dict[str, str]:
return {
str(p.relative_to(root)): hashlib.sha256(p.read_bytes()).hexdigest()
for p in sorted(root.rglob("*"))
if p.is_file()
}
def _ready(client):
res = _post(client, data=NORTH.read_bytes(), name=NORTH.name)
assert res.status_code == 200 and res.json()["키"] == KEY
folder = layers.personal_dir(7, 42)
fit.run_job(folder, KEY)
return folder
def test_줄상태_수_줄_수_확인창_같음(client):
_ready(client)
base = URL.format("personal")
whole = client.get(f"{base}/{KEY}").json()
assert whole["호표"]
diff = {}
for h in whole["호표"]:
one = client.get(f"{base}/{KEY}/{h['번']}").json()["호표"]
assert len(h["줄상태"]) == len(one["줄"]) == h["맞춤"][1], h["번"]
for (i, state, check), line in zip(h["줄상태"], one["줄"]):
full = line["맞춤"]["상태"]
if state != full:
diff[(state, full)] = diff.get((state, full), 0) + 1
assert check == line["맞춤"]["체크"]
assert h["만든"] is None # 확인된 사전조합 전
assert [x[0] for x in h["줄상태"]] == list(range(len(h["줄상태"])))
# 779-4 — 목록 「후보」 중 이름 후보 안 찾은 줄은 다시 셈 → 확인 창과 모두 같음(「없음」 = 빨강)
assert diff == {}, diff
def test_marks_읽기만_판정_캐시_같음_SK(client):
folder = _ready(client)
base = URL.format("personal")
before = _tree(folder)
got = client.get(f"{base}-marks/{KEY}")
assert got.status_code == 200, got.text
rows = got.json()["블록"]
assert _tree(folder) == before # 읽기만 — 파일 변화 0
cache = fit.result(folder, KEY)["블록"]
hp = client.get(f"{base}-grid/{KEY}") # 길 살아 있음(블록 수는 파일에서)
assert hp.status_code == 200
assert rows and [r["번"] for r in rows] == sorted(r["번"] for r in rows)
judged = [r for r in rows if r["판정"]]
assert judged and all(r["판정"] in ("맞음", "다른 점", "후보", "없음") for r in judged)
assert {r["판정"] for r in judged} <= {e["판정"]["상태"] for e in cache.values()}
assert all(r["SK"] is None and r["갈래"] is None and r["못옮김"] == [] for r in rows)
# 778-5 D-6 — 엑셀 셈 어긋남 덧칸(780-1 모든 블록) · 2 · 33 = 엑셀 합이 줄 뺌 · 4 … 78 = 일위대가 밖
assert {r["번"] for r in rows if r["어긋남"]} == {2, 33, 64, 95, 4, 44, 48, 77, 78}
# [단가산출 만들기] 뒤 = SK · 갈래 · 못옮김 실림(778-5 — 확인한 블록만)
rows = client.post(f"{base}/{KEY}/sangeun").json()["판정"]
sure = [{"번": r["번"]} for r in rows if not r["고를줄"]]
made = client.post(f"{base}/{KEY}/sangeun", json={"확인": sure})
assert made.status_code == 200, made.text
after = {r["번"]: r for r in client.get(f"{base}-marks/{KEY}").json()["블록"]}
for one in made.json()["만듦"]:
row = after[one["번"]]
assert (row["SK"], row["갈래"], row["못옮김"]) == (one["키"], one["갈래"], one["못옮김"])
assert sangeun.made(folder, KEY)
snap = _tree(folder)
client.get(f"{base}-marks/{KEY}")
assert _tree(folder) == snap
assert client.get(f"{base}-marks/HP-999999").status_code in (404, 400)