#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SecurityCondition {
PW1_81,
PW1_82,
PW3,
}
pub struct SecurityState {
pw1_81_verified: bool,
pw1_82_verified: bool,
pw3_verified: bool,
pw1_valid_multiple: bool,
}
impl SecurityState {
pub fn new() -> Self {
Self {
pw1_81_verified: false,
pw1_82_verified: false,
pw3_verified: false,
pw1_valid_multiple: true,
}
}
pub fn set_verified(&mut self, condition: SecurityCondition) {
match condition {
SecurityCondition::PW1_81 => self.pw1_81_verified = true,
SecurityCondition::PW1_82 => self.pw1_82_verified = true,
SecurityCondition::PW3 => self.pw3_verified = true,
}
}
pub fn is_verified(&self, condition: SecurityCondition) -> bool {
match condition {
SecurityCondition::PW1_81 => self.pw1_81_verified,
SecurityCondition::PW1_82 => self.pw1_82_verified,
SecurityCondition::PW3 => self.pw3_verified,
}
}
pub fn clear(&mut self, condition: SecurityCondition) {
match condition {
SecurityCondition::PW1_81 => self.pw1_81_verified = false,
SecurityCondition::PW1_82 => self.pw1_82_verified = false,
SecurityCondition::PW3 => self.pw3_verified = false,
}
}
pub fn clear_all(&mut self) {
self.pw1_81_verified = false;
self.pw1_82_verified = false;
self.pw3_verified = false;
}
pub fn after_sign(&mut self) {
if !self.pw1_valid_multiple {
self.pw1_81_verified = false;
}
}
pub fn set_pw1_valid_multiple(&mut self, valid: bool) {
self.pw1_valid_multiple = valid;
}
pub fn pw1_valid_multiple(&self) -> bool {
self.pw1_valid_multiple
}
}
impl Default for SecurityState {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_initial_state() {
let state = SecurityState::new();
assert!(!state.is_verified(SecurityCondition::PW1_81));
assert!(!state.is_verified(SecurityCondition::PW1_82));
assert!(!state.is_verified(SecurityCondition::PW3));
}
#[test]
fn test_set_verified() {
let mut state = SecurityState::new();
state.set_verified(SecurityCondition::PW1_81);
assert!(state.is_verified(SecurityCondition::PW1_81));
assert!(!state.is_verified(SecurityCondition::PW1_82));
}
#[test]
fn test_clear_all() {
let mut state = SecurityState::new();
state.set_verified(SecurityCondition::PW1_81);
state.set_verified(SecurityCondition::PW3);
state.clear_all();
assert!(!state.is_verified(SecurityCondition::PW1_81));
assert!(!state.is_verified(SecurityCondition::PW3));
}
#[test]
fn test_after_sign_single() {
let mut state = SecurityState::new();
state.set_pw1_valid_multiple(false);
state.set_verified(SecurityCondition::PW1_81);
state.after_sign();
assert!(!state.is_verified(SecurityCondition::PW1_81));
}
#[test]
fn test_after_sign_multiple() {
let mut state = SecurityState::new();
state.set_pw1_valid_multiple(true);
state.set_verified(SecurityCondition::PW1_81);
state.after_sign();
assert!(state.is_verified(SecurityCondition::PW1_81));
}
}