from __future__ import annotations from leanbench.document import Document, Page, PageWindow, normalise_page_text def test_pages_are_numbered_from_one(two_page_book: Document) -> None: assert len(two_page_book) == 2 assert [p.number for p in two_page_book.pages] == [1, 2] assert two_page_book.page(1).text.startswith("Chapter 1") def test_window_locate_maps_back_to_the_right_page() -> None: window = PageWindow([Page(7, "abcdef"), Page(8, "ghij")]) assert window.text == "abcdef\nghij" assert window.locate(0) == (7, 0) assert window.locate(5) == (7, 5) assert window.locate(6) == (7, 6) # end of page 7 assert window.locate(7) == (8, 0) # first char of page 8 assert window.locate(10) == (8, 3) assert window.locate(999) == (8, 4) # clamped def test_window_globalise_is_the_inverse() -> None: window = PageWindow([Page(1, "hello"), Page(2, "world")]) for page, offset in [(1, 0), (1, 4), (2, 0), (2, 4)]: assert window.locate(window.globalise(page, offset)) == (page, offset) def test_document_slice_reconstructs_a_cross_page_span(two_page_book: Document) -> None: page_one = two_page_book.page(1).text start = page_one.index("Theorem 1.6.3") end = two_page_book.page(2).text.index("has a greatest") text = two_page_book.slice(1, start, 2, end) assert text.startswith("Theorem 1.6.3") assert text.rstrip().endswith("divisors of a and b") def test_normalisation_is_stable_and_gentle() -> None: text = "first line \nsecond" assert normalise_page_text(text) == "first line\nsecond" assert normalise_page_text(normalise_page_text(text)) == normalise_page_text(text) def test_page_checksum_changes_with_content() -> None: assert Page(1, "a").checksum != Page(1, "b").checksum assert Page(1, "a").checksum == Page(9, "a").checksum