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}