mod test_utils;
use lineguard::checker::IssueType;
use test_utils::{
TestFile, TestableGitHubReporter, TestableHumanReporter, TestableJsonReporter,
TestableReporter, create_sample_check_result, create_sample_issue,
setup_integration_test_environment, verification, with_test_files,
};
#[test]
fn example_json_reporter_test() {
let reporter = TestableJsonReporter;
let issue1 = create_sample_issue(
IssueType::MissingNewline,
None,
"Missing newline at end of file",
);
let issue2 = create_sample_issue(IssueType::TrailingSpace, Some(15), "Trailing spaces found");
let results = vec![
create_sample_check_result("src/main.rs", vec![issue1]),
create_sample_check_result("src/lib.rs", vec![issue2]),
];
let output = reporter.report_to_string(&results);
assert!(verification::is_valid_json(&output));
assert!(verification::verify_json_output(&output, 2, 2)); assert_eq!(verification::count_files_in_json(&output), Some(2));
assert_eq!(verification::count_issues_in_json(&output), Some(2));
assert!(output.contains("src/main.rs"));
assert!(output.contains("src/lib.rs"));
assert!(output.contains("missing_newline"));
assert!(output.contains("trailing_space"));
}
#[test]
fn example_github_reporter_test() {
let reporter = TestableGitHubReporter;
let issue = create_sample_issue(
IssueType::MultipleNewlines,
Some(100),
"Multiple trailing newlines",
);
let results = vec![create_sample_check_result("docs/README.md", vec![issue])];
let output = reporter.report_to_string(&results);
assert!(verification::verify_github_output(
&output,
&[
"::error file=docs/README.md,line=100",
"Multiple trailing newlines"
]
));
assert_eq!(
output.trim(),
"::error file=docs/README.md,line=100::Multiple trailing newlines"
);
}
#[test]
fn example_human_reporter_test() {
let reporter = TestableHumanReporter { use_color: false };
let issues = vec![
create_sample_issue(IssueType::TrailingSpace, Some(5), "Trailing space"),
create_sample_issue(IssueType::MissingNewline, None, "Missing newline"),
];
let results = vec![create_sample_check_result("config.toml", issues)];
let output = reporter.report_to_string(&results);
assert!(verification::verify_human_output(
&output,
&[
"✗ config.toml",
"Line 5: Trailing space",
"Missing newline",
"Found 2 issues in 1 files"
]
));
}
#[test]
fn example_test_file_utilities() {
let test_files = vec![
TestFile::with_issues("bad.txt", "content without newline"),
TestFile::clean("good.txt", "content with proper ending"),
TestFile::new("mixed.txt", "line 1\nline 2 \nline 3\n", true), ];
let (_temp_dir, file_paths) = setup_integration_test_environment(&test_files);
assert_eq!(file_paths.len(), 3);
for path in &file_paths {
assert!(path.exists());
}
let bad_content = std::fs::read_to_string(&file_paths[0]).unwrap();
assert_eq!(bad_content, "content without newline");
assert!(!bad_content.ends_with('\n'));
let good_content = std::fs::read_to_string(&file_paths[1]).unwrap();
assert_eq!(good_content, "content with proper ending\n");
assert!(good_content.ends_with('\n'));
}
#[test]
fn example_with_test_files() {
with_test_files(
&[
("test1.txt", "content1"),
("test2.txt", "content2\n"),
("test3.txt", "content3 "), ],
|_temp_dir, paths| {
assert_eq!(paths.len(), 3);
for path in paths {
assert!(path.exists());
}
let content3 = std::fs::read_to_string(&paths[2]).unwrap();
assert!(content3.ends_with(' '));
},
);
}
#[test]
fn example_comprehensive_reporter_test() {
let json_reporter = TestableJsonReporter;
let github_reporter = TestableGitHubReporter;
let human_reporter = TestableHumanReporter { use_color: true };
let results = vec![
create_sample_check_result(
"src/main.rs",
vec![create_sample_issue(
IssueType::MissingNewline,
None,
"Missing newline at EOF",
)],
),
create_sample_check_result(
"src/lib.rs",
vec![
create_sample_issue(
IssueType::TrailingSpace,
Some(10),
"Trailing space on line 10",
),
create_sample_issue(
IssueType::TrailingSpace,
Some(25),
"Trailing space on line 25",
),
],
),
create_sample_check_result(
"tests/mod.rs",
vec![create_sample_issue(
IssueType::MultipleNewlines,
Some(50),
"Multiple trailing newlines",
)],
),
create_sample_check_result("README.md", vec![]), ];
let json_output = json_reporter.report_to_string(&results);
let github_output = github_reporter.report_to_string(&results);
let human_output = human_reporter.report_to_string(&results);
assert!(verification::is_valid_json(&json_output));
assert!(verification::verify_json_output(&json_output, 4, 4)); assert_eq!(verification::count_files_in_json(&json_output), Some(4));
assert_eq!(verification::count_issues_in_json(&json_output), Some(4));
let expected_github_patterns = &[
"::error file=src/main.rs::Missing newline at EOF",
"::error file=src/lib.rs,line=10::Trailing space on line 10",
"::error file=src/lib.rs,line=25::Trailing space on line 25",
"::error file=tests/mod.rs,line=50::Multiple trailing newlines",
];
assert!(verification::verify_github_output(
&github_output,
expected_github_patterns
));
let expected_human_patterns = &[
"Found 4 issues in 3 files",
"Files checked: 4",
"src/main.rs",
"src/lib.rs",
"tests/mod.rs",
];
assert!(verification::verify_human_output(
&human_output,
expected_human_patterns
));
assert!(!human_output.contains("README.md"));
}