use std::cell::RefCell;
use std::rc::Rc;
pub struct MockState<T> {
value: Rc<RefCell<T>>,
change_count: Rc<RefCell<usize>>,
}
impl<T> MockState<T> {
pub fn new(value: T) -> Self {
Self {
value: Rc::new(RefCell::new(value)),
change_count: Rc::new(RefCell::new(0)),
}
}
pub fn get(&self) -> std::cell::Ref<'_, T> {
self.value.borrow()
}
pub fn get_mut(&self) -> std::cell::RefMut<'_, T> {
self.value.borrow_mut()
}
pub fn set(&self, value: T) {
*self.value.borrow_mut() = value;
*self.change_count.borrow_mut() += 1;
}
pub fn change_count(&self) -> usize {
*self.change_count.borrow()
}
pub fn reset_count(&self) {
*self.change_count.borrow_mut() = 0;
}
}
impl<T: Clone> MockState<T> {
pub fn value(&self) -> T {
self.value.borrow().clone()
}
pub fn update(&self, f: impl FnOnce(&mut T)) {
f(&mut self.value.borrow_mut());
*self.change_count.borrow_mut() += 1;
}
}
impl<T: Clone> Clone for MockState<T> {
fn clone(&self) -> Self {
Self {
value: Rc::clone(&self.value),
change_count: Rc::clone(&self.change_count),
}
}
}