virtual_node/
test_utils.rs

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