66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
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 == ()
|