104 lines
4.6 KiB
Rust
104 lines
4.6 KiB
Rust
#![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");
|
|
}
|
|
|