tests.rs

  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" xml:lang="en">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}