Coverage for tests / unit / parsers / test_rustfmt_parser.py: 100%
44 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-04-03 18:53 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2026-04-03 18:53 +0000
1"""Unit tests for rustfmt parser."""
3from __future__ import annotations
5import pytest
6from assertpy import assert_that
8from lintro.parsers.rustfmt.rustfmt_parser import parse_rustfmt_output
11@pytest.mark.parametrize(
12 ("output", "expected_count"),
13 [
14 pytest.param(None, 0, id="none_input"),
15 pytest.param("", 0, id="empty_string"),
16 pytest.param(" \n\n ", 0, id="whitespace_only"),
17 ],
18)
19def test_parse_rustfmt_output_empty_cases(
20 output: str | None,
21 expected_count: int,
22) -> None:
23 """Parser returns empty list for empty/None input.
25 Args:
26 output: The input to parse.
27 expected_count: Expected number of issues.
28 """
29 result = parse_rustfmt_output(output)
30 assert_that(result).is_length(expected_count)
33def test_parse_rustfmt_output_diff_format() -> None:
34 """Parser extracts issues from diff-style output."""
35 output = """Diff in src/main.rs:5:
36 fn main() {
37- println!("hello");
38+ println!("hello");
39 }
40"""
41 result = parse_rustfmt_output(output)
43 assert_that(result).is_length(1)
44 assert_that(result[0].file).is_equal_to("src/main.rs")
45 assert_that(result[0].line).is_equal_to(5)
46 assert_that(result[0].message).is_equal_to("File needs formatting")
47 assert_that(result[0].fixable).is_true()
50def test_parse_rustfmt_output_multiple_diffs() -> None:
51 """Parser handles multiple diff sections."""
52 output = """Diff in src/main.rs:5:
53 fn main() {
54- let x=1;
55+ let x = 1;
56 }
57Diff in src/lib.rs:10:
58 fn foo() {
59- bar()
60+ bar();
61 }
62"""
63 result = parse_rustfmt_output(output)
65 # Parser deduplicates by file, so each file only appears once
66 assert_that(result).is_length(2)
67 assert_that(result[0].file).is_equal_to("src/main.rs")
68 assert_that(result[0].line).is_equal_to(5)
69 assert_that(result[1].file).is_equal_to("src/lib.rs")
70 assert_that(result[1].line).is_equal_to(10)
73def test_parse_rustfmt_output_standalone_file_paths() -> None:
74 """Parser handles standalone .rs file paths."""
75 output = """src/main.rs
76src/lib.rs"""
77 result = parse_rustfmt_output(output)
79 assert_that(result).is_length(2)
80 assert_that(result[0].file).is_equal_to("src/main.rs")
81 assert_that(result[1].file).is_equal_to("src/lib.rs")
84def test_parse_rustfmt_output_deduplicates_files() -> None:
85 """Parser deduplicates issues by file path."""
86 output = """Diff in src/main.rs:5:
87- old
88+ new
89Diff in src/main.rs:10:
90- another old
91+ another new
92"""
93 result = parse_rustfmt_output(output)
95 # Only one issue per file
96 assert_that(result).is_length(1)
97 assert_that(result[0].file).is_equal_to("src/main.rs")
100def test_parse_rustfmt_output_mixed_content() -> None:
101 """Parser handles mixed diff and other output."""
102 output = """Checking src/main.rs...
103Diff in src/main.rs:5:
104 fn main() {
105- let x=1;
106+ let x = 1;
107 }
108Some other output line
109"""
110 result = parse_rustfmt_output(output)
112 assert_that(result).is_length(1)
113 assert_that(result[0].file).is_equal_to("src/main.rs")
116def test_parse_rustfmt_output_no_issues() -> None:
117 """Parser returns empty list for clean output."""
118 output = "All checks passed!"
119 result = parse_rustfmt_output(output)
121 assert_that(result).is_length(0)