use xot::{Error, Value, Xot}; #[test] fn test_manipulate_text() { let mut xot = Xot::new(); let doc = xot.parse(r#"Data"#).unwrap(); let text_id = xot.first_child(xot.document_element(doc).unwrap()).unwrap(); if let Value::Text(node) = xot.value_mut(text_id) { node.set("Changed"); } assert_eq!(xot.to_string(doc).unwrap(), r#"Changed"#); } #[test] fn test_manipulate_attribute() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let a = xot.name("a").unwrap(); let mut attributes = xot.attributes_mut(el_id); attributes.insert(a, "Changed".to_string()); assert_eq!(xot.to_string(doc).unwrap(), r#""#); } #[test] fn test_add_attribute() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); assert!(xot.name("z").is_none()); let z = xot.add_name("z"); let mut attributes = xot.attributes_mut(el_id); attributes.insert(z, "Created".to_string()); assert_eq!(xot.to_string(doc).unwrap(), r#""#); } #[test] fn test_manipulate_attribute_ns() { let mut xot = Xot::new(); let doc = xot .parse(r#""#) .unwrap(); let el_id = xot.document_element(doc).unwrap(); let ns = xot.namespace("http://example.com").unwrap(); let a = xot.name_ns("a", ns).unwrap(); let mut attributes = xot.attributes_mut(el_id); attributes.insert(a, "Changed".to_string()); assert_eq!( xot.to_string(doc).unwrap(), r#""# ); } #[test] fn test_add_attribute_ns() { let mut xot = Xot::new(); let doc = xot .parse(r#""#) .unwrap(); let el_id = xot.document_element(doc).unwrap(); let ns = xot.namespace("http://example.com").unwrap(); assert!(xot.name_ns("a", ns).is_none()); let a = xot.add_name_ns("a", ns); let mut attributes = xot.attributes_mut(el_id); attributes.insert(a, "Created".to_string()); assert_eq!( xot.to_string(doc).unwrap(), r#""# ); } #[test] fn test_append_element() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let name = xot.add_name("a"); xot.append_element(el_id, name).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#""#); } #[test] fn test_prepend_element() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let name = xot.add_name("a"); let new_el_id = xot.new_element(name); xot.prepend(el_id, new_el_id).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#""#); } #[test] fn test_insert_before_element() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let before_id = xot.first_child(el_id).unwrap(); let name = xot.add_name("a"); let new_el_id = xot.new_element(name); xot.insert_before(before_id, new_el_id).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#""#); } #[test] fn test_insert_after_element() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let before_id = xot.first_child(el_id).unwrap(); let name = xot.add_name("a"); let new_el_id = xot.new_element(name); xot.insert_after(before_id, new_el_id).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#""#); } #[test] fn test_append_text() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); xot.append_text(el_id, "Changed").unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#"Changed"#); } #[test] fn test_cannot_append_under_text() { let mut xot = Xot::new(); let doc = xot.parse(r#"text"#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let txt_id = xot.first_child(el_id).unwrap(); assert!(xot.append_text(txt_id, "Changed").is_err()); } #[test] fn test_append_text_after_text_consolidates_nodes() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); xot.append_text(el_id, "Alpha").unwrap(); xot.append_text(el_id, "Beta").unwrap(); match xot.value(xot.first_child(el_id).unwrap()) { Value::Text(node) => assert_eq!(node.get(), "AlphaBeta"), _ => panic!("Expected text node"), } assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaBeta"#); } #[test] fn test_append_text_after_text_no_consolidates_nodes() { let mut xot = Xot::new(); xot.set_text_consolidation(false); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); xot.append_text(el_id, "Alpha").unwrap(); xot.append_text(el_id, "Beta").unwrap(); let mut children = xot.children(el_id); assert_eq!(xot.text_str(children.next().unwrap()).unwrap(), "Alpha"); assert_eq!(xot.text_str(children.next().unwrap()).unwrap(), "Beta"); assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaBeta"#); } #[test] fn test_append_text_after_text_consolidates_nodes_direct_append() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let txt1 = xot.new_text("Alpha"); let txt2 = xot.new_text("Beta"); xot.append(el_id, txt1).unwrap(); xot.append(el_id, txt2).unwrap(); match xot.value(xot.first_child(el_id).unwrap()) { Value::Text(node) => assert_eq!(node.get(), "AlphaBeta"), _ => panic!("Expected text node"), } assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaBeta"#); } #[test] fn test_append_text_after_text_no_consolidates_nodes_direct_append() { let mut xot = Xot::new(); xot.set_text_consolidation(false); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let txt1 = xot.new_text("Alpha"); let txt2 = xot.new_text("Beta"); xot.append(el_id, txt1).unwrap(); xot.append(el_id, txt2).unwrap(); let mut children = xot.children(el_id); assert_eq!(xot.text_str(children.next().unwrap()).unwrap(), "Alpha"); assert_eq!(xot.text_str(children.next().unwrap()).unwrap(), "Beta"); assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaBeta"#); } #[test] fn test_insert_before_consolidate_text() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let el_id = xot.first_child(xot.document_element(doc).unwrap()).unwrap(); let txt = xot.new_text("Beta"); xot.insert_before(el_id, txt).unwrap(); assert_eq!(xot.text(el_id).map(|n| n.get()), Some("BetaAlpha")); assert_eq!(xot.to_string(doc).unwrap(), r#"BetaAlpha"#); } #[test] fn test_insert_after_consolidate_text() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let el_id = xot.first_child(xot.document_element(doc).unwrap()).unwrap(); let txt = xot.new_text("Beta"); xot.insert_after(el_id, txt).unwrap(); assert_eq!(xot.text(el_id).map(|n| n.get()), Some("AlphaBeta")); assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaBeta"#); } #[test] fn test_prepend_consolidate_text() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let txt = xot.new_text("Beta"); xot.prepend(el_id, txt).unwrap(); let text_el_id = xot.first_child(el_id).unwrap(); assert_eq!(xot.text(text_el_id).map(|n| n.get()), Some("BetaAlpha")); assert_eq!(xot.to_string(doc).unwrap(), r#"BetaAlpha"#); } #[test] fn test_root_node_append_extra_element() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let name = xot.add_name("a"); xot.append_element(doc, name).unwrap(); assert!(xot.validate_well_formed_document(doc).is_err()); assert_eq!(xot.children(doc).count(), 2); } #[test] fn test_root_node_element_insert_before() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let el_id = xot.document_element(doc).unwrap(); let name = xot.add_name("a"); let new_el_id = xot.new_element(name); xot.insert_before(el_id, new_el_id).unwrap(); assert!(xot.validate_well_formed_document(doc).is_err()); assert_eq!(xot.children(doc).count(), 2); } #[test] fn test_root_node_append_comment() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); xot.append_comment(doc, "hello").unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#""#); } #[test] fn test_remove_text_consolidation() { let mut xot = Xot::new(); let doc = xot.parse(r#"AlphaBeta"#).unwrap(); let el_id = xot .children(xot.document_element(doc).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(el_id).unwrap().name(), a); // now we remove it xot.remove(el_id).unwrap(); // we should have a single text node let text_el_id = xot.first_child(xot.document_element(doc).unwrap()).unwrap(); assert_eq!(xot.text_str(text_el_id), Some("AlphaBeta")); assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaBeta"#); } #[test] fn test_remove_text_no_consolidation() { let mut xot = Xot::new(); xot.set_text_consolidation(false); let doc = xot.parse(r#"AlphaBeta"#).unwrap(); let el_id = xot .children(xot.document_element(doc).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(el_id).unwrap().name(), a); // now we remove it xot.remove(el_id).unwrap(); // we have two children let mut children = xot.children(xot.document_element(doc).unwrap()); assert_eq!(xot.text_str(children.next().unwrap()).unwrap(), "Alpha"); assert_eq!(xot.text_str(children.next().unwrap()).unwrap(), "Beta"); assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaBeta"#); } #[test] fn test_remove_root() { let mut xot = Xot::new(); let doc = xot.parse(r#"AlphaBeta"#).unwrap(); xot.remove(doc).unwrap(); } #[test] fn test_move_text_consolidation() { let mut xot = Xot::new(); let doc_a = xot.parse(r#""#).unwrap(); let doc_b = xot.parse(r#"AlphaBeta"#).unwrap(); let a_id = xot .children(xot.document_element(doc_b).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(a_id).unwrap().name(), a); // now we append it into doc_a let doc_a_root = xot.document_element(doc_a).unwrap(); xot.append(doc_a_root, a_id).unwrap(); // we should have a single text node in b let text_el_id = xot .first_child(xot.document_element(doc_b).unwrap()) .unwrap(); assert_eq!(xot.text_str(text_el_id), Some("AlphaBeta")); assert_eq!(xot.to_string(doc_a).unwrap(), r#""#); assert_eq!(xot.to_string(doc_b).unwrap(), r#"AlphaBeta"#); } #[test] fn test_move_as_document_element() { let mut xot = Xot::new(); let doc_a = xot.parse(r#""#).unwrap(); let doc_b = xot.parse(r#""#).unwrap(); let el_a = xot.document_element(doc_a).unwrap(); let el_b = xot.document_element(doc_b).unwrap(); xot.append(el_a, el_b).unwrap(); // this hasn't changed assert_eq!(xot.children(doc_a).count(), 1); // here the node was added assert_eq!(xot.children(el_a).count(), 1); // but this element is gone, turning this into a fragment assert_eq!(xot.children(doc_b).count(), 0); assert!(xot.validate_well_formed_document(doc_b).is_err()); } #[test] fn test_clone() { let mut xot = Xot::new(); let root = xot.parse(r#"Hello!"#).unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let a_id_clone = xot.clone_node(a_id); // change original won't affect the clone xot.text_mut(xot.first_child(a_id).unwrap()) .unwrap() .set("Goodbye!"); assert_eq!( xot.to_string(root).unwrap(), r#"Goodbye!"# ); assert!(!xot.is_removed(a_id_clone)); assert_eq!(xot.to_string(a_id_clone).unwrap(), r#"Hello!"#); } #[test] fn test_clone_root() { let mut xot = Xot::new(); let root = xot.parse(r#"Hello!"#).unwrap(); let root_clone = xot.clone_node(root); assert_eq!( xot.to_string(root_clone).unwrap(), r#"Hello!"# ); } #[test] fn test_clone_root_after_insert() { let mut xot = Xot::new(); let root = xot.parse("hello world!").unwrap(); let doc = xot.document_element(root).unwrap(); let txt = xot.first_child(doc).unwrap(); let i = xot.next_sibling(txt).unwrap(); let new_node = xot.new_text("?"); xot.insert_after(i, new_node).unwrap(); let root_clone = xot.clone_node(root); assert_eq!( xot.to_string(root_clone).unwrap(), "hello world?!" ); } #[test] fn test_clone_root_after_insert_no_consolidation() { let mut xot = Xot::new(); xot.set_text_consolidation(false); let root = xot.parse("hello world!").unwrap(); let doc = xot.document_element(root).unwrap(); let txt = xot.first_child(doc).unwrap(); let i = xot.next_sibling(txt).unwrap(); let new_node = xot.new_text("?"); xot.insert_after(i, new_node).unwrap(); let root_clone = xot.clone_node(root); xot.set_text_consolidation(true); assert_eq!( xot.to_string(root_clone).unwrap(), "hello world?!" ); } #[test] fn test_clone_root_after_insert_no_consolidation_for_insert_consolidation_for_clone() { let mut xot = Xot::new(); xot.set_text_consolidation(false); let root = xot.parse("hello world!").unwrap(); let doc = xot.document_element(root).unwrap(); let txt = xot.first_child(doc).unwrap(); let i = xot.next_sibling(txt).unwrap(); let new_node = xot.new_text("?"); xot.insert_after(i, new_node).unwrap(); xot.set_text_consolidation(true); let root_clone = xot.clone_node(root); assert_eq!( xot.to_string(root_clone).unwrap(), "hello world?!" ); } #[test] fn test_clone_attributes() { let mut xot = Xot::new(); let root = xot.parse(r#"Hello!"#).unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let a_id_clone = xot.clone_node(a_id); // change original won't affect the clone xot.text_mut(xot.first_child(a_id).unwrap()) .unwrap() .set("Goodbye!"); assert_eq!( xot.to_string(root).unwrap(), r#"Goodbye!"# ); assert!(!xot.is_removed(a_id_clone)); assert_eq!(xot.to_string(a_id_clone).unwrap(), r#"Hello!"#); } #[test] fn test_clone_attribute_node() { let mut xot = Xot::new(); let f = xot.add_name("f"); let root = xot.parse(r#"Hello!"#).unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let attribute_node = xot.attributes(a_id).get_node(f).unwrap(); let attribute_node = xot.clone_node(attribute_node); // change original won't affect the clone xot.attributes_mut(a_id).insert(f, "Changed".to_string()); if let Value::Attribute(attribute) = xot.value(attribute_node) { assert_eq!(attribute.value(), "F"); } else { panic!("Expected attribute node"); } } #[test] fn test_clone_namespaces() { let mut xot = Xot::new(); let root = xot .parse(r#"Hello!"#) .unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let a_id_clone = xot.clone_node(a_id); // change original won't affect the clone xot.text_mut(xot.first_child(a_id).unwrap()) .unwrap() .set("Goodbye!"); assert_eq!( xot.to_string(root).unwrap(), r#"Goodbye!"# ); assert!(!xot.is_removed(a_id_clone)); assert_eq!( xot.to_string(a_id_clone).unwrap(), r#"Hello!"# ); } #[test] fn test_clone_namespace_node() { let mut xot = Xot::new(); let f = xot.add_prefix("f"); let f_namespace = xot.add_namespace("F"); let dummy = xot.add_namespace("http://example.com"); let root = xot .parse(r#"Hello!"#) .unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let namespace_node = xot.namespaces(a_id).get_node(f).unwrap(); let namespace_node = xot.clone_node(namespace_node); // change original won't affect the clone xot.namespaces_mut(a_id).insert(f, dummy); if let Value::Namespace(namespace) = xot.value(namespace_node) { assert_eq!(namespace.namespace(), f_namespace); } else { panic!("Expected namespace node"); } } #[test] fn test_insert_after_consolidation() { let mut xot = Xot::new(); let root = xot.parse("hello world!").unwrap(); let doc = xot.document_element(root).unwrap(); let txt = xot.first_child(doc).unwrap(); let i = xot.next_sibling(txt).unwrap(); let new_node = xot.new_text("?"); xot.insert_after(i, new_node).unwrap(); assert_eq!(xot.children(doc).count(), 3); } #[test] fn test_clone_with_namespaces() { let mut xot = Xot::new(); let root = xot .parse(r#"Hello!"#) .unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let a_id_clone = xot.clone_node(a_id); // change original won't affect the clone xot.text_mut(xot.first_child(a_id).unwrap()) .unwrap() .set("Goodbye!"); assert_eq!( xot.to_string(root).unwrap(), r#"Goodbye!"# ); assert!(!xot.is_removed(a_id_clone)); xot.create_missing_prefixes(a_id_clone).unwrap(); assert_eq!( xot.to_string(a_id_clone).unwrap(), r#"Hello!"# ); } #[test] fn test_clone_with_prefixes() { let mut xot = Xot::new(); let root = xot .parse(r#"Hello!"#) .unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let a_id_clone = xot.clone_with_prefixes(a_id); // change original won't affect the clone xot.text_mut(xot.first_child(a_id).unwrap()) .unwrap() .set("Goodbye!"); assert_eq!( xot.to_string(root).unwrap(), r#"Goodbye!"# ); assert!(!xot.is_removed(a_id_clone)); assert_eq!( xot.to_string(a_id_clone).unwrap(), r#"Hello!"# ); } #[test] fn test_clone_with_prefixes_only_necessary_ones() { let mut xot = Xot::new(); let root = xot .parse(r#"Hello!"#) .unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let a_id_clone = xot.clone_with_prefixes(a_id); assert_eq!( xot.to_string(a_id_clone).unwrap(), r#"Hello!"# ); } #[test] fn test_clone_with_prefixes_non_element() { let mut xot = Xot::new(); let root = xot .parse(r#"Hello!"#) .unwrap(); let doc_id = xot.document_element(root).unwrap(); let a_id = xot.first_child(doc_id).unwrap(); let text_id = xot.first_child(a_id).unwrap(); let text_id_clone = xot.clone_with_prefixes(text_id); // change original won't affect the clone xot.text_mut(xot.first_child(a_id).unwrap()) .unwrap() .set("Goodbye!"); assert_eq!( xot.to_string(root).unwrap(), r#"Goodbye!"# ); assert_eq!(xot.text(text_id_clone).unwrap().get(), "Hello!"); } #[test] fn test_clone_fragment() { let mut xot = Xot::new(); let root = xot.parse_fragment(r#"text"#).unwrap(); let root_clone = xot.clone_node(root); assert_eq!(xot.to_string(root_clone).unwrap(), r#"text"#); } #[test] fn test_element_unwrap() { let mut xot = Xot::new(); let doc = xot .parse(r#""#) .unwrap(); let el_id = xot .children(xot.document_element(doc).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(el_id).unwrap().name(), a); // now we unwrap it xot.element_unwrap(el_id).unwrap(); assert_eq!( xot.to_string(doc).unwrap(), r#""# ); } #[test] fn test_element_unwrap_with_attribute() { let mut xot = Xot::new(); let doc = xot.parse(r#"Hello"#).unwrap(); let document_el = xot.document_element(doc).unwrap(); let a_el = xot.first_child(document_el).unwrap(); // now we unwrap it xot.element_unwrap(a_el).unwrap(); assert_eq!(xot.descendants(doc).count(), 3); assert_eq!(xot.to_string(doc).unwrap(), r#"Hello"#); } #[test] fn test_element_unwrap_consolidation_single_element() { let mut xot = Xot::new(); let doc = xot.parse(r#"AlphaBeta"#).unwrap(); let el_id = xot .children(xot.document_element(doc).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(el_id).unwrap().name(), a); // now we unwrap it xot.element_unwrap(el_id).unwrap(); // we should have a single text node let text_el_id = xot.first_child(xot.document_element(doc).unwrap()).unwrap(); assert_eq!(xot.text_str(text_el_id), Some("AlphaBeta")); assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaBeta"#); } #[test] fn test_element_unwrap_consolidation_text_in_element() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha!Beta"#).unwrap(); let el_id = xot .children(xot.document_element(doc).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(el_id).unwrap().name(), a); // now we unwrap it xot.element_unwrap(el_id).unwrap(); // we should have a single text node let text_el_id = xot.first_child(xot.document_element(doc).unwrap()).unwrap(); assert_eq!(xot.text_str(text_el_id), Some("Alpha!Beta")); assert_eq!(xot.to_string(doc).unwrap(), r#"Alpha!Beta"#); } #[test] fn test_element_unwrap_consolidation_text_in_element_at_beginning() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha!Beta"#).unwrap(); let el_id = xot .children(xot.document_element(doc).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(el_id).unwrap().name(), a); // now we unwrap it xot.element_unwrap(el_id).unwrap(); let text_el_id = xot.first_child(xot.document_element(doc).unwrap()).unwrap(); assert_eq!(xot.text_str(text_el_id), Some("Alpha!")); assert_eq!(xot.to_string(doc).unwrap(), r#"Alpha!Beta"#); } #[test] fn test_element_unwrap_consolidation_text_in_element_at_end() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha!Beta"#).unwrap(); let el_id = xot .children(xot.document_element(doc).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(el_id).unwrap().name(), a); // now we unwrap it xot.element_unwrap(el_id).unwrap(); let text_el_id = xot.last_child(xot.document_element(doc).unwrap()).unwrap(); assert_eq!(xot.text_str(text_el_id), Some("!Beta")); assert_eq!(xot.to_string(doc).unwrap(), r#"Alpha!Beta"#); } #[test] fn test_element_unwrap_consolidation_text_in_element_both_ends() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha?!Beta"#).unwrap(); let el_id = xot .children(xot.document_element(doc).unwrap()) .nth(1) .unwrap(); // we found the a element let a = xot.name("a").unwrap(); assert_eq!(xot.element(el_id).unwrap().name(), a); // now we unwrap it xot.element_unwrap(el_id).unwrap(); let text_el_id = xot.first_child(xot.document_element(doc).unwrap()).unwrap(); assert_eq!(xot.text_str(text_el_id), Some("Alpha?")); let text_el_id = xot.last_child(xot.document_element(doc).unwrap()).unwrap(); assert_eq!(xot.text_str(text_el_id), Some("!Beta")); assert_eq!(xot.to_string(doc).unwrap(), r#"Alpha?!Beta"#); } #[test] fn test_element_unwrap_document_element() { let mut xot = Xot::new(); let doc = xot.parse(r#"

