#[test]
fn test_query_empty_query_browses_all() {
let index = build_test_index();
let result = index.query("", QueryOptions::default());
assert!(result.is_ok(), "Empty query should return browse results");
let results = result.unwrap();
assert!(!results.is_empty());
}
#[test]
fn test_query_basic_search() {
let index = build_test_index();
let results = index
.query(
"error handling",
QueryOptions {
limit: 5,
..Default::default()
},
)
.unwrap();
assert!(!results.is_empty());
assert_eq!(results[0].function_name, "handle_error");
}
#[test]
fn test_query_with_file_scope() {
let index = build_test_index();
let results = index
.query(
"file:utils.rs validate",
QueryOptions {
limit: 5,
..Default::default()
},
)
.unwrap();
assert!(!results.is_empty());
for r in &results {
assert!(
r.file_path.contains("utils.rs"),
"unexpected file: {}",
r.file_path
);
}
}
#[test]
fn test_query_with_fn_scope() {
let index = build_test_index();
let results = index
.query(
"fn:handle_ request",
QueryOptions {
limit: 5,
..Default::default()
},
)
.unwrap();
assert!(!results.is_empty());
for r in &results {
assert!(
r.function_name.starts_with("handle_"),
"unexpected fn: {}",
r.function_name
);
}
}
#[test]
fn test_query_with_both_scopes() {
let index = build_test_index();
let results = index
.query(
"file:handler.rs fn:handle_ error",
QueryOptions {
limit: 5,
..Default::default()
},
)
.unwrap();
assert!(!results.is_empty());
for r in &results {
assert!(r.file_path.contains("handler.rs"));
assert!(r.function_name.starts_with("handle_"));
}
}
#[test]
fn test_query_grade_filter() {
let index = build_test_index();
let results = index
.query(
"handle",
QueryOptions {
limit: 10,
min_grade: Some("A".to_string()),
..Default::default()
},
)
.unwrap();
for r in &results {
assert_eq!(r.tdg_grade, "A", "expected A grade, got {}", r.tdg_grade);
}
}
#[test]
fn test_query_complexity_filter() {
let index = build_test_index();
let results = index
.query(
"handle",
QueryOptions {
limit: 10,
max_complexity: Some(3),
..Default::default()
},
)
.unwrap();
for r in &results {
assert!(
r.complexity <= 3,
"complexity {} exceeds max 3",
r.complexity
);
}
}
#[test]
fn test_query_language_filter() {
let index = build_test_index();
let results = index
.query(
"validate",
QueryOptions {
limit: 10,
language: Some("Rust".to_string()),
..Default::default()
},
)
.unwrap();
for r in &results {
assert_eq!(r.language, "Rust");
}
}
#[test]
fn test_query_path_pattern_filter() {
let index = build_test_index();
let results = index
.query(
"handle",
QueryOptions {
limit: 10,
path_pattern: Some("src/".to_string()),
..Default::default()
},
)
.unwrap();
for r in &results {
assert!(r.file_path.contains("src/"));
}
}
#[test]
fn test_query_loc_filter() {
let index = build_test_index();
let results = index
.query(
"handle",
QueryOptions {
limit: 10,
max_loc: Some(5),
..Default::default()
},
)
.unwrap();
for r in &results {
assert!(r.loc <= 5, "loc {} exceeds max 5", r.loc);
}
}
#[test]
fn test_query_test_function_demotion() {
let index = build_test_index();
let results = index
.query(
"error handling",
QueryOptions {
limit: 10,
..Default::default()
},
)
.unwrap();
let handle_pos = results
.iter()
.position(|r| r.function_name == "handle_error");
let test_pos = results
.iter()
.position(|r| r.function_name == "test_error_handling");
if let (Some(h), Some(t)) = (handle_pos, test_pos) {
assert!(h < t, "production fn should rank higher than test fn");
}
}
#[test]
fn test_query_generic_name_demotion() {
let index = build_test_index();
let results = index
.query(
"new",
QueryOptions {
limit: 10,
..Default::default()
},
)
.unwrap();
if let Some(new_result) = results.iter().find(|r| r.function_name == "new") {
assert!(new_result.relevance_score < 1.0);
}
}
#[test]
fn test_query_include_source() {
let index = build_test_index();
let results = index
.query(
"validate",
QueryOptions {
limit: 1,
include_source: true,
..Default::default()
},
)
.unwrap();
assert!(!results.is_empty());
assert!(results[0].source.is_some());
}
#[test]
fn test_query_zero_limit_defaults_to_10() {
let index = build_test_index();
let results = index
.query(
"handle",
QueryOptions {
limit: 0,
..Default::default()
},
)
.unwrap();
assert!(results.len() <= 10);
}
#[test]
fn test_query_results_have_calls() {
let index = build_test_index();
let results = index
.query(
"handle_request",
QueryOptions {
limit: 1,
..Default::default()
},
)
.unwrap();
if let Some(r) = results.iter().find(|r| r.function_name == "handle_request") {
assert!(!r.calls.is_empty(), "expected calls to be populated");
}
}
#[test]
fn test_get_function() {
let index = build_test_index();
let result = index.get_function("src/handler.rs", "handle_error");
assert!(result.is_some());
let r = result.unwrap();
assert_eq!(r.function_name, "handle_error");
assert_eq!(r.file_path, "src/handler.rs");
assert!(r.source.is_some()); }
#[test]
fn test_get_function_not_found() {
let index = build_test_index();
let result = index.get_function("nonexistent.rs", "foo");
assert!(result.is_none());
}
#[test]
fn test_find_similar() {
let index = build_test_index();
let results = index
.find_similar("src/handler.rs", "handle_error", 3)
.unwrap();
assert!(!results.is_empty());
assert!(results
.iter()
.all(|r| !(r.file_path == "src/handler.rs" && r.function_name == "handle_error")));
}
#[test]
fn test_find_similar_not_found() {
let index = build_test_index();
let result = index.find_similar("nonexistent.rs", "foo", 3);
assert!(result.is_err());
}
#[test]
fn test_dedup_ordered() {
use super::types::dedup_ordered;
let items = vec!["a", "b", "a", "c", "b", "d"];
let result = dedup_ordered(&items);
assert_eq!(result, vec!["a", "b", "c", "d"]);
}
#[test]
fn test_dedup_ordered_empty() {
use super::types::dedup_ordered;
let items: Vec<&str> = vec![];
let result = dedup_ordered(&items);
assert!(result.is_empty());
}
#[test]
fn test_is_test_function() {
let mut entry = create_test_entry("test_something", 1, 0.5);
assert!(is_test_function(&entry));
entry.function_name = "handle_request".to_string();
entry.file_path = "src/handler.rs".to_string();
assert!(!is_test_function(&entry));
entry.file_path = "tests/integration.rs".to_string();
assert!(is_test_function(&entry));
entry.file_path = "src/tests/mod.rs".to_string();
assert!(is_test_function(&entry));
entry.file_path = "src/handler_tests.rs".to_string();
assert!(is_test_function(&entry));
entry.file_path = "src/handler_test.rs".to_string();
assert!(is_test_function(&entry));
}