from __future__ import annotations import pytest from mdpolish import Pipeline, RunStatus from mdpolish.components import RepeatedRunningHeaderComponent HEADER = "## Repeated Paper Header" def transform(markdown: str): # type: ignore[no-untyped-def] return Pipeline([RepeatedRunningHeaderComponent()]).transform(markdown) @pytest.mark.parametrize("line_ending", ["\n", "\r\n", "\r"]) def test_bridges_interrupted_sentence_and_deletes_other_occurrence(line_ending: str) -> None: markdown = line_ending.join( ( "Sentence continues in", "", HEADER, "", "the next line.", "", "18. Reference", "", HEADER, "", "19. Reference", ) ) result = transform(markdown) assert result.status is RunStatus.SUCCESS assert result.output_markdown == line_ending.join( ("Sentence continues in the next line.", "", "18. Reference", "", "19. Reference") ) assert len(result.changes) == 2 @pytest.mark.parametrize( "markdown", [ f"before\n\n{HEADER}\n\nafter", f"Sentence ends.\n\n{HEADER}\n\nAfter\n\nAnother sentence.\n\n{HEADER}\n\nOther", f"Sentence continues\n\n{HEADER}\n\nAfter\n\nText ends.\n\n{HEADER}\n\nOther", f"Sentence continues\n\n{HEADER}\n\nafter\n{HEADER}\nnot blank", ], ) def test_missing_or_unsafe_group_evidence_preserves_document(markdown: str) -> None: assert transform(markdown).output_markdown == markdown def test_header_matching_is_exact_and_not_keyword_based() -> None: markdown = "continues\n\n## Any Header\n\nfrom here\n\n18. Ref\n\n## Any Header\n\n19. Ref" result = transform(markdown) assert result.output_markdown == "continues from here\n\n18. Ref\n\n19. Ref" def test_successful_output_is_idempotent() -> None: pipeline = Pipeline([RepeatedRunningHeaderComponent()]) first = pipeline.transform(f"continues\n\n{HEADER}\n\nfrom here\n\ntext\n\n{HEADER}\n\nend") assert first.output_markdown is not None assert pipeline.transform(first.output_markdown).changes == ()