use crate::statistical_tests::utils::convert_string;
pub fn get_sdd(text: &str) -> f64 {
let data = convert_string(text);
if data.len() < 2 {
return 0.0;
}
let mut differences = Vec::with_capacity(data.len() - 1);
for i in 1..data.len() {
let diff = (data[i] as isize - data[i-1] as isize).rem_euclid(26) as usize;
differences.push(diff);
}
let sum: usize = differences.iter().sum();
let mean = sum as f64 / differences.len() as f64;
let variance: f64 = differences.iter()
.map(|&d| {
let diff = d as f64 - mean;
diff * diff
})
.sum::<f64>() / differences.len() as f64;
let std_dev = variance.sqrt();
std_dev * 10.0 }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_sdd_constant_differences() {
let text = "ACEGIKMOQSUWY"; let sdd = get_sdd(text);
assert_eq!(sdd, 0.0); }
#[test]
fn test_sdd_varied_differences() {
let text = "ABCDEFZYXWVU";
let sdd = get_sdd(text);
assert!(sdd > 0.0); }
#[test]
fn test_sdd_short_text() {
let text = "A";
let sdd = get_sdd(text);
assert_eq!(sdd, 0.0);
}
}