1use std::io::Cursor;
2
3use std::iter::Iterator;
4
5use xml::reader::EventReader;
6use xml::writer::EventWriter;
7
8use element::Element;
9
10const TEST_STRING: &'static str = r#"<?xml version="1.0" encoding="utf-8"?><root xmlns="root_ns" xml:lang="en" a="b">meow<child c="d" /><child xmlns="child_ns" d="e" xml:lang="fr" />nya</root>"#;
11
12fn build_test_tree() -> Element {
13 let mut root = Element::builder("root")
14 .ns("root_ns")
15 .attr("xml:lang", "en")
16 .attr("a", "b")
17 .build();
18 root.append_text_node("meow");
19 let child = Element::builder("child")
20 .attr("c", "d")
21 .build();
22 root.append_child(child);
23 let other_child = Element::builder("child")
24 .ns("child_ns")
25 .attr("d", "e")
26 .attr("xml:lang", "fr")
27 .build();
28 root.append_child(other_child);
29 root.append_text_node("nya");
30 root
31}
32
33#[test]
34fn reader_works() {
35 let mut reader = EventReader::new(Cursor::new(TEST_STRING));
36 assert_eq!(Element::from_reader(&mut reader).unwrap(), build_test_tree());
37}
38
39#[test]
40fn writer_works() {
41 let root = build_test_tree();
42 let mut out = Vec::new();
43 {
44 let mut writer = EventWriter::new(&mut out);
45 root.write_to(&mut writer).unwrap();
46 }
47 assert_eq!(String::from_utf8(out).unwrap(), TEST_STRING);
48}
49
50#[test]
51fn builder_works() {
52 let elem = Element::builder("a")
53 .ns("b")
54 .attr("c", "d")
55 .append(Element::builder("child"))
56 .append("e")
57 .build();
58 assert_eq!(elem.name(), "a");
59 assert_eq!(elem.ns(), Some("b"));
60 assert_eq!(elem.attr("c"), Some("d"));
61 assert_eq!(elem.attr("x"), None);
62 assert_eq!(elem.text(), "e");
63 assert!(elem.has_child("child", "b"));
64 assert!(elem.is("a", "b"));
65}
66
67#[test]
68fn children_iter_works() {
69 let root = build_test_tree();
70 let mut iter = root.children();
71 assert!(iter.next().unwrap().is("child", "root_ns"));
72 assert!(iter.next().unwrap().is("child", "child_ns"));
73 assert_eq!(iter.next(), None);
74}
75
76#[test]
77fn get_child_works() {
78 let root = build_test_tree();
79 assert_eq!(root.get_child("child", "inexistent_ns"), None);
80 assert_eq!(root.get_child("not_a_child", "root_ns"), None);
81 assert!(root.get_child("child", "root_ns").unwrap().is("child", "root_ns"));
82 assert!(root.get_child("child", "child_ns").unwrap().is("child", "child_ns"));
83 assert_eq!(root.get_child("child", "root_ns").unwrap().attr("c"), Some("d"));
84 assert_eq!(root.get_child("child", "child_ns").unwrap().attr("d"), Some("e"));
85}
86
87#[test]
88fn namespace_propagation_works() {
89 let mut root = Element::builder("root").ns("root_ns").build();
90 let mut child = Element::bare("child");
91 let grandchild = Element::bare("grandchild");
92 child.append_child(grandchild);
93 root.append_child(child);
94 assert_eq!(root.get_child("child", "root_ns").unwrap().ns(), root.ns());
95 assert_eq!(root.get_child("child", "root_ns").unwrap()
96 .get_child("grandchild", "root_ns").unwrap()
97 .ns(), root.ns());
98}
99
100#[test]
101fn two_elements_with_same_arguments_different_order_are_equal() {
102 let elem1: Element = "<a b='a' c=''/>".parse().unwrap();
103 let elem2: Element = "<a c='' b='a'/>".parse().unwrap();
104 assert_eq!(elem1, elem2);
105
106 let elem1: Element = "<a b='a' c=''/>".parse().unwrap();
107 let elem2: Element = "<a c='d' b='a'/>".parse().unwrap();
108 assert_ne!(elem1, elem2);
109}
110
111#[test]
112fn namespace_attributes_works() {
113 let mut reader = EventReader::new(Cursor::new(TEST_STRING));
114 let root = Element::from_reader(&mut reader).unwrap();
115 assert_eq!("en", root.attr("xml:lang").unwrap());
116 assert_eq!("fr", root.get_child("child", "child_ns").unwrap().attr("xml:lang").unwrap());
117}