use cs::{run_trace, TraceDirection, TraceQuery};
use std::fs::File;
use std::io::Write;
use tempfile::TempDir;
#[test]
fn test_cross_case_function_search() {
let temp_dir = TempDir::new().unwrap();
let base_dir = temp_dir.path().to_path_buf();
let ruby_file = base_dir.join("user_service.rb");
let mut f = File::create(&ruby_file).unwrap();
writeln!(f, "def process_user_data(user)").unwrap();
writeln!(f, " # implementation").unwrap();
writeln!(f, "end").unwrap();
let js_file = base_dir.join("api_client.js");
let mut f = File::create(&js_file).unwrap();
writeln!(f, "function syncUsers() {{").unwrap();
writeln!(f, " api.processUserData(user);").unwrap();
writeln!(f, "}}").unwrap();
let py_file = base_dir.join("script.py");
let mut f = File::create(&py_file).unwrap();
writeln!(f, "def main():").unwrap();
writeln!(f, " service.process_user_data(u)").unwrap();
let query = TraceQuery::new("processUserData".to_string(), TraceDirection::Backward, 1)
.with_base_dir(base_dir.clone());
let result = run_trace(query).expect("Trace failed");
assert!(result.is_some(), "Should find function definition");
let tree = result.unwrap();
let root = &tree.root;
assert_eq!(root.def.name, "process_user_data");
assert_eq!(root.def.file, ruby_file);
assert_eq!(root.children.len(), 2, "Should find 2 callers");
let caller_names: Vec<String> = root.children.iter().map(|c| c.def.name.clone()).collect();
assert!(
caller_names.contains(&"syncUsers".to_string()),
"Should find JS caller"
);
assert!(
caller_names.contains(&"main".to_string()),
"Should find Python caller"
);
let query = TraceQuery::new("process_user_data".to_string(), TraceDirection::Backward, 1)
.with_base_dir(base_dir);
let result = run_trace(query).expect("Trace failed");
assert!(result.is_some(), "Should find function definition");
let tree = result.unwrap();
assert_eq!(tree.root.def.name, "process_user_data");
assert_eq!(tree.root.children.len(), 2);
}