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">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}