feat: deterministic sheet-list reconciliation (cover index vs identified sheets)
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
"""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"]
|
||||
Reference in New Issue
Block a user