use reputation_types::AgentData;
#[inline(always)]
pub(crate) fn calculate_empirical(agent: &AgentData) -> f64 {
if agent.total_reviews == 0 {
return 50.0; }
if let Some(avg) = agent.average_rating {
(avg - 1.0) * 25.0
} else {
50.0 }
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::Utc;
fn create_test_agent() -> AgentData {
AgentData {
did: "did:test:123".to_string(),
created_at: Utc::now(),
mcp_level: None,
identity_verified: false,
security_audit_passed: false,
open_source: false,
total_interactions: 0,
total_reviews: 0,
average_rating: None,
positive_reviews: 0,
negative_reviews: 0,
}
}
#[test]
fn test_no_reviews() {
let agent = create_test_agent();
assert_eq!(calculate_empirical(&agent), 50.0);
}
#[test]
fn test_rating_conversion() {
let mut agent = create_test_agent();
agent.total_reviews = 10;
agent.average_rating = Some(1.0);
assert_eq!(calculate_empirical(&agent), 0.0);
agent.average_rating = Some(3.0);
assert_eq!(calculate_empirical(&agent), 50.0);
agent.average_rating = Some(5.0);
assert_eq!(calculate_empirical(&agent), 100.0);
agent.average_rating = Some(2.0);
assert_eq!(calculate_empirical(&agent), 25.0);
agent.average_rating = Some(4.0);
assert_eq!(calculate_empirical(&agent), 75.0);
agent.average_rating = Some(4.5);
assert_eq!(calculate_empirical(&agent), 87.5);
}
#[test]
fn test_reviews_but_no_rating() {
let mut agent = create_test_agent();
agent.total_reviews = 10;
agent.average_rating = None;
assert_eq!(calculate_empirical(&agent), 50.0);
}
#[test]
fn test_fractional_ratings() {
let mut agent = create_test_agent();
agent.total_reviews = 10;
agent.average_rating = Some(1.5);
assert!((calculate_empirical(&agent) - 12.5).abs() < 0.0001);
agent.average_rating = Some(2.7);
assert!((calculate_empirical(&agent) - 42.5).abs() < 0.0001);
agent.average_rating = Some(3.3);
assert!((calculate_empirical(&agent) - 57.5).abs() < 0.0001);
agent.average_rating = Some(4.2);
assert!((calculate_empirical(&agent) - 80.0).abs() < 0.0001);
}
}