use crate::priority::semantic_classifier::FunctionRole;
use crate::risk::evidence::RiskClassification;
pub fn calculate_role_adjustment(role: &FunctionRole) -> f64 {
match role {
FunctionRole::IOWrapper => 1.0,
FunctionRole::Orchestrator => 0.5,
FunctionRole::PatternMatch => 1.5,
FunctionRole::Debug => 2.0,
_ => 0.0,
}
}
pub fn classify_by_score(adjusted_score: f64) -> RiskClassification {
match adjusted_score {
s if s <= 2.0 => RiskClassification::WellDesigned,
s if s <= 4.0 => RiskClassification::Acceptable,
s if s <= 7.0 => RiskClassification::NeedsImprovement,
s if s <= 9.0 => RiskClassification::Risky,
_ => RiskClassification::Critical,
}
}
pub fn classify_risk_level(score: f64, role: &FunctionRole) -> RiskClassification {
let adjustment = calculate_role_adjustment(role);
let adjusted_score = (score - adjustment).max(0.0);
classify_by_score(adjusted_score)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_calculate_role_adjustment() {
assert!((calculate_role_adjustment(&FunctionRole::IOWrapper) - 1.0).abs() < 0.001);
assert!((calculate_role_adjustment(&FunctionRole::Orchestrator) - 0.5).abs() < 0.001);
assert!((calculate_role_adjustment(&FunctionRole::PatternMatch) - 1.5).abs() < 0.001);
assert!((calculate_role_adjustment(&FunctionRole::Debug) - 2.0).abs() < 0.001);
assert!((calculate_role_adjustment(&FunctionRole::PureLogic) - 0.0).abs() < 0.001);
assert!((calculate_role_adjustment(&FunctionRole::EntryPoint) - 0.0).abs() < 0.001);
assert!((calculate_role_adjustment(&FunctionRole::Unknown) - 0.0).abs() < 0.001);
}
#[test]
fn test_classify_by_score() {
assert_eq!(classify_by_score(0.0), RiskClassification::WellDesigned);
assert_eq!(classify_by_score(2.0), RiskClassification::WellDesigned);
assert_eq!(classify_by_score(2.1), RiskClassification::Acceptable);
assert_eq!(classify_by_score(4.0), RiskClassification::Acceptable);
assert_eq!(classify_by_score(4.1), RiskClassification::NeedsImprovement);
assert_eq!(classify_by_score(7.0), RiskClassification::NeedsImprovement);
assert_eq!(classify_by_score(7.1), RiskClassification::Risky);
assert_eq!(classify_by_score(9.0), RiskClassification::Risky);
assert_eq!(classify_by_score(9.1), RiskClassification::Critical);
assert_eq!(classify_by_score(10.0), RiskClassification::Critical);
}
#[test]
fn test_classify_risk_level_with_adjustment() {
assert_eq!(
classify_risk_level(5.0, &FunctionRole::IOWrapper),
RiskClassification::Acceptable
);
assert_eq!(
classify_risk_level(5.0, &FunctionRole::PureLogic),
RiskClassification::NeedsImprovement
);
assert_eq!(
classify_risk_level(3.0, &FunctionRole::Debug),
RiskClassification::WellDesigned
);
}
#[test]
fn test_classify_risk_level_floor_at_zero() {
assert_eq!(
classify_risk_level(1.0, &FunctionRole::Debug),
RiskClassification::WellDesigned
);
}
}