use crate::geometrics::{BasicMetrics, ShapeMetrics};
use pretty_simple_display::{DebugPretty, DisplaySimple};
use serde::Serialize;
use utoipa::ToSchema;
#[derive(DebugPretty, DisplaySimple, Clone, Serialize, ToSchema)]
pub struct AnalysisResult {
pub statistics: BasicMetrics,
pub shape_metrics: ShapeMetrics,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::curves::Point2D;
use crate::geometrics::analysis::metrics::{BasicMetrics, ShapeMetrics};
use rust_decimal_macros::dec;
fn create_sample_basic_metrics() -> BasicMetrics {
BasicMetrics {
mean: dec!(10.5),
median: dec!(10.0),
mode: dec!(9.0),
std_dev: dec!(1.2),
}
}
fn create_sample_shape_metrics() -> ShapeMetrics {
ShapeMetrics {
skewness: dec!(0.25),
kurtosis: dec!(3.2),
peaks: vec![
Point2D::new(dec!(1.0), dec!(10.0)),
Point2D::new(dec!(5.0), dec!(15.0)),
],
valleys: vec![Point2D::new(dec!(3.0), dec!(5.0))],
inflection_points: vec![
Point2D::new(dec!(2.0), dec!(7.5)),
Point2D::new(dec!(4.0), dec!(12.0)),
],
}
}
#[test]
fn test_analysis_result_creation() {
let result = AnalysisResult {
statistics: create_sample_basic_metrics(),
shape_metrics: create_sample_shape_metrics(),
};
assert!(result.statistics.mean == dec!(10.5));
assert!(result.statistics.median == dec!(10.0));
assert!(result.statistics.mode == dec!(9.0));
assert!(result.statistics.std_dev == dec!(1.2));
assert!(result.shape_metrics.skewness == dec!(0.25));
assert!(result.shape_metrics.kurtosis == dec!(3.2));
}
#[test]
fn test_analysis_result_field_access() {
let result = AnalysisResult {
statistics: create_sample_basic_metrics(),
shape_metrics: create_sample_shape_metrics(),
};
assert_eq!(result.statistics.mean, dec!(10.5));
assert_eq!(result.statistics.median, dec!(10.0));
assert_eq!(result.statistics.mode, dec!(9.0));
assert_eq!(result.statistics.std_dev, dec!(1.2));
assert_eq!(result.shape_metrics.skewness, dec!(0.25));
assert_eq!(result.shape_metrics.kurtosis, dec!(3.2));
assert_eq!(result.shape_metrics.peaks.len(), 2);
assert_eq!(result.shape_metrics.valleys.len(), 1);
assert_eq!(result.shape_metrics.inflection_points.len(), 2);
}
#[test]
fn test_analysis_result_point_access() {
let result = AnalysisResult {
statistics: create_sample_basic_metrics(),
shape_metrics: create_sample_shape_metrics(),
};
assert_eq!(result.shape_metrics.peaks[0].x, dec!(1.0));
assert_eq!(result.shape_metrics.peaks[0].y, dec!(10.0));
assert_eq!(result.shape_metrics.peaks[1].x, dec!(5.0));
assert_eq!(result.shape_metrics.peaks[1].y, dec!(15.0));
assert_eq!(result.shape_metrics.valleys[0].x, dec!(3.0));
assert_eq!(result.shape_metrics.valleys[0].y, dec!(5.0));
assert_eq!(result.shape_metrics.inflection_points[0].x, dec!(2.0));
assert_eq!(result.shape_metrics.inflection_points[0].y, dec!(7.5));
assert_eq!(result.shape_metrics.inflection_points[1].x, dec!(4.0));
assert_eq!(result.shape_metrics.inflection_points[1].y, dec!(12.0));
}
#[test]
fn test_analysis_result_with_empty_points() {
let shape_metrics = ShapeMetrics {
skewness: dec!(0.1),
kurtosis: dec!(2.5),
peaks: vec![],
valleys: vec![],
inflection_points: vec![],
};
let result = AnalysisResult {
statistics: create_sample_basic_metrics(),
shape_metrics,
};
assert_eq!(result.shape_metrics.peaks.len(), 0);
assert_eq!(result.shape_metrics.valleys.len(), 0);
assert_eq!(result.shape_metrics.inflection_points.len(), 0);
assert_eq!(result.shape_metrics.skewness, dec!(0.1));
assert_eq!(result.shape_metrics.kurtosis, dec!(2.5));
}
#[test]
fn test_analysis_result_debug() {
let result = AnalysisResult {
statistics: create_sample_basic_metrics(),
shape_metrics: create_sample_shape_metrics(),
};
let debug_str = format!("{result:?}");
assert!(!debug_str.is_empty());
}
}