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 == ()