clnrm_template/
determinism.rs

1//! Determinism support for reproducible tests
2//!
3//! Provides configuration for deterministic test execution:
4//! - Fixed random seeds
5//! - Frozen timestamps
6//! - Reproducible test generation
7
8use serde::{Deserialize, Serialize};
9
10/// Configuration for deterministic test execution
11///
12/// Enables reproducible tests by controlling randomness and time:
13/// - `seed` - Fixed random seed for matrix expansion
14/// - `freeze_clock` - Fixed timestamp for `now_rfc3339()` function
15#[derive(Debug, Clone, Deserialize, Serialize, Default)]
16pub struct DeterminismConfig {
17    /// Random seed for deterministic matrix expansion
18    pub seed: Option<u64>,
19    /// Frozen timestamp in RFC3339 format
20    pub freeze_clock: Option<String>,
21}
22
23impl DeterminismConfig {
24    /// Create new determinism config
25    pub fn new() -> Self {
26        Self::default()
27    }
28
29    /// Set random seed for matrix expansion
30    pub fn with_seed(mut self, seed: u64) -> Self {
31        self.seed = Some(seed);
32        self
33    }
34
35    /// Set frozen clock timestamp
36    pub fn with_freeze_clock(mut self, timestamp: String) -> Self {
37        self.freeze_clock = Some(timestamp);
38        self
39    }
40
41    /// Check if any determinism features are enabled
42    pub fn is_deterministic(&self) -> bool {
43        self.seed.is_some() || self.freeze_clock.is_some()
44    }
45
46    /// Check if random seed is set
47    pub fn has_seed(&self) -> bool {
48        self.seed.is_some()
49    }
50
51    /// Check if clock is frozen
52    pub fn has_frozen_clock(&self) -> bool {
53        self.freeze_clock.is_some()
54    }
55
56    /// Get the seed value if set
57    pub fn get_seed(&self) -> Option<u64> {
58        self.seed
59    }
60
61    /// Get the frozen clock timestamp if set
62    pub fn get_freeze_clock(&self) -> Option<&str> {
63        self.freeze_clock.as_deref()
64    }
65}