use once_cell::sync::Lazy;
use regex::Regex;
pub const JAVA_TEST_FILE_PATTERN: &str = r"(?:^|/)(?:src/test/|src/sit/|tests?/).*\.java$|(?:Test|Tests)\.java$|(?:[a-z0-9]|^|/)S?IT\.java$";
static JAVA_TEST_FILE_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(JAVA_TEST_FILE_PATTERN).expect("java-test regex is valid"));
pub fn is_java_test_file(path: &str) -> bool {
if path.is_empty() {
return false;
}
let normalized = path.replace('\\', "/");
JAVA_TEST_FILE_REGEX.is_match(&normalized)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn matches_maven_junit_sit_layouts() {
for p in [
"src/test/java/com/x/FooTest.java",
"a/b/BarTests.java",
"svc/FooIT.java",
"src/sit/java/x/BazSIT.java",
"tests/x/anything.java",
"deep/tests/x/y/z.java",
] {
assert!(is_java_test_file(p), "should match: {p}");
}
for p in [
"src/main/java/com/x/Foo.java",
"README.md",
"src/x/Helper.java",
"",
"notatest.js",
] {
assert!(!is_java_test_file(p), "should NOT match: {p}");
}
}
#[test]
fn normalizes_windows_backslashes() {
assert!(is_java_test_file(r"src\test\java\com\x\FooTest.java"));
}
#[test]
fn a_word_merely_ending_in_it_is_not_an_integration_test() {
for p in [
"EXIT.java",
"AUDIT.java",
"UNIT.java",
"EDIT.java",
"WAIT.java",
"DEPOSIT.java",
"TRANSIT.java",
"ToolKIT.java",
"LoggerINIT.java",
] {
assert!(!is_java_test_file(p), "false positive: {p}");
}
}
#[test]
fn the_pascal_case_spellings_were_never_the_defect() {
for p in ["Exit.java", "Audit.java", "Unit.java", "Deposit.java"] {
assert!(!is_java_test_file(p), "false positive: {p}");
}
}
#[test]
fn real_integration_tests_still_match_across_the_boundary_forms() {
for p in [
"FooIT.java",
"Foo2IT.java",
"BarSIT.java",
"IT.java",
"svc/IT.java",
"src/sit/java/x/BazSIT.java",
] {
assert!(is_java_test_file(p), "false negative: {p}");
}
}
#[test]
fn the_test_suffix_needs_no_boundary_because_capital_t_is_one() {
for p in [
"Latest.java",
"Contest.java",
"Manifest.java",
"Protest.java",
] {
assert!(!is_java_test_file(p), "false positive: {p}");
}
for p in [
"BazTest.java",
"GreatestTest.java",
"QuxTests.java",
"Test.java",
] {
assert!(is_java_test_file(p), "false negative: {p}");
}
}
}