perfgate_domain/
paired.rs1pub 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}