use std::path::Path;
use colgrep::CodeUnit;
pub fn compute_final_score(
semantic_score: f32,
query: &str,
unit: &CodeUnit,
text_pattern: Option<&str>,
) -> f32 {
let mut score = semantic_score;
let query_lower = query.to_lowercase();
let query_has_test = query_lower.contains("test");
let pattern_has_test = text_pattern
.map(|p| p.to_lowercase().contains("test"))
.unwrap_or(false);
if unit.name.to_lowercase().contains("test") && !query_has_test && !pattern_has_test {
score -= 1.0;
}
score
}
pub fn should_search_from_root(
include_patterns: &[String],
subdir: &Path,
effective_root: &Path,
) -> bool {
for pattern in include_patterns {
if let Some(rest) = pattern.strip_prefix("**/") {
if let Some(dir_name) = rest.split('/').next() {
if dir_name.contains('*') {
continue;
}
let subdir_path = effective_root.join(subdir).join(dir_name);
if !subdir_path.exists() {
return true;
}
}
}
}
false
}
#[cfg(test)]
mod tests {
use std::path::PathBuf;
use colgrep::{Language, UnitType};
use super::*;
fn make_test_unit(name: &str, signature: &str, code: &str, file: &str) -> CodeUnit {
let mut unit = CodeUnit::new(
name.to_string(),
PathBuf::from(file),
1,
10,
Language::Rust,
UnitType::Function,
None,
);
unit.signature = signature.to_string();
unit.code = code.to_string();
unit
}
#[test]
fn test_compute_final_score_no_adjustment() {
let unit = make_test_unit(
"other_function",
"fn other_function()",
"does something else",
"test.rs",
);
let score = compute_final_score(5.0, "search_query", &unit, None);
assert_eq!(score, 5.0);
}
#[test]
fn test_compute_final_score_test_function_demoted() {
let unit = make_test_unit(
"test_something",
"fn test_something()",
"does something",
"test.rs",
);
let score = compute_final_score(5.0, "search_query", &unit, None);
assert_eq!(score, 5.0 - 1.0);
}
#[test]
fn test_compute_final_score_test_function_not_demoted_when_query_has_test() {
let unit = make_test_unit(
"test_something",
"fn test_something()",
"does something",
"test.rs",
);
let score = compute_final_score(5.0, "test", &unit, None);
assert_eq!(score, 5.0);
}
#[test]
fn test_compute_final_score_test_function_not_demoted_when_pattern_has_test() {
let unit = make_test_unit(
"test_something",
"fn test_something()",
"does something",
"test.rs",
);
let score = compute_final_score(5.0, "search_query", &unit, Some("test"));
assert_eq!(score, 5.0);
}
#[test]
fn test_should_search_from_root_no_patterns() {
let patterns: Vec<String> = vec![];
let subdir = PathBuf::from("src");
let root = PathBuf::from("/tmp/test_project");
assert!(!should_search_from_root(&patterns, &subdir, &root));
}
#[test]
fn test_should_search_from_root_wildcard_extension() {
let patterns = vec!["**/*.rs".to_string()];
let subdir = PathBuf::from("src");
let root = PathBuf::from("/tmp/test_project");
assert!(!should_search_from_root(&patterns, &subdir, &root));
}
#[test]
fn test_should_search_from_root_no_star_star_prefix() {
let patterns = vec!["src/**/*.py".to_string()];
let subdir = PathBuf::from("src");
let root = PathBuf::from("/tmp/test_project");
assert!(!should_search_from_root(&patterns, &subdir, &root));
}
#[test]
fn test_should_search_from_root_simple_glob() {
let patterns = vec!["*.json".to_string()];
let subdir = PathBuf::from("src");
let root = PathBuf::from("/tmp/test_project");
assert!(!should_search_from_root(&patterns, &subdir, &root));
}
#[test]
fn test_should_search_from_root_escaping_pattern() {
let patterns = vec!["**/.github/**/*".to_string()];
let subdir = PathBuf::from("src");
let root = PathBuf::from("/tmp/test_project_nonexistent");
assert!(should_search_from_root(&patterns, &subdir, &root));
}
#[test]
fn test_should_search_from_root_multiple_patterns_one_escapes() {
let patterns = vec![
"**/*.rs".to_string(), "**/.github/**/*".to_string(), ];
let subdir = PathBuf::from("src");
let root = PathBuf::from("/tmp/test_project_nonexistent");
assert!(should_search_from_root(&patterns, &subdir, &root));
}
}