#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum A11yRole {
Window,
Group,
Button,
TextField,
Text,
}
#[derive(Clone, Debug, PartialEq)]
pub struct A11yNode {
pub role: A11yRole,
pub name: String,
pub bounds: (f64, f64, f64, f64),
pub focused: bool,
pub children: Vec<A11yNode>,
}
impl A11yNode {
pub fn count(&self) -> usize {
1 + self.children.iter().map(A11yNode::count).sum::<usize>()
}
}
#[cfg(test)]
mod tests {
use super::*;
fn leaf(role: A11yRole, name: &str) -> A11yNode {
A11yNode {
role,
name: name.to_string(),
bounds: (0.0, 0.0, 0.0, 0.0),
focused: false,
children: Vec::new(),
}
}
#[test]
fn count_includes_all_descendants() {
let root = A11yNode {
role: A11yRole::Window,
name: String::new(),
bounds: (0.0, 0.0, 100.0, 100.0),
focused: false,
children: vec![
leaf(A11yRole::Text, "Title"),
A11yNode {
children: vec![leaf(A11yRole::Button, "OK")],
..leaf(A11yRole::Group, "")
},
],
};
assert_eq!(root.count(), 4);
}
}