summaryrefslogtreecommitdiffstats
path: root/third_party/rust/xml-rs/tests/streaming.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/rust/xml-rs/tests/streaming.rs
parentInitial commit. (diff)
downloadfirefox-upstream.tar.xz
firefox-upstream.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/xml-rs/tests/streaming.rs')
-rw-r--r--third_party/rust/xml-rs/tests/streaming.rs101
1 files changed, 101 insertions, 0 deletions
diff --git a/third_party/rust/xml-rs/tests/streaming.rs b/third_party/rust/xml-rs/tests/streaming.rs
new file mode 100644
index 0000000000..6353aff57d
--- /dev/null
+++ b/third_party/rust/xml-rs/tests/streaming.rs
@@ -0,0 +1,101 @@
+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");
+}
+