solverforge_core/solver/
environment.rs1use 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}