Hello

"#).unwrap(); let document_element = xot.document_element(doc).unwrap(); xot.element_unwrap(document_element).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#"

Hello

"#); } #[test] fn test_element_unwrap_document_element_multiple_children() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let document_element = xot.document_element(doc).unwrap(); xot.element_unwrap(document_element).unwrap(); assert!(xot.children(doc).count() == 2); } #[test] fn test_element_unwrap_document_element_text_child() { let mut xot = Xot::new(); let doc = xot.parse(r#"Text"#).unwrap(); let document_element = xot.document_element(doc).unwrap(); xot.element_unwrap(document_element).unwrap(); let first_child = xot.first_child(doc).unwrap(); assert!(xot.text_str(first_child).unwrap() == "Text"); } #[test] fn test_element_wrap() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let txt_el = xot.first_child(doc_el).unwrap(); let name_p = xot.add_name("p"); xot.element_wrap(txt_el, name_p).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#"

Alpha

"#); } #[test] fn test_element_wrap_middle() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let txt_el = xot.children(doc_el).nth(1).unwrap(); let name_p = xot.add_name("p"); xot.element_wrap(txt_el, name_p).unwrap(); assert_eq!( xot.to_string(doc).unwrap(), r#"

Alpha

"# ); } #[test] fn test_element_wrap_document_element() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let name_p = xot.add_name("p"); xot.element_wrap(doc_el, name_p).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#"

