from __future__ import annotations from leanbench.anchors import find, resolve_span TEXT = ( "Theorem 1.6.2. Let a, b and c be integers. If a divides b and a divides c,\n" "then a divides b + c.\n\nProof. Write b = a k." ) def test_exact_match() -> None: match = find(TEXT, "Theorem 1.6.2.") assert match is not None and match.method == "exact" assert TEXT[match.start : match.end] == "Theorem 1.6.2." def test_whitespace_insensitive_match_across_a_line_break() -> None: match = find(TEXT, "a divides c, then a divides b + c.") assert match is not None assert match.method == "whitespace" assert TEXT[match.start : match.end].replace("\n", " ") == "a divides c, then a divides b + c." def test_fuzzy_match_survives_a_typo() -> None: match = find(TEXT, "Let a, b and c be integres. If a divides b") assert match is not None assert match.method == "fuzzy" assert "integers" in TEXT[match.start : match.end] def test_missing_anchor_is_reported_not_guessed() -> None: assert find(TEXT, "nothing like this appears anywhere in the page") is None def test_resolve_span_covers_start_to_end() -> None: span = resolve_span(TEXT, "Theorem 1.6.2.", "a divides b + c.") assert span is not None and span.resolved assert TEXT[span.start : span.end].startswith("Theorem 1.6.2.") assert TEXT[span.start : span.end].endswith("a divides b + c.") def test_resolve_span_falls_back_when_the_end_quote_is_wrong() -> None: span = resolve_span(TEXT, "Theorem 1.6.2.", "this ending was invented", fallback_length=40) assert span is not None assert "truncated" in span.method assert span.end - span.start == 40 def test_resolve_span_searches_forward_from_the_cursor() -> None: text = "alpha beta alpha gamma" first = resolve_span(text, "alpha", "beta") assert first is not None and first.start == 0 second = resolve_span(text, "alpha", "gamma", search_from=first.end) assert second is not None and second.start == text.rindex("alpha")