use { crate::{it::test_error::TestResult, utils::clonecell::CloneCell}, isnt::std_1::collections::IsntVecDequeExt, std::{cell::RefCell, collections::VecDeque, rc::Rc}, }; pub struct TestExpectedEvent { data: Rc>, holder: Rc>, } impl TestExpectedEvent { pub fn next(&self) -> TestResult { match self.data.events.borrow_mut().pop_front() { Some(t) => Ok(t), _ => bail!("No event occurred"), } } #[allow(dead_code)] pub fn last(&self) -> TestResult { 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 { data: CloneCell>>>, } pub type TEEH = Rc>; impl Default for TestExpectedEventHolder { fn default() -> Self { Self { data: Default::default(), } } } impl TestExpectedEventHolder { pub fn expect(self: &Rc) -> TestResult> { 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 { events: RefCell>, } impl Drop for TestExpectedEvent { fn drop(&mut self) { self.holder.data.set(None); } }