"""Catalogue page detection and the Phase 1 decoy-image guard.""" from spareparts import config, pdf_loader def test_detects_exactly_the_thirty_catalogue_pages(doc): pages = pdf_loader.find_catalogue_pages(doc) first, last = config.EXPECTED_CATALOGUE_PAGES assert pages == list(range(first, last + 1)) assert len(pages) == config.EXPECTED_PAGE_COUNT def test_front_matter_is_not_a_catalogue_page(doc): # Page 24 is the needle table (a real table, wrong header) and page 25 is # the catalogue cover. Neither may be indexed. for pdf_page in (1, 5, 24, 25): assert not pdf_loader.is_catalogue_page(doc[pdf_page - 1]) def test_every_catalogue_page_yields_a_native_resolution_diagram(doc): for pdf_page in pdf_loader.find_catalogue_pages(doc): diagram = pdf_loader.select_diagram_image(doc[pdf_page - 1]) assert diagram is not None, f"page {pdf_page}" assert diagram.width == 1689, f"page {pdf_page}" assert 2200 < diagram.height < 2400, f"page {pdf_page}" def test_decoy_guard_rejects_off_page_images(doc): # Page 26 carries a second image placed at y 802-1576 on an 842 pt page; # pages 29 and 54 carry one at negative y. The visible diagram must win. for pdf_page in (26, 29, 54): page = doc[pdf_page - 1] diagram = pdf_loader.select_diagram_image(page) rect = diagram.rect assert rect[1] >= 0, f"page {pdf_page} picked an image above the page" assert rect[3] <= page.rect.height + 1, ( f"page {pdf_page} picked an image below the page" ) # Page 26 specifically: xref 116 is on-page, 117 is the decoy below it. assert pdf_loader.select_diagram_image(doc[25]).xref == 116 def test_reused_xref_resolves_per_page(doc): # xref 152 is page 36's off-page second image and page 37's visible diagram, # so the diagram must be resolved per page rather than cached by xref. page36 = pdf_loader.select_diagram_image(doc[35]) page37 = pdf_loader.select_diagram_image(doc[36]) assert page36.xref != page37.xref assert page37.xref == 152 assert page36.pdf_page == 36 and page37.pdf_page == 37 def test_cached_png_matches_the_native_image(doc, tmp_path): from spareparts.index_db import png_size diagram = pdf_loader.load_diagram(doc, 34, tmp_path) assert diagram.png_path.name == "p34.png" assert png_size(diagram.png_path) == (diagram.width, diagram.height)