use super::UiState;
use crate::spend::Ceiling;
const CEILING: &str = "ceiling";
impl UiState {
pub fn ceiling(&self) -> Ceiling {
Ceiling::from_json(self.world.root.get(CEILING))
}
pub fn set_ceiling(&mut self, micro_usd: Option<u64>) {
match micro_usd {
Some(micro) => {
self.world
.root
.insert(CEILING.to_owned(), crate::spend::decimal(micro));
}
None => {
self.world.root.remove(CEILING);
}
}
self.world.save();
}
}
#[cfg(test)]
mod tests {
use crate::spend::Ceiling;
use crate::ui_state::UiState;
use tempfile::tempdir;
fn opened(doc: &str) -> UiState {
let dir = tempdir().unwrap();
let path = dir.path().join("ui.json");
std::fs::write(&path, doc).unwrap();
UiState::open(path)
}
#[test]
fn absent_key_is_no_ceiling() {
assert_eq!(opened(r#"{"v":1}"#).ceiling(), Ceiling::default());
}
#[test]
fn wrong_shape_is_no_ceiling() {
assert_eq!(
opened(r#"{"v":1,"ceiling":"ten"}"#).ceiling(),
Ceiling::default()
);
}
#[test]
fn a_ceiling_written_is_read_back_and_none_deletes_the_key() {
let dir = tempdir().unwrap();
let path = dir.path().join("ui.json");
let mut ui = UiState::open(path.clone());
ui.set_ceiling(Some(12_500_000));
assert!(
std::fs::read_to_string(&path)
.unwrap()
.contains("\"ceiling\": 12.5")
);
assert_eq!(
UiState::open(path.clone()).ceiling().micro_usd(),
Some(12_500_000)
);
ui.set_ceiling(None);
assert_eq!(UiState::open(path).ceiling(), Ceiling::default());
}
#[test]
fn a_number_is_the_ceiling() {
assert_ne!(
opened(r#"{"v":1,"ceiling":12.5}"#).ceiling(),
Ceiling::default()
);
}
}