use crate::error::StateTransition;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NamespaceState {
Uninitialized,
Unshared,
Entered,
Cleaned,
}
impl StateTransition for NamespaceState {
fn can_transition_to(&self, next: &NamespaceState) -> bool {
use NamespaceState::*;
matches!(
(self, next),
(Uninitialized, Unshared)
| (Unshared, Entered)
| (Unshared, Cleaned)
| (Entered, Cleaned)
| (Uninitialized, Uninitialized)
| (Unshared, Unshared)
| (Entered, Entered)
| (Cleaned, Cleaned)
)
}
fn is_terminal(&self) -> bool {
matches!(self, NamespaceState::Cleaned)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_transitions() {
assert!(NamespaceState::Uninitialized.can_transition_to(&NamespaceState::Unshared));
assert!(NamespaceState::Unshared.can_transition_to(&NamespaceState::Entered));
assert!(NamespaceState::Entered.can_transition_to(&NamespaceState::Cleaned));
}
#[test]
fn test_unshared_to_cleaned() {
assert!(NamespaceState::Unshared.can_transition_to(&NamespaceState::Cleaned));
}
#[test]
fn test_invalid_transitions() {
assert!(!NamespaceState::Uninitialized.can_transition_to(&NamespaceState::Entered));
assert!(!NamespaceState::Uninitialized.can_transition_to(&NamespaceState::Cleaned));
assert!(!NamespaceState::Entered.can_transition_to(&NamespaceState::Unshared));
assert!(!NamespaceState::Cleaned.can_transition_to(&NamespaceState::Entered));
}
#[test]
fn test_terminal_state() {
assert!(!NamespaceState::Uninitialized.is_terminal());
assert!(!NamespaceState::Unshared.is_terminal());
assert!(!NamespaceState::Entered.is_terminal());
assert!(NamespaceState::Cleaned.is_terminal());
}
}