from __future__ import annotations import pytest from mdpolish import Pipeline, RunStatus from mdpolish.components import ReferenceSpacingComponent def transform(markdown: str): # type: ignore[no-untyped-def] return Pipeline([ReferenceSpacingComponent()]).transform(markdown) def test_normalizes_missing_and_extra_blank_lines_in_references_only() -> None: markdown = "1. Method\n2. Method\n\n## REFERENCES\n\n1. First\n2. Second\n\n\n3. Third" result = transform(markdown) assert result.status is RunStatus.SUCCESS assert result.output_markdown == "1. Method\n2. Method\n\n## REFERENCES\n\n1. First\n\n2. Second\n\n3. Third" assert len(result.changes) == 2 @pytest.mark.parametrize("heading", ["# References", "## REFERENCES", "### references", "#### ReFeReNcEs"]) def test_accepts_exact_references_heading_with_ascii_case_folding(heading: str) -> None: markdown = f"{heading}\n\n1. First\n2. Second" assert transform(markdown).output_markdown == f"{heading}\n\n1. First\n\n2. Second" @pytest.mark.parametrize("line_ending", ["\n", "\r\n", "\r"]) def test_preserves_line_ending_style(line_ending: str) -> None: markdown = line_ending.join(("## References", "", "1. First", "2. Second")) expected = line_ending.join(("## References", "", "1. First", "", "2. Second")) assert transform(markdown).output_markdown == expected @pytest.mark.parametrize( "markdown", [ "## Reference\n\n1. First\n2. Second", "## References\n\n1. First\n3. Third", "## References\n\n2. Second\n3. Third", "## References\n\n1. First\n### Subsection\n2. Second", "## References\r\n\r\n1. First\r\n\n2. Second", ], ) def test_ambiguous_or_mixed_sections_are_preserved(markdown: str) -> None: assert transform(markdown).output_markdown == markdown def test_same_or_higher_heading_ends_section() -> None: markdown = "## References\n\n1. First\n2. Second\n\n## Appendix\n\n1. Keep\n2. Keep" result = transform(markdown) assert result.output_markdown == "## References\n\n1. First\n\n2. Second\n\n## Appendix\n\n1. Keep\n2. Keep" def test_multiline_reference_uses_its_last_text_line_as_boundary() -> None: markdown = "## References\n\n1. First line\ncontinuation\n2. Second" result = transform(markdown) assert result.output_markdown == "## References\n\n1. First line\ncontinuation\n\n2. Second" def test_successful_output_is_idempotent() -> None: pipeline = Pipeline([ReferenceSpacingComponent()]) first = pipeline.transform("## References\n\n1. First\n2. Second") assert first.output_markdown is not None assert pipeline.transform(first.output_markdown).changes == ()