use crate::resolver::constant::{self, DEFAULT_SCORE};
pub const CASE_SENSITIVE_MATCHING_CAPITALISATION_BONUS: u16 = 8;
pub const CASE_SENSITIVE_MATCHING_CASE_BONUS: u16 = 4;
pub const COMMON_SYMBOL_KINDS_SCORE_BONUS: i64 = (constant::DEFAULT_SCORE * 35) / 1000;
pub const INFREQUENT_SYMBOL_KINDS_SCORE_BONUS: i64 = (constant::DEFAULT_SCORE * 15) / 1000;
pub const UNCOMMON_SYMBOL_KINDS_SCORE_PENALTY: i64 = -((constant::DEFAULT_SCORE * 15) / 1000);
pub const TEST_HARNESS_SCORE_PENALTY: i64 = -((constant::DEFAULT_SCORE * 10) / 1000);
pub const ENTRYPOINT_FILE_SCORE_PENALTY: i64 = -((constant::DEFAULT_SCORE * 10) / 1000);
pub const SAME_FILE_PENALTY: i64 = -((constant::DEFAULT_SCORE * 10) / 1000);
pub fn calculate_distance_score_penalty(distance: usize) -> i64 {
const MAX_DISTANCE: i64 = 6;
if distance == 0 {
return 0;
}
let distance = i64::try_from(distance)
.unwrap_or(MAX_DISTANCE)
.min(MAX_DISTANCE);
-((constant::DEFAULT_SCORE * (distance * 2)) / 1000)
}
pub fn calculate_fuzzy_match_bonus(fuzzy_match: &frizbee::Match) -> i64 {
match fuzzy_match {
fuzzy_match if fuzzy_match.exact => {
let score = i64::from(fuzzy_match.score);
((score / 4) * 2).min((DEFAULT_SCORE * 65) / 1000)
}
fuzzy_match => {
let score = i64::from(fuzzy_match.score);
(score / 4).min((DEFAULT_SCORE * 50) / 1000)
}
}
}
#[cfg(test)]
mod tests {
use rstest::rstest;
#[rstest]
#[case(0, 0)]
#[case(1, -2)]
#[case(2, -4)]
#[case(3, -6)]
#[case(4, -8)]
#[case(5, -10)]
#[case(6, -12)]
#[case(7, -12)]
#[case(8, -12)]
#[case(9, -12)]
#[case(10, -12)]
pub fn test_distance_weighting(#[case] distance: usize, #[case] expected_penalty: i64) {
assert_eq!(
expected_penalty,
super::calculate_distance_score_penalty(distance)
);
}
}