use crate::io::file_manager::RealFileBufferManager;
use crate::mcp_server::tools::lsp_helpers::{
examples::get_examples, symbol_resolution::get_matching_symbol,
};
use crate::project::{ProjectScanner, WorkspaceSession};
use crate::test_utils::{DEFAULT_INDEXING_TIMEOUT, integration::TestProject};
use tracing::info;
#[cfg(feature = "clangd-integration-tests")]
#[tokio::test]
async fn test_examples_class_usage() {
let test_project = TestProject::new().await.unwrap();
test_project.cmake_configure().await.unwrap();
let scanner = ProjectScanner::with_default_providers();
let workspace = scanner
.scan_project(&test_project.project_root, 3, None)
.expect("Failed to scan test project");
let clangd_path = crate::test_utils::get_test_clangd_path();
let workspace_session = WorkspaceSession::new(workspace.clone(), clangd_path)
.expect("Failed to create workspace session");
let component_session = workspace_session
.get_component_session(test_project.build_dir.clone())
.await
.unwrap();
component_session
.ensure_indexed(DEFAULT_INDEXING_TIMEOUT)
.await
.unwrap();
let mut file_buffer_manager = RealFileBufferManager::new_real();
let symbol = get_matching_symbol("Math", &component_session)
.await
.expect("Failed to find Math symbol");
let symbol_location = &symbol.location;
let examples = get_examples(&component_session, symbol_location, None)
.await
.expect("Failed to get examples");
assert!(!examples.is_empty());
info!("Found {} usage examples for Math class", examples.len());
for (i, example) in examples.iter().enumerate() {
let buffer = file_buffer_manager
.get_buffer(&example.file_path)
.expect("Failed to get file buffer");
let line_content = buffer
.get_line(example.range.start.line)
.expect("Failed to get line content");
info!(
"Example {}: {} at {}:{}",
i + 1,
line_content.trim(),
example.file_path.display(),
example.range.start.line
);
assert!(line_content.contains("Math"));
}
}
#[cfg(feature = "clangd-integration-tests")]
#[tokio::test]
async fn test_examples_function_usage() {
let test_project = TestProject::new().await.unwrap();
test_project.cmake_configure().await.unwrap();
let scanner = ProjectScanner::with_default_providers();
let workspace = scanner
.scan_project(&test_project.project_root, 3, None)
.expect("Failed to scan test project");
let clangd_path = crate::test_utils::get_test_clangd_path();
let workspace_session = WorkspaceSession::new(workspace.clone(), clangd_path)
.expect("Failed to create workspace session");
let component_session = workspace_session
.get_component_session(test_project.build_dir.clone())
.await
.unwrap();
component_session
.ensure_indexed(DEFAULT_INDEXING_TIMEOUT)
.await
.unwrap();
let mut file_buffer_manager = RealFileBufferManager::new_real();
let symbol = get_matching_symbol("factorial", &component_session)
.await
.expect("Failed to find factorial symbol");
let symbol_location = &symbol.location;
let examples = get_examples(&component_session, symbol_location, None)
.await
.expect("Failed to get examples");
assert!(!examples.is_empty());
info!(
"Found {} usage examples for factorial function",
examples.len()
);
for (i, example) in examples.iter().enumerate() {
let buffer = file_buffer_manager
.get_buffer(&example.file_path)
.expect("Failed to get file buffer");
let line_content = buffer
.get_line(example.range.start.line)
.expect("Failed to get line content");
info!(
"Example {}: {} at {}:{}",
i + 1,
line_content.trim(),
example.file_path.display(),
example.range.start.line
);
assert!(line_content.contains("factorial"));
}
}
#[cfg(feature = "clangd-integration-tests")]
#[tokio::test]
async fn test_examples_with_max_limit() {
let test_project = TestProject::new().await.unwrap();
test_project.cmake_configure().await.unwrap();
let scanner = ProjectScanner::with_default_providers();
let workspace = scanner
.scan_project(&test_project.project_root, 3, None)
.expect("Failed to scan test project");
let clangd_path = crate::test_utils::get_test_clangd_path();
let workspace_session = WorkspaceSession::new(workspace.clone(), clangd_path)
.expect("Failed to create workspace session");
let component_session = workspace_session
.get_component_session(test_project.build_dir.clone())
.await
.unwrap();
component_session
.ensure_indexed(DEFAULT_INDEXING_TIMEOUT)
.await
.unwrap();
let mut file_buffer_manager = RealFileBufferManager::new_real();
let symbol = get_matching_symbol("Math", &component_session)
.await
.expect("Failed to find Math symbol");
let symbol_location = &symbol.location;
const MAX_EXAMPLES: u32 = 2;
let examples = get_examples(&component_session, symbol_location, Some(MAX_EXAMPLES))
.await
.expect("Failed to get examples");
assert!(!examples.is_empty());
assert!(
examples.len() <= MAX_EXAMPLES as usize,
"Should have at most {} examples, but got {}",
MAX_EXAMPLES,
examples.len()
);
info!(
"Found {} usage examples for Math class (max was {})",
examples.len(),
MAX_EXAMPLES
);
for (i, example) in examples.iter().enumerate() {
let buffer = file_buffer_manager
.get_buffer(&example.file_path)
.expect("Failed to get file buffer");
let line_content = buffer
.get_line(example.range.start.line)
.expect("Failed to get line content");
info!(
"Example {}: {} at {}:{}",
i + 1,
line_content.trim(),
example.file_path.display(),
example.range.start.line
);
assert!(line_content.contains("Math"));
}
}
#[cfg(feature = "clangd-integration-tests")]
#[tokio::test]
async fn test_examples_method_usage() {
let test_project = TestProject::new().await.unwrap();
test_project.cmake_configure().await.unwrap();
let scanner = ProjectScanner::with_default_providers();
let workspace = scanner
.scan_project(&test_project.project_root, 3, None)
.expect("Failed to scan test project");
let clangd_path = crate::test_utils::get_test_clangd_path();
let workspace_session = WorkspaceSession::new(workspace.clone(), clangd_path)
.expect("Failed to create workspace session");
let component_session = workspace_session
.get_component_session(test_project.build_dir.clone())
.await
.unwrap();
component_session
.ensure_indexed(DEFAULT_INDEXING_TIMEOUT)
.await
.unwrap();
let mut file_buffer_manager = RealFileBufferManager::new_real();
let symbol = get_matching_symbol("Math::Complex::add", &component_session)
.await
.expect("Failed to find add method symbol");
let symbol_location = &symbol.location;
let examples = get_examples(&component_session, symbol_location, Some(3))
.await
.expect("Failed to get examples");
assert!(!examples.is_empty());
info!("Found {} usage examples for add method", examples.len());
for (i, example) in examples.iter().enumerate() {
let buffer = file_buffer_manager
.get_buffer(&example.file_path)
.expect("Failed to get file buffer");
let line_content = buffer
.get_line(example.range.start.line)
.expect("Failed to get line content");
info!(
"Example {}: {} at {}:{}",
i + 1,
line_content.trim(),
example.file_path.display(),
example.range.start.line
);
assert!(line_content.contains("add"));
}
}