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