use xml_doc::{Document, Error, Node, ReadOptions}; #[test] fn test_normalize_attr() { // See comment on xml_doc::parser::DocumentParser::normalize_attr_value let xml = " "; let doc = Document::parse_str(xml).unwrap(); let root = doc.root_element().unwrap(); let val = root.attribute(&doc, "attr").unwrap(); assert_eq!(val, "ab\r c"); } #[test] fn test_closing_tag_mismatch_err() { // no closing tag let xml = ""; let mut opts = ReadOptions::default(); opts.require_decl = false; let doc = Document::parse_str_with_opts(xml, opts.clone()); assert!(matches!(doc.unwrap_err(), Error::MalformedXML(_))); // closing tag mismatch let xml = "Text"; let doc = Document::parse_str_with_opts(xml, opts.clone()); assert!(matches!(doc.unwrap_err(), Error::MalformedXML(_))); // no opening tag let xml = ""; let doc = Document::parse_str_with_opts(xml, opts.clone()); assert!(matches!(doc.unwrap_err(), Error::MalformedXML(_))); } #[test] fn test_unescape() { let xml = r#"<Text&'> ]]> "#; let mut opts = ReadOptions::default(); opts.require_decl = false; let doc = Document::parse_str_with_opts(xml, opts).unwrap(); let abc = doc.root_element().unwrap(); assert_eq!(abc.attribute(&doc, "attr"), Some("\"val\"")); let text = &abc.children(&doc)[0]; assert!(matches!(text, Node::Text(_))); assert_eq!(text.text_content(&doc), ""); let cdata = &doc.root_nodes()[1]; assert!(matches!(cdata, Node::CData(_))); assert_eq!(cdata.text_content(&doc), "<&>"); let comment = &doc.root_nodes()[2]; if let Node::Comment(cmt) = comment { assert_eq!(cmt, " <& cmt "); } else { assert!(false); } let doctype = &doc.root_nodes()[3]; if let Node::DocType(doc) = doctype { assert_eq!(doc, "&"); } else { assert!(false); } let pi = &doc.root_nodes()[4]; assert!(matches!(pi, Node::PI(_))); assert_eq!(pi.text_content(&doc), "<&"); }