tests.rs

  1use std::iter::Iterator;
  2
  3use quick_xml::Reader;
  4
  5use element::Element;
  6
  7const TEST_STRING: &'static str = r#"<?xml version="1.0" encoding="utf-8"?><root xmlns="root_ns" a="b" xml:lang="en">meow<child c="d"/><child xmlns="child_ns" d="e" xml:lang="fr"/>nya</root>"#;
  8
  9fn build_test_tree() -> Element {
 10    let mut root = Element::builder("root")
 11                           .ns("root_ns")
 12                           .attr("xml:lang", "en")
 13                           .attr("a", "b")
 14                           .build();
 15    root.append_text_node("meow");
 16    let child = Element::builder("child")
 17                        .attr("c", "d")
 18                        .build();
 19    root.append_child(child);
 20    let other_child = Element::builder("child")
 21                              .ns("child_ns")
 22                              .attr("d", "e")
 23                              .attr("xml:lang", "fr")
 24                              .build();
 25    root.append_child(other_child);
 26    root.append_text_node("nya");
 27    root
 28}
 29
 30#[cfg(feature = "comments")]
 31const COMMENT_TEST_STRING: &'static str = r#"<?xml version="1.0" encoding="utf-8"?><root><!--This is a child.--><child attr="val"><!--This is a grandchild.--><grandchild/></child></root>"#;
 32
 33#[cfg(feature = "comments")]
 34fn build_comment_test_tree() -> Element {
 35    let mut root = Element::builder("root").build();
 36    root.append_comment_node("This is a child.");
 37    let mut child = Element::builder("child").attr("attr", "val").build();
 38    child.append_comment_node("This is a grandchild.");
 39    let grand_child = Element::builder("grandchild").build();
 40    child.append_child(grand_child);
 41    root.append_child(child);
 42    root
 43}
 44
 45#[test]
 46fn reader_works() {
 47    let mut reader = Reader::from_str(TEST_STRING);
 48    assert_eq!(Element::from_reader(&mut reader).unwrap(), build_test_tree());
 49}
 50
 51#[test]
 52fn writer_works() {
 53    let root = build_test_tree();
 54    let mut writer = Vec::new();
 55    {
 56        root.write_to(&mut writer).unwrap();
 57    }
 58    assert_eq!(String::from_utf8(writer).unwrap(), TEST_STRING);
 59}
 60
 61#[test]
 62fn writer_escapes_attributes() {
 63    let root = Element::builder("root")
 64        .attr("a", "\"Air\" quotes")
 65        .build();
 66    let mut writer = Vec::new();
 67    {
 68        root.write_to(&mut writer).unwrap();
 69    }
 70    assert_eq!(String::from_utf8(writer).unwrap(),
 71               r#"<?xml version="1.0" encoding="utf-8"?><root a="&quot;Air&quot; quotes"/>"#
 72    );
 73}
 74
 75#[test]
 76fn writer_escapes_text() {
 77    let root = Element::builder("root")
 78        .append("<3")
 79        .build();
 80    let mut writer = Vec::new();
 81    {
 82        root.write_to(&mut writer).unwrap();
 83    }
 84    assert_eq!(String::from_utf8(writer).unwrap(),
 85               r#"<?xml version="1.0" encoding="utf-8"?><root>&lt;3</root>"#
 86    );
 87}
 88
 89#[test]
 90fn builder_works() {
 91    let elem = Element::builder("a")
 92                       .ns("b")
 93                       .attr("c", "d")
 94                       .append(Element::builder("child"))
 95                       .append("e")
 96                       .build();
 97    assert_eq!(elem.name(), "a");
 98    assert_eq!(elem.ns(), Some("b".to_owned()));
 99    assert_eq!(elem.attr("c"), Some("d"));
100    assert_eq!(elem.attr("x"), None);
101    assert_eq!(elem.text(), "e");
102    assert!(elem.has_child("child", "b"));
103    assert!(elem.is("a", "b"));
104}
105
106#[test]
107fn children_iter_works() {
108    let root = build_test_tree();
109    let mut iter = root.children();
110    assert!(iter.next().unwrap().is("child", "root_ns"));
111    assert!(iter.next().unwrap().is("child", "child_ns"));
112    assert_eq!(iter.next(), None);
113}
114
115#[test]
116fn get_child_works() {
117    let root = build_test_tree();
118    assert_eq!(root.get_child("child", "inexistent_ns"), None);
119    assert_eq!(root.get_child("not_a_child", "root_ns"), None);
120    assert!(root.get_child("child", "root_ns").unwrap().is("child", "root_ns"));
121    assert!(root.get_child("child", "child_ns").unwrap().is("child", "child_ns"));
122    assert_eq!(root.get_child("child", "root_ns").unwrap().attr("c"), Some("d"));
123    assert_eq!(root.get_child("child", "child_ns").unwrap().attr("d"), Some("e"));
124}
125
126#[test]
127fn namespace_propagation_works() {
128    let mut root = Element::builder("root").ns("root_ns").build();
129    let mut child = Element::bare("child");
130    let grandchild = Element::bare("grandchild");
131    child.append_child(grandchild);
132    root.append_child(child);
133
134    assert_eq!(root.get_child("child", "root_ns").unwrap().ns(), root.ns());
135    assert_eq!(root.get_child("child", "root_ns").unwrap()
136                   .get_child("grandchild", "root_ns").unwrap()
137                   .ns(), root.ns());
138}
139
140#[test]
141fn two_elements_with_same_arguments_different_order_are_equal() {
142    let elem1: Element = "<a b='a' c=''/>".parse().unwrap();
143    let elem2: Element = "<a c='' b='a'/>".parse().unwrap();
144    assert_eq!(elem1, elem2);
145
146    let elem1: Element = "<a b='a' c=''/>".parse().unwrap();
147    let elem2: Element = "<a c='d' b='a'/>".parse().unwrap();
148    assert_ne!(elem1, elem2);
149}
150
151#[test]
152fn namespace_attributes_works() {
153    let mut reader = Reader::from_str(TEST_STRING);
154    let root = Element::from_reader(&mut reader).unwrap();
155    assert_eq!("en", root.attr("xml:lang").unwrap());
156    assert_eq!("fr", root.get_child("child", "child_ns").unwrap().attr("xml:lang").unwrap());
157}
158
159#[test]
160fn wrongly_closed_elements_error() {
161    let elem1 = "<a></b>".parse::<Element>();
162    assert!(elem1.is_err());
163    let elem1 = "<a></c></a>".parse::<Element>();
164    assert!(elem1.is_err());
165    let elem1 = "<a><c><d/></c></a>".parse::<Element>();
166    assert!(elem1.is_ok());
167}
168
169#[test]
170fn namespace_simple() {
171    let elem: Element = "<message xmlns='jabber:client'/>".parse().unwrap();
172    assert_eq!(elem.name(), "message");
173    assert_eq!(elem.ns(), Some("jabber:client".to_owned()));
174}
175
176#[test]
177fn namespace_prefixed() {
178    let elem: Element = "<stream:features xmlns:stream='http://etherx.jabber.org/streams'/>"
179        .parse().unwrap();
180    assert_eq!(elem.name(), "features");
181    assert_eq!(elem.ns(), Some("http://etherx.jabber.org/streams".to_owned()));
182}
183
184#[test]
185fn namespace_inherited_simple() {
186    let elem: Element = "<stream xmlns='jabber:client'><message/></stream>".parse().unwrap();
187    assert_eq!(elem.name(), "stream");
188    assert_eq!(elem.ns(), Some("jabber:client".to_owned()));
189    let child = elem.children().next().unwrap();
190    assert_eq!(child.name(), "message");
191    assert_eq!(child.ns(), Some("jabber:client".to_owned()));
192}
193
194#[test]
195fn namespace_inherited_prefixed1() {
196    let elem: Element = "<stream:features xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client'><message/></stream:features>"
197        .parse().unwrap();
198    assert_eq!(elem.name(), "features");
199    assert_eq!(elem.ns(), Some("http://etherx.jabber.org/streams".to_owned()));
200    let child = elem.children().next().unwrap();
201    assert_eq!(child.name(), "message");
202    assert_eq!(child.ns(), Some("jabber:client".to_owned()));
203}
204
205#[test]
206fn namespace_inherited_prefixed2() {
207    let elem: Element = "<stream xmlns='http://etherx.jabber.org/streams' xmlns:jabber='jabber:client'><jabber:message/></stream>"
208        .parse().unwrap();
209    assert_eq!(elem.name(), "stream");
210    assert_eq!(elem.ns(), Some("http://etherx.jabber.org/streams".to_owned()));
211    let child = elem.children().next().unwrap();
212    assert_eq!(child.name(), "message");
213    assert_eq!(child.ns(), Some("jabber:client".to_owned()));
214}
215
216#[cfg(feature = "comments")]
217#[test]
218fn read_comments() {
219    let mut reader = Reader::from_str(COMMENT_TEST_STRING);
220    assert_eq!(Element::from_reader(&mut reader).unwrap(), build_comment_test_tree());
221}
222
223#[cfg(feature = "comments")]
224#[test]
225fn write_comments() {
226    let root = build_comment_test_tree();
227    let mut writer = Vec::new();
228    {
229        root.write_to(&mut writer).unwrap();
230    }
231    assert_eq!(String::from_utf8(writer).unwrap(), COMMENT_TEST_STRING);
232}
233
234#[test]
235fn xml_error() {
236    match "<a></b>".parse::<Element>() {
237        Err(::error::Error::XmlError(_)) => (),
238        err => panic!("No or wrong error: {:?}", err)
239    }
240
241    match "<a></".parse::<Element>() {
242        Err(::error::Error::XmlError(_)) => (),
243        err => panic!("No or wrong error: {:?}", err)
244    }
245}
246
247#[test]
248fn invalid_element_error() {
249    match "<a:b:c>".parse::<Element>() {
250        Err(::error::Error::InvalidElement) => (),
251        err => panic!("No or wrong error: {:?}", err)
252    }
253}