use probe_code::search::elastic_query::parse_query_test as parse_query;
use probe_code::search::query::{create_query_plan, create_structured_patterns};
use probe_code::search::tokenization::{load_vocabulary, split_camel_case, split_compound_word};
#[test]
fn test_camel_case_splitting() {
let input = "RPCStorageHandler";
let camel_parts = split_camel_case(input);
println!("Direct camelCase split of '{input}': {camel_parts:?}");
assert!(camel_parts.contains(&"rpc".to_string()));
assert!(camel_parts.contains(&"storage".to_string()));
assert!(camel_parts.contains(&"handler".to_string()));
}
#[test]
fn test_compound_word_splitting() {
let vocab = load_vocabulary();
let mut enhanced_vocab = vocab.clone();
for term in [
"rpc", "storage", "handler", "client", "server", "api", "service", "http", "handler",
] {
enhanced_vocab.insert(term.to_string());
}
let input = "httpHandler";
let compound_parts = split_compound_word(input, &enhanced_vocab);
println!("Compound split of '{input}': {compound_parts:?}");
assert!(compound_parts.contains(&"http".to_string()));
assert!(compound_parts.contains(&"Handler".to_string()));
}
#[test]
fn test_query_preprocessing() {
let query = "RPCStorageHandler";
let plan = create_query_plan(query, false).expect("Failed to create query plan");
println!("Query plan for '{query}': {plan:?}");
let term_strings: Vec<String> = plan.term_indices.keys().cloned().collect();
assert!(
term_strings.contains(&"rpc".to_string())
|| term_strings.contains(&"storage".to_string())
|| term_strings.contains(&"handler".to_string()),
"Expected at least one of 'rpc', 'storage', or 'handler' in {term_strings:?}"
);
}
#[test]
fn test_pattern_generation() {
let query = "RPCStorageHandler";
let plan = create_query_plan(query, false).expect("Failed to create query plan");
let patterns = create_structured_patterns(&plan);
println!("Generated patterns:");
for (i, (pattern, indices)) in patterns.iter().enumerate() {
println!("Pattern {i}: {pattern} - Indices: {indices:?}");
}
let term_indices = &plan.term_indices;
for (term, &idx) in term_indices {
if !plan.excluded_terms.contains(term) {
let has_pattern = patterns.iter().any(|(_, indices)| indices.contains(&idx));
assert!(
has_pattern,
"No pattern found for term '{term}' at index {idx}"
);
}
}
for (pattern, _) in &patterns {
assert!(
regex::Regex::new(pattern).is_ok(),
"Invalid regex pattern: {pattern}"
);
}
}
#[test]
fn test_multiple_word_query() {
let query = "ip whitelist";
let plan = create_query_plan(query, false).expect("Failed to create query plan");
println!("Query plan for '{query}': {plan:?}");
let term_strings: Vec<String> = plan.term_indices.keys().cloned().collect();
assert!(term_strings.contains(&"ip".to_string()));
let has_white_and_list =
term_strings.contains(&"white".to_string()) && term_strings.contains(&"list".to_string());
let has_whitelist = term_strings.contains(&"whitelist".to_string());
assert!(
has_white_and_list || has_whitelist,
"Expected either both 'white' and 'list', or 'whitelist' in {term_strings:?}"
);
}
#[test]
fn test_underscore_handling() {
use probe_code::search::elastic_query;
let query = "keyword_underscore";
let plan = create_query_plan(query, false).expect("Failed to create query plan");
println!("Query plan for '{query}': {plan:?}");
let term_strings: Vec<String> = plan.term_indices.keys().cloned().collect();
let has_tokenized_parts = term_strings.contains(&"key".to_string())
|| term_strings.contains(&"word".to_string())
|| term_strings.contains(&"score".to_string());
assert!(
has_tokenized_parts,
"Expected tokenized parts of 'keyword_underscore' in {term_strings:?}"
);
if let elastic_query::Expr::Term { keywords, .. } = &plan.ast {
assert!(
keywords.contains(&"key".to_string()),
"Expected 'key' in keywords: {keywords:?}"
);
assert!(
keywords.contains(&"word".to_string()),
"Expected 'word' in keywords: {keywords:?}"
);
assert!(
keywords.contains(&"score".to_string()),
"Expected 'score' in keywords: {keywords:?}"
);
} else {
panic!("Expected Term expression");
}
}
#[test]
fn test_underscore_in_elastic_query() {
use probe_code::search::elastic_query;
let query = "keyword_underscore";
let ast = parse_query(query).unwrap();
if let elastic_query::Expr::Term { keywords, .. } = ast {
assert!(
keywords.contains(&"key".to_string()),
"Expected 'key' in keywords: {keywords:?}"
);
assert!(
keywords.contains(&"word".to_string()),
"Expected 'word' in keywords: {keywords:?}"
);
assert!(
keywords.contains(&"score".to_string()),
"Expected 'score' in keywords: {keywords:?}"
);
} else {
panic!("Expected Term expression");
}
}