use pmat::agents::registry::AgentRegistry;
use pmat::mcp_integration::polyglot_tools::{LanguageBoundaryTool, PolyglotAnalysisTool};
use pmat::mcp_integration::McpTool;
use serde_json::json;
use std::fs;
use std::sync::Arc;
use tempfile::tempdir;
#[test]
fn test_polyglot_analysis_tool_metadata() {
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let metadata = tool.metadata();
assert_eq!(metadata.name, "analyze_polyglot");
assert!(!metadata.description.is_empty());
assert!(metadata.input_schema["properties"]["path"].is_object());
assert!(metadata.input_schema["properties"]["languages"].is_object());
assert!(metadata.input_schema["properties"]["max_depth"].is_object());
assert!(metadata.input_schema["properties"]["include_graph"].is_object());
assert_eq!(metadata.input_schema["required"], json!(["path"]));
}
#[tokio::test]
async fn test_polyglot_missing_path_parameter() {
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"languages": ["java"]
});
let result = tool.execute(params).await;
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.message.contains("path"));
}
#[tokio::test]
async fn test_polyglot_invalid_directory_path() {
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": "/nonexistent/directory/path",
"languages": ["java"]
});
let result = tool.execute(params).await;
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.message.contains("Invalid directory path") || err.message.contains("not found"));
}
#[tokio::test]
async fn test_polyglot_path_is_file_not_directory() {
let temp_dir = tempdir().unwrap();
let file_path = temp_dir.path().join("file.txt");
fs::write(&file_path, "test").unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": file_path.to_str().unwrap()
});
let result = tool.execute(params).await;
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.message.contains("directory") || err.message.contains("Invalid"));
}
#[tokio::test]
async fn test_polyglot_valid_languages_parameter() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"languages": ["java", "kotlin", "scala"]
});
let result = tool.execute(params).await;
match result {
Ok(_) => {}
Err(e) => {
assert!(!e.message.to_lowercase().contains("language"));
}
}
}
#[tokio::test]
async fn test_polyglot_empty_languages_array() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"languages": []
});
let result = tool.execute(params).await;
match result {
Ok(_) | Err(_) => {}
}
}
#[tokio::test]
async fn test_polyglot_invalid_language_name() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"languages": ["nonexistent_language", "java"]
});
let result = tool.execute(params).await;
match result {
Ok(_) | Err(_) => {}
}
}
#[tokio::test]
async fn test_polyglot_max_depth_parameter() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"max_depth": 5
});
let result = tool.execute(params).await;
match result {
Ok(_) | Err(_) => {}
}
}
#[tokio::test]
async fn test_polyglot_include_graph_true() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"include_graph": true
});
let result = tool.execute(params).await;
if let Ok(output) = result {
assert!(output.is_object());
}
}
#[tokio::test]
async fn test_polyglot_include_graph_false() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"include_graph": false
});
let result = tool.execute(params).await;
if let Ok(output) = result {
assert!(output.is_object());
}
}
#[test]
fn test_language_boundary_tool_metadata() {
let registry = Arc::new(AgentRegistry::new());
let tool = LanguageBoundaryTool::new(registry);
let metadata = tool.metadata();
assert_eq!(metadata.name, "analyze_language_boundaries");
assert!(!metadata.description.is_empty());
assert!(metadata.input_schema["properties"]["path"].is_object());
}
#[tokio::test]
async fn test_language_boundary_missing_path() {
let registry = Arc::new(AgentRegistry::new());
let tool = LanguageBoundaryTool::new(registry);
let params = json!({
"source_language": "java"
});
let result = tool.execute(params).await;
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.message.contains("path"));
}
#[tokio::test]
async fn test_language_boundary_invalid_path() {
let registry = Arc::new(AgentRegistry::new());
let tool = LanguageBoundaryTool::new(registry);
let params = json!({
"path": "/invalid/path/to/nowhere"
});
let result = tool.execute(params).await;
assert!(result.is_err());
}
#[tokio::test]
async fn test_polyglot_empty_directory() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap()
});
let result = tool.execute(params).await;
match result {
Ok(output) => {
assert!(output.is_object());
}
Err(_) => {
}
}
}
#[tokio::test]
async fn test_polyglot_max_depth_zero() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"max_depth": 0
});
let result = tool.execute(params).await;
match result {
Ok(_) | Err(_) => {}
}
}
#[tokio::test]
async fn test_polyglot_very_large_max_depth() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"max_depth": 1000
});
let result = tool.execute(params).await;
match result {
Ok(_) | Err(_) => {}
}
}
#[tokio::test]
async fn test_polyglot_with_java_files() {
let temp_dir = tempdir().unwrap();
let java_file = temp_dir.path().join("Main.java");
fs::write(
&java_file,
r#"
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
}
}
"#,
)
.unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap(),
"languages": ["java"]
});
let result = tool.execute(params).await;
if let Ok(output) = result {
assert!(output.is_object());
}
}
#[tokio::test]
async fn test_polyglot_with_mixed_languages() {
let temp_dir = tempdir().unwrap();
let java_file = temp_dir.path().join("Main.java");
fs::write(&java_file, "public class Main {}").unwrap();
let kotlin_file = temp_dir.path().join("App.kt");
fs::write(&kotlin_file, "fun main() {}").unwrap();
let ts_file = temp_dir.path().join("index.ts");
fs::write(&ts_file, "function main() {}").unwrap();
let registry = Arc::new(AgentRegistry::new());
let tool = PolyglotAnalysisTool::new(registry);
let params = json!({
"path": temp_dir.path().to_str().unwrap()
});
let result = tool.execute(params).await;
if let Ok(output) = result {
assert!(output.is_object());
}
}
#[tokio::test]
async fn test_polyglot_concurrent_executions() {
let temp_dir = tempdir().unwrap();
let registry = Arc::new(AgentRegistry::new());
let mut handles = vec![];
for _ in 0..5 {
let tool = PolyglotAnalysisTool::new(registry.clone());
let path = temp_dir.path().to_str().unwrap().to_string();
let handle = tokio::spawn(async move {
let params = json!({
"path": path
});
tool.execute(params).await
});
handles.push(handle);
}
for handle in handles {
let _ = handle.await;
}
}