"""779-1 격자 세 보기 — 여덟 실무 파일: 보기 셋(두 꼴 같은 역할) · 목록 짝 100 % · 줄 행 대응. `M02_Hopyo_Grid.read` 응답 `보기 · 원본 · 목록 · 줄` — 서버 몫만(화면 없음). """ import warnings import pytest from M02_MasterTemplete import M02_Hopyo_Excel as hx from M02_MasterTemplete import M02_Hopyo_Grid as hg from resources.tester.helper_m02_hopyo_golden import FILES warnings.filterwarnings("ignore", category=UserWarning, module="openpyxl") ROLES = {"일위대가표", "단가산출표", "단가산출상세"} @pytest.fixture(scope="module", params=sorted(FILES)) def one(request): path = FILES[request.param] data = path.read_bytes() parsed = hx.read_book(path.name, data) return parsed, hg.read(path.name, data, parsed) def test_보기_셋(one): parsed, grid = one assert set(grid["보기"]) == set(grid["원본"]) == ROLES names = {s["id"]: s["이름"] for s in grid["책"]["시트"]} assert [names[grid["보기"][r]] for r in ("일위대가표", "단가산출표", "단가산출상세")] == [ grid["원본"][r] for r in ("일위대가표", "단가산출표", "단가산출상세") ] assert list(names) == [grid["보기"][r] for r in ("일위대가표", "단가산출표", "단가산출상세")] assert len(grid["책"]["시트"]) == 3 assert parsed["꼴"] in ("엑셀꼴", "STmate") def test_목록_짝_100(one): parsed, grid = one for key in ("호표", "단산"): got = grid["목록"][key] assert sorted(x["번"] for x in got) == sorted(x["번"] for x in parsed[key]), key rows = [x["행"] for x in got] assert len(set(rows)) == len(rows) and min(rows) >= 4 def test_줄_행_대응(one): parsed, grid = one lines = [(h["번"], x) for h in parsed["호표"] for x in h["줄"]] assert [(x["번"], x["차례"], x["행"]) for x in grid["줄"]] == [ (n, x["차례"], x["행"]) for n, x in lines ] span = {h["번"]: h["행"] for h in parsed["호표"]} block = {b["번"]: b["행"] for b in parsed["단산"]} for one_, (no, line) in zip(grid["줄"], lines, strict=True): assert span[no][0] < one_["행"] <= span[no][1] ref = line.get("참조") or {} if ref.get("종류") == "단산" and ref["번"] in block: assert one_["단산"] == {"번": ref["번"], "행": block[ref["번"]]} else: assert "단산" not in one_ if ref.get("종류") == "일위" and ref.get("번") in span: assert one_["일위"] == {"번": ref["번"], "행": span[ref["번"]]} else: assert "일위" not in one_ assert any("단산" in x for x in grid["줄"]) def test_두_꼴_같은_역할_셋(): """역할마다 엑셀꼴 · STmate 시트 이름 하나씩 · 탭 차례 = 역할 차례(꼴별로).""" assert {r: len(n) for r, n in hg.ROLES.items()} == dict.fromkeys(ROLES, 2) first = [hg.SHEETS.index(n[0]) for n in hg.ROLES.values()] second = [hg.SHEETS.index(n[1]) for n in hg.ROLES.values()] assert first == sorted(first) and second == sorted(second)