use perl_lsp_diagnostics::{DiagnosticSeverity, DiagnosticTag, detect_dead_code};
use perl_parser_core::position::LineStartsCache;
use perl_workspace_index::workspace_index::WorkspaceIndex;
#[test]
fn test_dead_code_detection() -> Result<(), Box<dyn std::error::Error>> {
let index = WorkspaceIndex::new();
index.index_file_str("file:///main.pl", "use A;\nA::bar();\n")?;
index.index_file_str("file:///A.pm", "package A;\nsub foo { return 1; }\nsub bar { 1; }\n")?;
let source = "package A;\nsub foo { return 1; }\nsub bar { 1; }\n";
let line_index = LineStartsCache::new(source);
let diagnostics = detect_dead_code(&index, "file:///A.pm", source, &line_index);
assert!(
diagnostics
.iter()
.any(|d| d.message.contains("foo") && d.severity == DiagnosticSeverity::Hint),
"Should detect unused subroutine 'foo'"
);
assert!(
diagnostics.iter().any(|d| d.tags.contains(&DiagnosticTag::Unnecessary)),
"Dead code should be tagged as unnecessary"
);
Ok(())
}
#[test]
fn test_dead_code_only_in_current_document() -> Result<(), Box<dyn std::error::Error>> {
let index = WorkspaceIndex::new();
index.index_file_str("file:///main.pl", "sub main_unused { 1; }\n")?;
index.index_file_str("file:///A.pm", "package A;\nsub unused { 1; }\n")?;
let main_source = "sub main_unused { 1; }\n";
let line_index = LineStartsCache::new(main_source);
let diagnostics = detect_dead_code(&index, "file:///main.pl", main_source, &line_index);
assert!(diagnostics.iter().any(|d| d.message.contains("main_unused")));
assert!(!diagnostics.iter().any(|d| d.message.contains("unused") && d.message.contains("A::")));
Ok(())
}