Source code

Revision control

Copy as Markdown

Other Tools

#![forbid(unsafe_code)]
extern crate xml;
use std::io::{Cursor, Write};
use xml::EventReader;
use xml::reader::ParserConfig;
use xml::reader::XmlEvent;
macro_rules! assert_match {
($actual:expr, $expected:pat) => {
match $actual {
$expected => {},
_ => panic!("assertion failed: `(left matches right)` \
(left: `{:?}`, right: `{}`", $actual, stringify!($expected))
}
};
($actual:expr, $expected:pat if $guard:expr) => {
match $actual {
$expected if $guard => {},
_ => panic!("assertion failed: `(left matches right)` \
(left: `{:?}`, right: `{} if {}`",
$actual, stringify!($expected), stringify!($guard))
}
}
}
fn write_and_reset_position<W>(c: &mut Cursor<W>, data: &[u8]) where Cursor<W>: Write {
let p = c.position();
c.write_all(data).unwrap();
c.set_position(p);
}
#[test]
fn reading_streamed_content() {
let buf = Cursor::new(b"<root>".to_vec());
let reader = EventReader::new(buf);
let mut it = reader.into_iter();
assert_match!(it.next(), Some(Ok(XmlEvent::StartDocument { .. })));
assert_match!(it.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "root");
write_and_reset_position(it.source_mut(), b"<child-1>content</child-1>");
assert_match!(it.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-1");
assert_match!(it.next(), Some(Ok(XmlEvent::Characters(ref c))) if c == "content");
assert_match!(it.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-1");
write_and_reset_position(it.source_mut(), b"<child-2/>");
assert_match!(it.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-2");
assert_match!(it.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-2");
write_and_reset_position(it.source_mut(), b"<child-3/>");
assert_match!(it.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-3");
assert_match!(it.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-3");
// doesn't seem to work because of how tags parsing is done
// write_and_reset_position(it.source_mut(), b"some text");
// assert_match!(it.next(), Some(Ok(XmlEvent::Characters(ref c))) if c == "some text");
write_and_reset_position(it.source_mut(), b"</root>");
assert_match!(it.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "root");
assert_match!(it.next(), Some(Ok(XmlEvent::EndDocument)));
assert_match!(it.next(), None);
}
#[test]
fn reading_streamed_content2() {
let buf = Cursor::new(b"<root>".to_vec());
let mut config = ParserConfig::new();
config.ignore_end_of_stream = true;
let readerb = EventReader::new_with_config(buf, config);
let mut reader = readerb.into_iter();
assert_match!(reader.next(), Some(Ok(XmlEvent::StartDocument { .. })));
assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "root");
write_and_reset_position(reader.source_mut(), b"<child-1>content</child-1>");
assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-1");
assert_match!(reader.next(), Some(Ok(XmlEvent::Characters(ref c))) if c == "content");
assert_match!(reader.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-1");
write_and_reset_position(reader.source_mut(), b"<child-2>content</child-2>");
assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-2");
assert_match!(reader.next(), Some(Ok(XmlEvent::Characters(ref c))) if c == "content");
assert_match!(reader.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-2");
assert_match!(reader.next(), Some(Err(_)));
write_and_reset_position(reader.source_mut(), b"<child-3></child-3>");
assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-3");
write_and_reset_position(reader.source_mut(), b"<child-4 type='get'");
match reader.next() {
None |
Some(Ok(_)) => {
panic!("At this point, parser must not detect something.");
},
Some(Err(_)) => {}
};
write_and_reset_position(reader.source_mut(), b" />");
assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-4");
}