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=""Air" 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><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}