Skip to main content

virtual_node/
test_utils.rs

1//! A collection of functions that are useful for unit testing your html! views.
2
3use crate::event::RealDom;
4use crate::VirtualNode;
5
6impl<Handle: RealDom> VirtualNode<Handle> {
7    /// Get a vector of all of the VirtualNode children / grandchildren / etc of
8    /// your virtual_node.
9    ///
10    /// Children are visited recursively depth first.
11    ///
12    /// # Examples
13    ///
14    /// ```rust,ignore
15    /// # #[macro_use] extern crate percy_dom;  fn main() {
16    /// let component = html! {
17    ///  <div>
18    ///    <span> {"Hi!"} </span>
19    ///    <em> {"There!!"} </em>
20    ///    <div> {"My Friend"} </div>
21    ///  </div>
22    /// };
23    ///
24    /// let children = component.children_recursive();
25    ///
26    /// assert_eq!(children[2].tag(), "em");
27    /// # }
28    /// ```
29    pub fn children_recursive<'a>(&'a self) -> Vec<&'a VirtualNode<Handle>> {
30        let mut descendants: Vec<&'a VirtualNode<Handle>> = vec![];
31        match self {
32            VirtualNode::Text(_) => {}
33            VirtualNode::Element(element_node) => {
34                for child in element_node.children.iter() {
35                    get_descendants(&mut descendants, child);
36                }
37            }
38        }
39
40        descendants.into_iter().collect()
41    }
42}
43
44fn get_descendants<'a, Handle: RealDom>(
45    descendants: &mut Vec<&'a VirtualNode<Handle>>,
46    node: &'a VirtualNode<Handle>,
47) {
48    descendants.push(node);
49    match node {
50        VirtualNode::Text(_) => {}
51        VirtualNode::Element(element_node) => {
52            for child in element_node.children.iter() {
53                get_descendants(descendants, child);
54            }
55        }
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62    use crate::VirtualElement;
63
64    /// Verify that we can return all of a node's descendants.
65    #[test]
66    fn children_recursive() {
67        let span = VirtualNode::<()>::new_element("span");
68
69        let mut em = VirtualElement::new("em");
70        em.children.push(span);
71
72        let mut html = VirtualElement::new("div");
73        html.children.push(em.into());
74
75        let html_node = VirtualNode::Element(html);
76
77        assert_eq!(html_node.children_recursive().len(), 2);
78    }
79}