cargo_rust_unused/
lib.rs

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        // Create a test project structure
18        fs::create_dir(project_dir.join("src"))?;
19
20        // Create Cargo.toml with real crates
21        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        // Create src/main.rs with unused items
36        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        // Verify unused dependencies
63        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        // Verify unused functions
72        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        // Verify unused modules
81        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        // Verify used items are not reported
90        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}