87 lines
2.4 KiB
Python
87 lines
2.4 KiB
Python
"""Deterministic sheet-list reconciliation: cover index vs extracted sheets."""
|
|
|
|
from backend.sheet_reconcile import declared_sheet_list, reconcile_sheets
|
|
|
|
COVER_TEXT = """VERIZON CYPRESS
|
|
SHEET LIST
|
|
SHEET NUMBER
|
|
SHEET NAME
|
|
G000
|
|
COVER
|
|
G001
|
|
GENERAL INFO
|
|
C-001
|
|
CIVIL COVER
|
|
C-001.1
|
|
ALTA SURVEY
|
|
L-101
|
|
LANDSCAPE PLAN
|
|
S101
|
|
FOUNDATION PLAN
|
|
S301
|
|
WALL SECTIONS
|
|
S401
|
|
PERSPECTIVE VIEW
|
|
A101
|
|
FLOOR PLAN
|
|
A102
|
|
REFLECTED CEILING PLAN
|
|
E400
|
|
ELECTRICAL SITE PLAN
|
|
"""
|
|
|
|
|
|
def test_declared_sheet_list_from_cover():
|
|
declared = declared_sheet_list({1: COVER_TEXT, 2: "symbols legend"})
|
|
assert declared[0] == "G000"
|
|
assert "C-001" in declared and "C-001.1" in declared # hyphenated ids kept
|
|
assert "L-101" in declared
|
|
assert "A102" in declared
|
|
assert declared.count("G000") == 1
|
|
assert len(declared) == 11
|
|
|
|
|
|
def test_declared_sheet_list_uses_first_index_page_only():
|
|
texts = {1: "no index here", 2: COVER_TEXT, 3: "SHEET LIST\nXX999\nBOGUS"}
|
|
declared = declared_sheet_list(texts)
|
|
assert "XX999" not in declared # only the first marker page is parsed
|
|
|
|
|
|
def test_declared_sheet_list_none_when_no_marker():
|
|
assert declared_sheet_list({1: "just notes", 2: "floor plan stuff"}) == []
|
|
|
|
|
|
def _sheets(*nums):
|
|
return [{"page_number": i + 1, "sheet_number": n}
|
|
for i, n in enumerate(nums)]
|
|
|
|
|
|
def test_reconcile_both_directions():
|
|
declared = declared_sheet_list({1: COVER_TEXT})
|
|
rec = reconcile_sheets(_sheets("G000", "G001", "S101", "S301", "S302", "A101"),
|
|
declared)
|
|
# declared but not extracted (civil/landscape not in this PDF + missing)
|
|
assert "C-001" in rec["declared_not_in_set"]
|
|
assert "A102" in rec["declared_not_in_set"]
|
|
assert "E400" in rec["declared_not_in_set"]
|
|
# extracted but not on the cover index (misread or unlisted sheet)
|
|
assert rec["in_set_not_declared"] == ["S302"]
|
|
assert rec["declared_total"] == 11
|
|
assert rec["found_total"] == 6
|
|
|
|
|
|
def test_reconcile_normalizes_hyphens():
|
|
declared = ["C-001", "S301"]
|
|
rec = reconcile_sheets(_sheets("C001", "S301"), declared)
|
|
assert rec["declared_not_in_set"] == []
|
|
assert rec["in_set_not_declared"] == []
|
|
|
|
|
|
def test_reconcile_ignores_unidentified_sheets():
|
|
rec = reconcile_sheets(
|
|
[{"page_number": 8, "sheet_number": None},
|
|
{"page_number": 9, "sheet_number": "S301"}],
|
|
["S301", "A102"])
|
|
assert rec["found_total"] == 1
|
|
assert rec["declared_not_in_set"] == ["A102"]
|