use crate::statistics::Metrics;
#[test]
fn test_mean() {
let values = vec![1.0, 2.0, 3.0, 4.0, 5.0];
assert_eq!(Metrics::mean(&values), 3.0);
let values = vec![-5.0, -3.0, -1.0, 1.0, 3.0, 5.0];
assert_eq!(Metrics::mean(&values), 0.0);
let values = vec![42.0];
assert_eq!(Metrics::mean(&values), 42.0);
}
#[test]
fn test_std() {
let values = vec![1.0, 2.0, 3.0, 4.0, 5.0];
assert!((Metrics::std(&values) - 2.0_f64.sqrt()).abs() < 1e-10);
let values = vec![-2.0, -1.0, 0.0, 1.0, 2.0];
assert!((Metrics::std(&values) - 2.0_f64.sqrt()).abs() < 1e-10);
let values = vec![7.0, 7.0, 7.0, 7.0, 7.0];
assert!(Metrics::std(&values).abs() < 1e-10);
}
#[test]
fn test_kurtosis() {
let values = vec![2.0, 2.5, 2.8, 3.0, 3.0, 3.0, 3.2, 3.5, 4.0];
let metrics = Metrics::new(values);
assert!((metrics.kurtosis() - 3.0).abs() < 1.0);
let values: Vec<f64> = (1..11).map(|x| x as f64).collect();
let metrics = Metrics::new(values);
assert!(metrics.kurtosis() < 3.0);
let values = vec![0.0, 0.0, 0.0, 0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 0.0, -10.0];
let metrics = Metrics::new(values);
assert!(metrics.kurtosis() > 3.0);
}
#[test]
fn test_roughness() {
let values = vec![1.0, 3.0, 2.0, 4.0, 3.0];
let metrics = Metrics::new(values);
assert!((metrics.roughness() - 1.5).abs() < 1e-10);
let values = vec![5.0, 5.0, 5.0, 5.0, 5.0];
let metrics = Metrics::new(values);
assert!(metrics.roughness().abs() < 1e-10);
let values = vec![1.0, 3.0, 5.0, 7.0, 9.0];
let metrics = Metrics::new(values);
assert!(metrics.roughness().abs() < 1e-10);
let values = vec![1.0, 3.1, 5.0, 6.9, 9.1];
let metrics = Metrics::new(values);
assert!(metrics.roughness() > 0.0 && metrics.roughness() < 0.2);
}
#[test]
fn test_metrics_new() {
let values = vec![1.0, 2.0, 3.0, 4.0, 5.0];
let metrics = Metrics::new(values.clone());
assert!((metrics.kurtosis() - 1.7).abs() < 0.5);
let expected_roughness = Metrics::std(&values.windows(2).map(|w| w[1] - w[0]).collect::<Vec<_>>());
assert!((metrics.roughness() - expected_roughness).abs() < 1e-10);
}
#[test]
fn test_metrics_with_extreme_values() {
let values = vec![1e10, 2e10, 3e10, 4e10, 5e10];
let metrics = Metrics::new(values);
let roughness = metrics.roughness();
assert!(roughness.is_finite(), "Roughness should be finite for large values");
let values = vec![1e-10, 2e-10, 3e-10, 4e-10, 5e-10];
let metrics = Metrics::new(values);
let roughness = metrics.roughness();
assert!(roughness.is_finite(), "Roughness should be finite for small values");
let values = vec![-1e6, 2e6, -3e6, 4e6, -5e6];
let metrics = Metrics::new(values);
assert!(metrics.kurtosis() > 0.0); }