use std::sync::{Arc, Mutex};
pub type VisitorHandle = Arc<Mutex<dyn super::traits::HtmlVisitor + Send>>;
#[cfg(test)]
mod tests {
use super::super::traits::HtmlVisitor;
use super::super::types::{NodeContext, NodeType, VisitResult};
use std::borrow::Cow;
use std::collections::BTreeMap;
#[derive(Debug)]
struct TrackingVisitor {
element_count: usize,
text_count: usize,
}
impl HtmlVisitor for TrackingVisitor {
fn visit_element_start(&mut self, _ctx: &NodeContext<'_>) -> VisitResult {
self.element_count += 1;
VisitResult::Continue
}
fn visit_text(&mut self, _ctx: &NodeContext<'_>, _text: &str) -> VisitResult {
self.text_count += 1;
VisitResult::Continue
}
}
#[test]
fn test_visitor_handle_creation() {
let visitor = TrackingVisitor {
element_count: 0,
text_count: 0,
};
let handle = std::sync::Arc::new(std::sync::Mutex::new(visitor));
{
let mut v = handle.lock().expect("visitor mutex poisoned");
let attrs = BTreeMap::new();
let ctx = NodeContext::with_borrowed_attributes(
NodeType::Text,
Cow::Borrowed("p"),
&attrs,
1,
0,
Some(Cow::Borrowed("div")),
false,
);
v.visit_text(&ctx, "test");
}
let text_count = handle.lock().expect("visitor mutex poisoned").text_count;
assert_eq!(text_count, 1);
}
}