use libxml::parser::Parser;
use libxml::tree::{Document, Node, NodeType};
#[test]
fn free_subtree_neutralizes_held_wrappers() {
let parser = Parser::default();
let doc = parser
.parse_string("<r><a x=\"1\"><b>text</b></a><c/></r>".as_bytes())
.expect("parse");
let root = doc.get_root_element().expect("root");
let a = root.get_first_element_child().expect("a");
let b = a.get_first_element_child().expect("b");
let b_clone = b.clone();
a.free_subtree();
let remaining = root.get_first_element_child().expect("c stays");
assert_eq!(remaining.get_name(), "c");
assert!(b_clone.get_type().is_none(), "neutralized wrapper has no type");
assert_eq!(b_clone.get_name(), "", "null-guarded accessors go empty");
drop(doc);
drop(b_clone);
}
#[test]
fn free_subtree_frees_detached_tree() {
let parser = Parser::default();
let doc = parser
.parse_string("<r><a><b/></a></r>".as_bytes())
.expect("parse");
let root = doc.get_root_element().expect("root");
let mut a = root.get_first_element_child().expect("a");
let b = a.get_first_element_child().expect("b");
a.unlink_node();
a.free_subtree();
assert!(b.get_type().is_none(), "detached descendant neutralized");
assert!(root.get_first_element_child().is_none());
}
#[test]
fn free_subtree_frees_built_tree() {
let mut doc = Document::new().expect("new doc");
let root = Node::new("r", None, &doc).expect("root");
doc.set_root_element(&root);
let mut shell = Node::new("shell", None, &doc).expect("shell");
let mut inner = Node::new("inner", None, &doc).expect("inner");
shell.add_child(&mut inner).expect("add");
let inner_clone = inner.clone();
shell.free_subtree();
assert!(inner_clone.get_type().is_none());
assert_eq!(root.get_name(), "r");
}
#[test]
fn free_subtree_second_call_is_noop() {
let parser = Parser::default();
let doc = parser
.parse_string("<r><a/></r>".as_bytes())
.expect("parse");
let root = doc.get_root_element().expect("root");
let a = root.get_first_element_child().expect("a");
let a_clone = a.clone();
a.free_subtree();
a_clone.free_subtree(); }
#[test]
fn free_subtree_refuses_documents() {
let parser = Parser::default();
let doc = parser.parse_string("<r/>".as_bytes()).expect("parse");
let root = doc.get_root_element().expect("root");
if let Some(doc_node) = root.get_parent() {
assert_eq!(doc_node.get_type(), Some(NodeType::DocumentNode));
doc_node.free_subtree(); }
assert_eq!(doc.get_root_element().expect("root").get_name(), "r");
}