tests.rs

  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}