1pub mod analyzer;
2pub mod dependencies;
3pub mod reporter;
4pub mod scanner;
5
6#[cfg(test)]
7mod tests {
8 use super::*;
9 use std::fs;
10 use tempfile::TempDir;
11
12 #[test]
13 fn test_analyzer_finds_unused_items() -> anyhow::Result<()> {
14 let temp_dir = TempDir::new()?;
15 let project_dir = temp_dir.path();
16
17 fs::create_dir(project_dir.join("src"))?;
19
20 fs::write(
22 project_dir.join("Cargo.toml"),
23 r#"
24[package]
25name = "test-project"
26version = "0.1.0"
27edition = "2021"
28
29[dependencies]
30serde = "1.0"
31log = "0.4"
32"#,
33 )?;
34
35 fs::write(
37 project_dir.join("src").join("main.rs"),
38 r#"
39use serde; // This dependency is used
40
41fn used_function() -> &'static str {
42 "This function is used"
43}
44
45fn unused_function() -> &'static str {
46 "This function is never called"
47}
48
49mod unused_module {
50 pub fn unused_fn() {}
51}
52
53fn main() {
54 let _ = used_function(); // Explicit function call
55}
56"#,
57 )?;
58
59 let mut analyzer = analyzer::CodeAnalyzer::new();
60 analyzer.analyze_project(project_dir)?;
61
62 assert!(
64 analyzer
65 .report
66 .unused_dependencies
67 .contains(&"log".to_string()),
68 "Expected 'log' to be detected as unused dependency"
69 );
70
71 assert!(
73 analyzer
74 .report
75 .unused_functions
76 .contains(&"fn unused_function".to_string()),
77 "Expected 'unused_function' to be detected as unused"
78 );
79
80 assert!(
82 analyzer
83 .report
84 .unused_modules
85 .contains(&"mod unused_module".to_string()),
86 "Expected 'unused_module' to be detected as unused"
87 );
88
89 assert!(
91 !analyzer
92 .report
93 .unused_functions
94 .contains(&"fn used_function".to_string()),
95 "Expected 'used_function' to be detected as used"
96 );
97
98 Ok(())
99 }
100}