component: add TestElement to have a custom Debug for Element

Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
Maxime “pep” Buquet 2022-09-17 22:17:26 +02:00
parent ef03c1b032
commit 7554ff4d7c
Signed by: pep
GPG key ID: DEDA74AEECA9D0F2

View file

@ -78,7 +78,7 @@ impl Component {
} }
enum Expect { enum Expect {
Element(Element), Element(TestElement),
Iq(Box<dyn FnOnce(Iq) + Send + 'static>), Iq(Box<dyn FnOnce(Iq) + Send + 'static>),
Presence(Box<dyn FnOnce(Presence) + Send + 'static>), Presence(Box<dyn FnOnce(Presence) + Send + 'static>),
Message(Box<dyn FnOnce(Message) + Send + 'static>), Message(Box<dyn FnOnce(Message) + Send + 'static>),
@ -96,24 +96,86 @@ impl fmt::Debug for Expect {
} }
} }
#[derive(Clone, Eq, PartialEq)]
pub struct TestElement(pub Element);
impl Deref for TestElement {
type Target = Element;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl fmt::Debug for TestElement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", String::from(&self.0))
}
}
impl fmt::Display for TestElement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", String::from(&self.0))
}
}
impl From<&TestElement> for String {
fn from(elem: &TestElement) -> Self {
format!("{}", elem)
}
}
impl From<Element> for TestElement {
fn from(elem: Element) -> Self {
Self(elem)
}
}
impl From<TestElement> for Element {
fn from(elem: TestElement) -> Self {
elem.0
}
}
impl From<Iq> for TestElement {
fn from(elem: Iq) -> Self {
Self(Element::from(elem))
}
}
impl From<Presence> for TestElement {
fn from(elem: Presence) -> Self {
Self(Element::from(elem))
}
}
impl From<Message> for TestElement {
fn from(elem: Message) -> Self {
Self(Element::from(elem))
}
}
#[derive(Debug)] #[derive(Debug)]
pub struct TestComponent { pub struct TestComponent {
in_buffer: VecDeque<Element>, in_buffer: VecDeque<TestElement>,
out_buffer: VecDeque<Element>, out_buffer: VecDeque<TestElement>,
expect_buffer: VecDeque<Expect>, expect_buffer: VecDeque<Expect>,
} }
impl TestComponent { impl TestComponent {
pub fn new(in_buffer: Vec<Element>) -> Self { pub fn new(in_buffer: Vec<Element>) -> Self {
TestComponent { TestComponent {
in_buffer: VecDeque::from(in_buffer), in_buffer: VecDeque::from(in_buffer.into_iter()
.map(|el| TestElement(el))
.collect::<Vec<_>>()
),
out_buffer: VecDeque::new(), out_buffer: VecDeque::new(),
expect_buffer: VecDeque::new(), expect_buffer: VecDeque::new(),
} }
} }
/// Adds elements to be expected, in the order they're being added /// Adds elements to be expected, in the order they're being added
pub fn expect<E: Into<Element>>(&mut self, el: E) { pub fn expect<E: Into<TestElement>>(&mut self, el: E) {
self.expect_buffer.push_back(Expect::Element(el.into())) self.expect_buffer.push_back(Expect::Element(el.into()))
} }
@ -141,9 +203,9 @@ impl TestComponent {
(None, None) => break, (None, None) => break,
(Some(out), Some(expected)) => match expected { (Some(out), Some(expected)) => match expected {
Expect::Element(el) => assert_eq!(String::from(&el), String::from(&out)), Expect::Element(el) => assert_eq!(String::from(&el), String::from(&out)),
Expect::Iq(cb) => cb(Iq::try_from(out).unwrap()), Expect::Iq(cb) => cb(Iq::try_from(out.0).unwrap()),
Expect::Message(cb) => cb(Message::try_from(out).unwrap()), Expect::Message(cb) => cb(Message::try_from(out.0).unwrap()),
Expect::Presence(cb) => cb(Presence::try_from(out).unwrap()), Expect::Presence(cb) => cb(Presence::try_from(out.0).unwrap()),
}, },
(Some(out), None) => panic!("Missing matching expected element: {:?}", out), (Some(out), None) => panic!("Missing matching expected element: {:?}", out),
(None, Some(expected)) => match expected { (None, Some(expected)) => match expected {
@ -156,7 +218,7 @@ impl TestComponent {
} }
} }
fn _send_stanza<E: Into<Element> + Send>(&mut self, el: E) -> Result<(), Error> { fn _send_stanza<E: Into<TestElement> + Send>(&mut self, el: E) -> Result<(), Error> {
Ok(self.out_buffer.push_back(el.into())) Ok(self.out_buffer.push_back(el.into()))
} }
} }
@ -166,7 +228,7 @@ impl Stream for TestComponent {
fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context) -> Poll<Option<Self::Item>> { fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context) -> Poll<Option<Self::Item>> {
while self.in_buffer.len() > 0 { while self.in_buffer.len() > 0 {
return Poll::Ready(self.in_buffer.pop_front()); return Poll::Ready(self.in_buffer.pop_front().map(|el| el.0));
} }
Poll::Ready(None) Poll::Ready(None)
@ -176,13 +238,13 @@ impl Stream for TestComponent {
#[async_trait] #[async_trait]
impl ComponentTrait for TestComponent { impl ComponentTrait for TestComponent {
async fn send_stanza<E: Into<Element> + Send>(&mut self, el: E) -> Result<(), Error> { async fn send_stanza<E: Into<Element> + Send>(&mut self, el: E) -> Result<(), Error> {
self._send_stanza(el) self._send_stanza(el.into())
} }
} }
#[async_trait] #[async_trait]
impl ComponentTrait for &mut TestComponent { impl ComponentTrait for &mut TestComponent {
async fn send_stanza<E: Into<Element> + Send>(&mut self, el: E) -> Result<(), Error> { async fn send_stanza<E: Into<Element> + Send>(&mut self, el: E) -> Result<(), Error> {
self._send_stanza(el) self._send_stanza(el.into())
} }
} }