from __future__ import annotations import pytest from mdpolish import Pipeline, RunStatus from mdpolish.components import WordReviewCommentComponent def transform(markdown: str): # type: ignore[no-untyped-def] return Pipeline([WordReviewCommentComponent()]).transform(markdown) def test_deletes_single_line_comment_and_one_following_blank() -> None: markdown = "before\nCommented [AB1]: review this\n\nafter" result = transform(markdown) assert result.status is RunStatus.SUCCESS assert result.output_markdown == "before\nafter" assert len(result.changes) == 1 assert result.changes[0].reason == "删除严格单行 Word 审阅批注及其后一个空行" def test_adjacent_comment_blocks_are_deleted_without_overlap() -> None: markdown = "before\nCommented [A1]: first\n\nCommented [B2R1]: second\n\nafter" result = transform(markdown) assert result.output_markdown == "before\nafter" assert len(result.changes) == 2 assert result.changes[0].span.end == result.changes[1].span.start @pytest.mark.parametrize("line_ending", ["\n", "\r\n", "\r"]) def test_preserves_line_ending_style(line_ending: str) -> None: markdown = line_ending.join(("before", "Commented [A1]: note", "", "after")) assert transform(markdown).output_markdown == line_ending.join(("before", "after")) @pytest.mark.parametrize( "comment", [ "prefix Commented [A1]: note", " Commented [A1]: note", "Commented []: note", "Commented [A-1]: note", "Commented [A1]:", "Commented [A1]: ", ], ) def test_similar_lines_are_preserved(comment: str) -> None: markdown = f"before\n{comment}\n\nafter" assert transform(markdown).output_markdown == markdown def test_requires_a_following_blank_line_and_does_not_delete_extra_blanks() -> None: without_blank = "Commented [A1]: note\nafter" with_two_blanks = "before\nCommented [A1]: note\n\n\nafter" assert transform(without_blank).output_markdown == without_blank assert transform(with_two_blanks).output_markdown == "before\n\nafter" def test_successful_output_is_idempotent() -> None: pipeline = Pipeline([WordReviewCommentComponent()]) first = pipeline.transform("Commented [A1]: note\n\nafter") assert first.output_markdown is not None second = pipeline.transform(first.output_markdown) assert second.status is RunStatus.SUCCESS assert second.changes == ()