use crate::name::MutexName;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum MutexScope {
Workspace,
Project,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum MutexMode {
#[default]
Exclusive,
Shared,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Mutex {
pub scope: MutexScope,
pub name: MutexName,
pub mode: MutexMode,
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use crate::mutex::{Mutex, MutexMode, MutexScope};
use crate::name::MutexName;
fn name(s: &str) -> MutexName {
MutexName::from_str(s).unwrap()
}
#[test]
fn mutex_scope_variants_are_distinct() {
assert_ne!(MutexScope::Workspace, MutexScope::Project);
}
#[test]
fn mutex_mode_default_is_exclusive() {
assert_eq!(MutexMode::default(), MutexMode::Exclusive);
}
#[test]
fn mutex_mode_variants_are_distinct() {
assert_ne!(MutexMode::Exclusive, MutexMode::Shared);
}
#[test]
fn mutex_aggregate_carries_three_fields() {
let m = Mutex {
scope: MutexScope::Workspace,
name: name("db"),
mode: MutexMode::Exclusive,
};
assert_eq!(m.scope, MutexScope::Workspace);
assert_eq!(m.name.as_ref(), "db");
assert_eq!(m.mode, MutexMode::Exclusive);
}
#[test]
fn mutexes_distinct_by_scope_with_same_name() {
let ws = Mutex {
scope: MutexScope::Workspace,
name: name("db"),
mode: MutexMode::Exclusive,
};
let proj = Mutex {
scope: MutexScope::Project,
name: name("db"),
mode: MutexMode::Exclusive,
};
assert_ne!(ws, proj);
}
#[test]
fn mutexes_distinct_by_mode_with_same_name_and_scope() {
let excl = Mutex {
scope: MutexScope::Workspace,
name: name("db"),
mode: MutexMode::Exclusive,
};
let shared = Mutex {
scope: MutexScope::Workspace,
name: name("db"),
mode: MutexMode::Shared,
};
assert_ne!(excl, shared);
}
#[test]
fn mutex_is_hashable() {
use std::collections::HashSet;
let mut s = HashSet::new();
s.insert(Mutex {
scope: MutexScope::Workspace,
name: name("db"),
mode: MutexMode::Exclusive,
});
s.insert(Mutex {
scope: MutexScope::Workspace,
name: name("db"),
mode: MutexMode::Exclusive,
});
assert_eq!(s.len(), 1);
}
}