#[derive(Debug)]
pub(crate) enum Overlay<S> {
Down,
Up(S),
}
impl<S> Overlay<S> {
#[must_use]
pub(crate) fn up(state: S) -> Self {
Self::Up(state)
}
#[cfg(test)]
pub(crate) fn is_up(&self) -> bool {
self.get().is_some()
}
#[cfg(test)]
pub(crate) fn get(&self) -> Option<&S> {
match self {
Self::Down => None,
Self::Up(state) => Some(state),
}
}
pub(crate) fn get_mut(&mut self) -> Option<&mut S> {
match self {
Self::Down => None,
Self::Up(state) => Some(state),
}
}
pub(crate) fn show(&mut self, state: S) {
*self = Self::up(state);
}
pub(crate) fn close(&mut self) {
*self = Self::Down;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn an_overlay_starts_down() {
let overlay: Overlay<u8> = Overlay::Down;
assert!(!overlay.is_up(), "the overlay started up");
assert_eq!(overlay.get(), None);
}
#[test]
fn show_puts_it_up_over_the_state() {
let mut overlay = Overlay::Down;
overlay.show(7);
assert!(overlay.is_up(), "the overlay stayed down");
assert_eq!(overlay.get(), Some(&7));
}
#[test]
fn show_replaces_what_it_held() {
let mut overlay = Overlay::up(7);
overlay.show(9);
assert_eq!(
overlay.get(),
Some(&9),
"the show did not replace the state"
);
}
#[test]
fn close_drops_what_it_held() {
let mut overlay = Overlay::up(7);
overlay.close();
assert!(!overlay.is_up(), "the overlay stayed up");
assert_eq!(overlay.get(), None);
}
#[test]
fn the_state_is_only_there_while_it_is_up() {
let mut overlay = Overlay::up(7);
assert!(overlay.get_mut().is_some(), "the state is not reachable");
overlay.close();
assert!(
overlay.get_mut().is_none(),
"a closed overlay handed its state out"
);
}
}