solverforge_core/solver/
environment.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
4#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
5pub enum EnvironmentMode {
6    NonReproducible,
7    #[default]
8    Reproducible,
9    NoAssert,
10    PhaseAssert,
11    StepAssert,
12    FullAssert,
13    TrackedFullAssert,
14}
15
16impl EnvironmentMode {
17    pub fn is_asserted(&self) -> bool {
18        !matches!(
19            self,
20            EnvironmentMode::NonReproducible
21                | EnvironmentMode::Reproducible
22                | EnvironmentMode::NoAssert
23        )
24    }
25
26    pub fn is_reproducible(&self) -> bool {
27        !matches!(self, EnvironmentMode::NonReproducible)
28    }
29
30    pub fn is_tracked(&self) -> bool {
31        matches!(self, EnvironmentMode::TrackedFullAssert)
32    }
33}
34
35#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
36#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
37pub enum MoveThreadCount {
38    Auto,
39    #[default]
40    None,
41    #[serde(untagged)]
42    Count(u32),
43}
44
45impl MoveThreadCount {
46    pub fn auto() -> Self {
47        MoveThreadCount::Auto
48    }
49
50    pub fn none() -> Self {
51        MoveThreadCount::None
52    }
53
54    pub fn count(n: u32) -> Self {
55        MoveThreadCount::Count(n)
56    }
57
58    pub fn is_parallel(&self) -> bool {
59        match self {
60            MoveThreadCount::Auto => true,
61            MoveThreadCount::None => false,
62            MoveThreadCount::Count(n) => *n > 1,
63        }
64    }
65}
66
67#[cfg(test)]
68mod tests {
69    use super::*;
70
71    #[test]
72    fn test_environment_mode_default() {
73        let mode: EnvironmentMode = Default::default();
74        assert_eq!(mode, EnvironmentMode::Reproducible);
75    }
76
77    #[test]
78    fn test_environment_mode_is_asserted() {
79        assert!(!EnvironmentMode::NonReproducible.is_asserted());
80        assert!(!EnvironmentMode::Reproducible.is_asserted());
81        assert!(!EnvironmentMode::NoAssert.is_asserted());
82        assert!(EnvironmentMode::PhaseAssert.is_asserted());
83        assert!(EnvironmentMode::StepAssert.is_asserted());
84        assert!(EnvironmentMode::FullAssert.is_asserted());
85        assert!(EnvironmentMode::TrackedFullAssert.is_asserted());
86    }
87
88    #[test]
89    fn test_environment_mode_is_reproducible() {
90        assert!(!EnvironmentMode::NonReproducible.is_reproducible());
91        assert!(EnvironmentMode::Reproducible.is_reproducible());
92        assert!(EnvironmentMode::NoAssert.is_reproducible());
93        assert!(EnvironmentMode::PhaseAssert.is_reproducible());
94        assert!(EnvironmentMode::StepAssert.is_reproducible());
95        assert!(EnvironmentMode::FullAssert.is_reproducible());
96        assert!(EnvironmentMode::TrackedFullAssert.is_reproducible());
97    }
98
99    #[test]
100    fn test_environment_mode_is_tracked() {
101        assert!(!EnvironmentMode::NonReproducible.is_tracked());
102        assert!(!EnvironmentMode::Reproducible.is_tracked());
103        assert!(!EnvironmentMode::PhaseAssert.is_tracked());
104        assert!(EnvironmentMode::TrackedFullAssert.is_tracked());
105    }
106
107    #[test]
108    fn test_environment_mode_json_serialization() {
109        assert_eq!(
110            serde_json::to_string(&EnvironmentMode::NonReproducible).unwrap(),
111            "\"NON_REPRODUCIBLE\""
112        );
113        assert_eq!(
114            serde_json::to_string(&EnvironmentMode::PhaseAssert).unwrap(),
115            "\"PHASE_ASSERT\""
116        );
117        assert_eq!(
118            serde_json::to_string(&EnvironmentMode::TrackedFullAssert).unwrap(),
119            "\"TRACKED_FULL_ASSERT\""
120        );
121    }
122
123    #[test]
124    fn test_environment_mode_json_deserialization() {
125        let mode: EnvironmentMode = serde_json::from_str("\"FULL_ASSERT\"").unwrap();
126        assert_eq!(mode, EnvironmentMode::FullAssert);
127    }
128
129    #[test]
130    fn test_move_thread_count_default() {
131        let count: MoveThreadCount = Default::default();
132        assert_eq!(count, MoveThreadCount::None);
133    }
134
135    #[test]
136    fn test_move_thread_count_constructors() {
137        assert_eq!(MoveThreadCount::auto(), MoveThreadCount::Auto);
138        assert_eq!(MoveThreadCount::none(), MoveThreadCount::None);
139        assert_eq!(MoveThreadCount::count(4), MoveThreadCount::Count(4));
140    }
141
142    #[test]
143    fn test_move_thread_count_is_parallel() {
144        assert!(MoveThreadCount::Auto.is_parallel());
145        assert!(!MoveThreadCount::None.is_parallel());
146        assert!(!MoveThreadCount::Count(1).is_parallel());
147        assert!(MoveThreadCount::Count(2).is_parallel());
148        assert!(MoveThreadCount::Count(8).is_parallel());
149    }
150
151    #[test]
152    fn test_move_thread_count_json_serialization() {
153        assert_eq!(
154            serde_json::to_string(&MoveThreadCount::Auto).unwrap(),
155            "\"AUTO\""
156        );
157        assert_eq!(
158            serde_json::to_string(&MoveThreadCount::None).unwrap(),
159            "\"NONE\""
160        );
161        assert_eq!(
162            serde_json::to_string(&MoveThreadCount::Count(4)).unwrap(),
163            "4"
164        );
165    }
166
167    #[test]
168    fn test_move_thread_count_json_deserialization() {
169        let auto: MoveThreadCount = serde_json::from_str("\"AUTO\"").unwrap();
170        assert_eq!(auto, MoveThreadCount::Auto);
171
172        let count: MoveThreadCount = serde_json::from_str("8").unwrap();
173        assert_eq!(count, MoveThreadCount::Count(8));
174    }
175
176    #[test]
177    fn test_environment_mode_clone() {
178        let mode = EnvironmentMode::FullAssert;
179        let cloned = mode;
180        assert_eq!(mode, cloned);
181    }
182
183    #[test]
184    fn test_environment_mode_debug() {
185        let debug = format!("{:?}", EnvironmentMode::PhaseAssert);
186        assert!(debug.contains("PhaseAssert"));
187    }
188
189    #[test]
190    fn test_move_thread_count_clone() {
191        let count = MoveThreadCount::Count(4);
192        let cloned = count.clone();
193        assert_eq!(count, cloned);
194    }
195}