Skip to main content

perfgate_domain/
paired.rs

1//! Paired statistics computation for perfgate.
2//!
3//! This module re-exports from `perfgate_paired` for backward compatibility.
4
5pub use perfgate_paired::{
6    PairedComparison, PairedError, compare_paired_stats, compute_paired_cv, compute_paired_stats,
7};
8
9use crate::DomainError;
10
11impl From<PairedError> for DomainError {
12    fn from(err: PairedError) -> Self {
13        match err {
14            PairedError::NoSamples => DomainError::NoSamples,
15        }
16    }
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    use perfgate_types::{PairedSample, PairedSampleHalf};
23
24    fn sample_half(wall_ms: u64) -> PairedSampleHalf {
25        PairedSampleHalf {
26            wall_ms,
27            exit_code: 0,
28            timed_out: false,
29            max_rss_kb: None,
30            stdout: None,
31            stderr: None,
32        }
33    }
34
35    fn paired_sample(
36        pair_index: u32,
37        warmup: bool,
38        baseline_wall_ms: u64,
39        current_wall_ms: u64,
40    ) -> PairedSample {
41        PairedSample {
42            pair_index,
43            warmup,
44            baseline: sample_half(baseline_wall_ms),
45            current: sample_half(current_wall_ms),
46            wall_diff_ms: current_wall_ms as i64 - baseline_wall_ms as i64,
47            rss_diff_kb: None,
48        }
49    }
50
51    #[test]
52    fn test_paired_error_conversion() {
53        let paired_err = PairedError::NoSamples;
54        let domain_err: DomainError = paired_err.into();
55        assert!(matches!(domain_err, DomainError::NoSamples));
56    }
57
58    #[test]
59    fn test_compute_paired_stats_empty_samples_returns_domain_error() {
60        let samples: Vec<PairedSample> = vec![];
61        let result = compute_paired_stats(&samples, None, None);
62        assert!(result.is_err());
63        let err = result.unwrap_err();
64        let domain_err: DomainError = err.into();
65        assert!(matches!(domain_err, DomainError::NoSamples));
66    }
67
68    #[test]
69    fn test_re_exports_work() {
70        let samples = vec![
71            paired_sample(0, false, 100, 110),
72            paired_sample(1, false, 100, 120),
73        ];
74
75        let stats = compute_paired_stats(&samples, None, None).unwrap();
76        let comparison = compare_paired_stats(&stats);
77
78        assert_eq!(stats.wall_diff_ms.mean, 15.0);
79        assert_eq!(comparison.mean_diff_ms, 15.0);
80    }
81}