#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
#[test]
fn test_detect_unwrap() {
let detector = RustDefectDetector::new();
let code = r#"
fn main() {
let x = Some(42).unwrap();
}
"#;
let path = PathBuf::from("src/main.rs");
let defects = detector.detect(code, &path);
assert_eq!(defects.len(), 1);
assert_eq!(defects[0].id, "RUST-UNWRAP-001");
assert_eq!(defects[0].severity, Severity::Critical);
assert_eq!(defects[0].instances.len(), 1);
}
#[test]
fn test_excludes_doc_comments() {
let detector = RustDefectDetector::new();
let code = r#"
/// # Examples
///
/// ```
/// let result = something.unwrap();
/// ```
pub fn something() -> Option<i32> {
Some(42)
}
//! Module doc with example
//! let x = foo.unwrap();
"#;
let path = PathBuf::from("src/lib.rs");
let defects = detector.detect(code, &path);
assert_eq!(
defects.len(),
0,
"Doc comments should be excluded (issue #131)"
);
}
#[test]
fn test_excludes_test_code() {
let detector = RustDefectDetector::new();
let code = r#"
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
fn test_foo() {
let x = Some(42).unwrap();
}
}
"#;
let path = PathBuf::from("src/lib.rs");
let defects = detector.detect(code, &path);
assert_eq!(defects.len(), 0, "Test code should be excluded");
}
#[test]
fn test_excludes_test_directory() {
let detector = RustDefectDetector::new();
let code = r#"
fn test_helper() {
let x = Some(42).expect("internal error");
}
"#;
let path = PathBuf::from("tests/integration_test.rs");
let defects = detector.detect(code, &path);
assert_eq!(defects.len(), 0, "Tests directory should be excluded");
}
#[test]
fn test_excludes_examples_directory() {
let detector = RustDefectDetector::new();
let code = r#"
fn main() {
let x = Some(42).expect("internal error");
}
"#;
for path in &[
"examples/demo.rs",
"./examples/demo.rs",
"server/examples/demo.rs",
] {
let path = PathBuf::from(path);
let defects = detector.detect(code, &path);
assert_eq!(
defects.len(),
0,
"Examples directory should be excluded: {}",
path.display()
);
}
}
#[test]
fn test_excludes_fuzz_directory() {
let detector = RustDefectDetector::new();
let code = r#"
fn fuzz_target() {
let x = Some(42).expect("internal error");
}
"#;
for path in &[
"fuzz/fuzz_targets/target.rs",
"./fuzz/fuzz_targets/target.rs",
"server/fuzz/target.rs",
] {
let path = PathBuf::from(path);
let defects = detector.detect(code, &path);
assert_eq!(
defects.len(),
0,
"Fuzz directory should be excluded: {}",
path.display()
);
}
}
}