1
0
Fork 0
forked from wry/wry
wry/src/it/test_utils/test_expected_event.rs

80 lines
2 KiB
Rust

use {
crate::{it::test_error::TestResult, utils::clonecell::CloneCell},
isnt::std_1::collections::IsntVecDequeExt,
std::{cell::RefCell, collections::VecDeque, rc::Rc},
};
pub struct TestExpectedEvent<T> {
data: Rc<TestExpectedEventData<T>>,
holder: Rc<TestExpectedEventHolder<T>>,
}
impl<T> TestExpectedEvent<T> {
pub fn next(&self) -> TestResult<T> {
match self.data.events.borrow_mut().pop_front() {
Some(t) => Ok(t),
_ => bail!("No event occurred"),
}
}
#[allow(dead_code)]
pub fn last(&self) -> TestResult<T> {
match self.data.events.borrow_mut().pop_back() {
Some(t) => Ok(t),
_ => bail!("No event occurred"),
}
}
pub fn none(&self) -> TestResult {
if self.data.events.borrow_mut().is_not_empty() {
bail!("There are unexpected events");
}
Ok(())
}
}
pub struct TestExpectedEventHolder<T> {
data: CloneCell<Option<Rc<TestExpectedEventData<T>>>>,
}
pub type TEEH<T> = Rc<TestExpectedEventHolder<T>>;
impl<T> Default for TestExpectedEventHolder<T> {
fn default() -> Self {
Self {
data: Default::default(),
}
}
}
impl<T> TestExpectedEventHolder<T> {
pub fn expect(self: &Rc<Self>) -> TestResult<TestExpectedEvent<T>> {
if self.data.get().is_some() {
bail!("There is already an expected event data");
}
let data = Rc::new(TestExpectedEventData {
events: Default::default(),
});
self.data.set(Some(data.clone()));
Ok(TestExpectedEvent {
data,
holder: self.clone(),
})
}
pub fn push(&self, t: T) {
if let Some(data) = self.data.get() {
data.events.borrow_mut().push_back(t);
}
}
}
struct TestExpectedEventData<T> {
events: RefCell<VecDeque<T>>,
}
impl<T> Drop for TestExpectedEvent<T> {
fn drop(&mut self) {
self.holder.data.set(None);
}
}