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

1"""Unit tests for rustfmt parser.""" 

2 

3from __future__ import annotations 

4 

5import pytest 

6from assertpy import assert_that 

7 

8from lintro.parsers.rustfmt.rustfmt_parser import parse_rustfmt_output 

9 

10 

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. 

24 

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) 

31 

32 

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) 

42 

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

48 

49 

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) 

64 

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) 

71 

72 

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) 

78 

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") 

82 

83 

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) 

94 

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") 

98 

99 

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) 

111 

112 assert_that(result).is_length(1) 

113 assert_that(result[0].file).is_equal_to("src/main.rs") 

114 

115 

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) 

120 

121 assert_that(result).is_length(0)