rs_teststand/sequence/
run_mode.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
16#[non_exhaustive]
17pub enum RunMode {
18 #[default]
20 Normal,
21 Skip,
23 ForcePass,
25 ForceFail,
27}
28
29impl RunMode {
30 #[must_use]
32 pub const fn as_str(self) -> &'static str {
33 match self {
34 Self::Normal => "Normal",
35 Self::Skip => "Skip",
36 Self::ForcePass => "Pass",
37 Self::ForceFail => "Fail",
38 }
39 }
40
41 #[must_use]
45 pub fn from_value(value: &str) -> Option<Self> {
46 [Self::Normal, Self::Skip, Self::ForcePass, Self::ForceFail]
47 .into_iter()
48 .find(|candidate| candidate.as_str() == value)
49 }
50}
51
52impl std::fmt::Display for RunMode {
53 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
54 formatter.write_str(self.as_str())
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use super::RunMode;
61
62 #[test]
63 fn the_forcing_modes_do_not_spell_themselves_the_way_they_are_named() {
64 assert_eq!(RunMode::ForcePass.as_str(), "Pass");
67 assert_eq!(RunMode::ForceFail.as_str(), "Fail");
68 }
69
70 #[test]
71 fn every_mode_round_trips() {
72 for mode in [
73 RunMode::Normal,
74 RunMode::Skip,
75 RunMode::ForcePass,
76 RunMode::ForceFail,
77 ] {
78 assert_eq!(RunMode::from_value(mode.as_str()), Some(mode));
79 }
80 }
81
82 #[test]
83 fn a_step_runs_unless_told_otherwise() {
84 assert_eq!(RunMode::default(), RunMode::Normal);
85 }
86
87 #[test]
88 fn an_unrecognized_mode_is_reported_rather_than_guessed() {
89 assert_eq!(RunMode::from_value("0"), None);
91 assert_eq!(RunMode::from_value("normal"), None);
92 }
93}