1use std::iter::Iterator;
2
3use quick_xml::reader::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#[test]
31fn reader_works() {
32 let mut reader = Reader::from_str(TEST_STRING);
33 assert_eq!(Element::from_reader(&mut reader).unwrap(), build_test_tree());
34}
35
36#[test]
37fn writer_works() {
38 let root = build_test_tree();
39 let mut writer = Vec::new();
40 {
41 root.write_to(&mut writer).unwrap();
42 }
43 assert_eq!(String::from_utf8(writer).unwrap(), TEST_STRING);
44}
45
46#[test]
47fn builder_works() {
48 let elem = Element::builder("a")
49 .ns("b")
50 .attr("c", "d")
51 .append(Element::builder("child"))
52 .append("e")
53 .build();
54 assert_eq!(elem.name(), "a");
55 assert_eq!(elem.ns(), Some("b"));
56 assert_eq!(elem.attr("c"), Some("d"));
57 assert_eq!(elem.attr("x"), None);
58 assert_eq!(elem.text(), "e");
59 assert!(elem.has_child("child", "b"));
60 assert!(elem.is("a", "b"));
61}
62
63#[test]
64fn children_iter_works() {
65 let root = build_test_tree();
66 let mut iter = root.children();
67 assert!(iter.next().unwrap().is("child", "root_ns"));
68 assert!(iter.next().unwrap().is("child", "child_ns"));
69 assert_eq!(iter.next(), None);
70}
71
72#[test]
73fn get_child_works() {
74 let root = build_test_tree();
75 assert_eq!(root.get_child("child", "inexistent_ns"), None);
76 assert_eq!(root.get_child("not_a_child", "root_ns"), None);
77 assert!(root.get_child("child", "root_ns").unwrap().is("child", "root_ns"));
78 assert!(root.get_child("child", "child_ns").unwrap().is("child", "child_ns"));
79 assert_eq!(root.get_child("child", "root_ns").unwrap().attr("c"), Some("d"));
80 assert_eq!(root.get_child("child", "child_ns").unwrap().attr("d"), Some("e"));
81}
82
83#[test]
84fn namespace_propagation_works() {
85 let mut root = Element::builder("root").ns("root_ns").build();
86 let mut child = Element::bare("child");
87 let grandchild = Element::bare("grandchild");
88 child.append_child(grandchild);
89 root.append_child(child);
90 assert_eq!(root.get_child("child", "root_ns").unwrap().ns(), root.ns());
91 assert_eq!(root.get_child("child", "root_ns").unwrap()
92 .get_child("grandchild", "root_ns").unwrap()
93 .ns(), root.ns());
94}
95
96#[test]
97fn two_elements_with_same_arguments_different_order_are_equal() {
98 let elem1: Element = "<a b='a' c=''/>".parse().unwrap();
99 let elem2: Element = "<a c='' b='a'/>".parse().unwrap();
100 assert_eq!(elem1, elem2);
101
102 let elem1: Element = "<a b='a' c=''/>".parse().unwrap();
103 let elem2: Element = "<a c='d' b='a'/>".parse().unwrap();
104 assert_ne!(elem1, elem2);
105}
106
107#[test]
108fn namespace_attributes_works() {
109 let mut reader = Reader::from_str(TEST_STRING);
110 let root = Element::from_reader(&mut reader).unwrap();
111 assert_eq!("en", root.attr("xml:lang").unwrap());
112 assert_eq!("fr", root.get_child("child", "child_ns").unwrap().attr("xml:lang").unwrap());
113}
114
115#[test]
116fn wrongly_closed_elements_error() {
117 let elem1 = "<a></b>".parse::<Element>();
118 assert!(elem1.is_err());
119 let elem1 = "<a></c></a>".parse::<Element>();
120 assert!(elem1.is_err());
121 let elem1 = "<a><c><d/></c></a>".parse::<Element>();
122 assert!(elem1.is_ok());
123}