84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from mdpolish import Pipeline, RunStatus
|
|
from mdpolish.component import ComponentContractError
|
|
from mdpolish.components import PageBreakWordJoinComponent
|
|
|
|
MAPPINGS = (
|
|
("possi-", "bly", "possibly"),
|
|
("SOFA-", "based", "SOFA-based"),
|
|
("threshold.", "olds", "thresholds"),
|
|
)
|
|
|
|
|
|
def transform(markdown: str): # type: ignore[no-untyped-def]
|
|
return Pipeline([PageBreakWordJoinComponent(MAPPINGS)]).transform(markdown)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("markdown", "expected"),
|
|
[
|
|
("except possi-\nbly through care", "except possibly through care"),
|
|
("except possi-\n\nbly through care", "except possibly through care"),
|
|
("use SOFA-\nbased criteria", "use SOFA-based criteria"),
|
|
("at threshold.\n\nolds of eight", "at thresholds of eight"),
|
|
("except possi-\r\n\r\nbly now", "except possibly now"),
|
|
("except possi-\r\rbly now", "except possibly now"),
|
|
],
|
|
)
|
|
def test_applies_exact_mapping_across_approved_line_shapes(markdown: str, expected: str) -> None:
|
|
result = transform(markdown)
|
|
assert result.status is RunStatus.SUCCESS
|
|
assert result.output_markdown == expected
|
|
assert len(result.changes) == 1
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"markdown",
|
|
[
|
|
"except unknown-\nword here",
|
|
"except possi-\n\n\nbly here",
|
|
"except possi-\r\n\nbly here",
|
|
"except POSSI-\nbly here",
|
|
"except possi-\nblymore here",
|
|
"except xSOFA-\nbased here",
|
|
],
|
|
)
|
|
def test_unknown_or_unsafe_boundaries_are_preserved(markdown: str) -> None:
|
|
assert transform(markdown).output_markdown == markdown
|
|
|
|
|
|
def test_parameters_and_results_are_independent_of_mapping_order() -> None:
|
|
first = PageBreakWordJoinComponent(MAPPINGS)
|
|
second = PageBreakWordJoinComponent(reversed(MAPPINGS))
|
|
markdown = "possibly becomes possi-\nbly"
|
|
|
|
first_result = Pipeline([first]).transform(markdown)
|
|
second_result = Pipeline([second]).transform(markdown)
|
|
|
|
assert first_result.components == second_result.components
|
|
assert first_result.output_markdown == second_result.output_markdown
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"mappings",
|
|
[
|
|
(("", "right", "word"),),
|
|
(("left", "right", "two words"),),
|
|
(("left", "right", "word"), ("left", "right", "other")),
|
|
(("left", "right"),),
|
|
],
|
|
)
|
|
def test_invalid_mappings_raise_contract_error(mappings: object) -> None:
|
|
with pytest.raises(ComponentContractError):
|
|
PageBreakWordJoinComponent(mappings) # type: ignore[arg-type]
|
|
|
|
|
|
def test_successful_output_is_idempotent() -> None:
|
|
pipeline = Pipeline([PageBreakWordJoinComponent(MAPPINGS)])
|
|
first = pipeline.transform("except possi-\n\nbly here")
|
|
assert first.output_markdown is not None
|
|
assert pipeline.transform(first.output_markdown).changes == ()
|