Alpha

"#); } #[test] fn test_element_wrap_element_under_root_not_document_element() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let comment_el = xot.first_child(doc).unwrap(); let name_p = xot.add_name("p"); assert!(xot.element_wrap(comment_el, name_p).is_err()); } #[test] fn test_element_wrap_standalone_element() { let mut xot = Xot::new(); let element_name = xot.add_name("element"); let element = xot.new_element(element_name); let name_p = xot.add_name("p"); let wrapper = xot.element_wrap(element, name_p).unwrap(); assert_eq!(xot.to_string(wrapper).unwrap(), r#"

"#); } #[test] fn test_replace_node() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let replaced = xot.first_child(doc_el).unwrap(); let name_p = xot.add_name("p"); let replacing = xot.new_element(name_p); xot.replace(replaced, replacing).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#"

"#); } #[test] fn test_replace_document_element() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let name_p = xot.add_name("p"); let replacing = xot.new_element(name_p); xot.replace(doc_el, replacing).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#"

"#); } #[test] fn test_replace_document_element_with_text() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let replacing = xot.new_text("Sneaky"); // we replace the document element with a text node xot.replace(doc_el, replacing).unwrap(); // this is allowed, but it won't be well-formed anymore assert!(xot.validate_well_formed_document(doc).is_err()); } #[test] fn test_detach() { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let detached = xot.first_child(doc_el).unwrap(); xot.detach(detached).unwrap(); assert_eq!(xot.to_string(doc).unwrap(), r#""#); assert_eq!(xot.to_string(detached).unwrap(), r#""#); } #[test] fn test_replace_node_reconciliate_text_before() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let replaced = xot.children(doc_el).nth(1).unwrap(); let replacing = xot.new_text("X"); xot.replace(replaced, replacing).unwrap(); let found = xot.first_child(doc_el).unwrap(); assert_eq!(xot.text_str(found), Some("AlphaX")); assert_eq!(xot.to_string(doc).unwrap(), r#"AlphaX"#); } #[test] fn test_replace_node_reconciliate_text_after() { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let doc_el = xot.document_element(doc).unwrap(); let replaced = xot.first_child(doc_el).unwrap(); let replacing = xot.new_text("X"); xot.replace(replaced, replacing).unwrap(); let found = xot.first_child(doc_el).unwrap(); assert_eq!(xot.text_str(found), Some("XAlpha")); assert_eq!(xot.to_string(doc).unwrap(), r#"XAlpha"#); } #[test] fn test_replace_node_reconciliates_where_detached() { let mut xot = Xot::new(); let doc_a = xot.parse(r#""#).unwrap(); let doc_a_el = xot.document_element(doc_a).unwrap(); let replaced = xot.first_child(doc_a_el).unwrap(); let doc_b = xot.parse(r#"ab"#).unwrap(); let doc_b_el = xot.document_element(doc_b).unwrap(); let replacing = xot.children(doc_b_el).nth(1).unwrap(); xot.replace(replaced, replacing).unwrap(); let found = xot.first_child(doc_b_el).unwrap(); assert_eq!(xot.text_str(found), Some("ab")); assert_eq!(xot.to_string(doc_a).unwrap(), r#""#); assert_eq!(xot.to_string(doc_b).unwrap(), r#"ab"#); } #[test] fn test_new_root() -> Result<(), Error> { let mut xot = Xot::new(); let name = xot.add_name("doc"); let doc_el = xot.new_element(name); let root = xot.new_document_with_element(doc_el)?; assert_eq!(xot.to_string(root).unwrap(), r#""#); Ok(()) } #[test] fn test_prepend_with_attributes() -> Result<(), Error> { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let document_element = xot.document_element(doc)?; let name = xot.add_name("c"); let new_el = xot.new_element(name); xot.prepend(document_element, new_el)?; assert_eq!(xot.to_string(doc)?, r#""#); Ok(()) } #[test] fn test_prepend_with_namespaces() -> Result<(), Error> { let mut xot = Xot::new(); let doc = xot.parse(r#""#).unwrap(); let document_element = xot.document_element(doc)?; let name = xot.add_name("c"); let new_el = xot.new_element(name); xot.prepend(document_element, new_el)?; assert_eq!( xot.to_string(doc)?, r#""# ); Ok(()) } #[test] fn test_prepend_text_with_attributes() -> Result<(), Error> { let mut xot = Xot::new(); let doc = xot.parse(r#"Alpha"#).unwrap(); let document_element = xot.document_element(doc)?; let new_txt = xot.new_text("Beta"); xot.prepend(document_element, new_txt)?; assert_eq!(xot.to_string(doc)?, r#"BetaAlpha"#); assert_eq!(xot.children(document_element).count(), 1); Ok(()) }