blob: a577a00e6afca80ca68577de203db562f3fda2ef [file] [log] [blame]
Jooyung Hana7cd2382021-07-16 01:22:24 +00001#![forbid(unsafe_code)]
2
3extern crate xml;
4
5use std::io::{Cursor, Write};
6
7use xml::EventReader;
8use xml::reader::ParserConfig;
9use xml::reader::XmlEvent;
10
11macro_rules! assert_match {
12 ($actual:expr, $expected:pat) => {
13 match $actual {
14 $expected => {},
15 _ => panic!("assertion failed: `(left matches right)` \
16 (left: `{:?}`, right: `{}`", $actual, stringify!($expected))
17 }
18 };
19 ($actual:expr, $expected:pat if $guard:expr) => {
20 match $actual {
21 $expected if $guard => {},
22 _ => panic!("assertion failed: `(left matches right)` \
23 (left: `{:?}`, right: `{} if {}`",
24 $actual, stringify!($expected), stringify!($guard))
25 }
26 }
27}
28
29fn write_and_reset_position<W>(c: &mut Cursor<W>, data: &[u8]) where Cursor<W>: Write {
30 let p = c.position();
31 c.write_all(data).unwrap();
32 c.set_position(p);
33}
34
35#[test]
36fn reading_streamed_content() {
37 let buf = Cursor::new(b"<root>".to_vec());
38 let reader = EventReader::new(buf);
39
40 let mut it = reader.into_iter();
41
42 assert_match!(it.next(), Some(Ok(XmlEvent::StartDocument { .. })));
43 assert_match!(it.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "root");
44
45 write_and_reset_position(it.source_mut(), b"<child-1>content</child-1>");
46 assert_match!(it.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-1");
47 assert_match!(it.next(), Some(Ok(XmlEvent::Characters(ref c))) if c == "content");
48 assert_match!(it.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-1");
49
50 write_and_reset_position(it.source_mut(), b"<child-2/>");
51 assert_match!(it.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-2");
52 assert_match!(it.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-2");
53
54 write_and_reset_position(it.source_mut(), b"<child-3/>");
55 assert_match!(it.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-3");
56 assert_match!(it.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-3");
57 // doesn't seem to work because of how tags parsing is done
58// write_and_reset_position(it.source_mut(), b"some text");
59 // assert_match!(it.next(), Some(Ok(XmlEvent::Characters(ref c))) if c == "some text");
60
61 write_and_reset_position(it.source_mut(), b"</root>");
62 assert_match!(it.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "root");
63 assert_match!(it.next(), Some(Ok(XmlEvent::EndDocument)));
64 assert_match!(it.next(), None);
65}
66
67#[test]
68fn reading_streamed_content2() {
69 let buf = Cursor::new(b"<root>".to_vec());
70 let mut config = ParserConfig::new();
71 config.ignore_end_of_stream = true;
72 let readerb = EventReader::new_with_config(buf, config);
73
74 let mut reader = readerb.into_iter();
75
76 assert_match!(reader.next(), Some(Ok(XmlEvent::StartDocument { .. })));
77 assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "root");
78
79 write_and_reset_position(reader.source_mut(), b"<child-1>content</child-1>");
80 assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-1");
81 assert_match!(reader.next(), Some(Ok(XmlEvent::Characters(ref c))) if c == "content");
82 assert_match!(reader.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-1");
83
84 write_and_reset_position(reader.source_mut(), b"<child-2>content</child-2>");
85
86 assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-2");
87 assert_match!(reader.next(), Some(Ok(XmlEvent::Characters(ref c))) if c == "content");
88 assert_match!(reader.next(), Some(Ok(XmlEvent::EndElement { ref name })) if name.local_name == "child-2");
89 assert_match!(reader.next(), Some(Err(_)));
90 write_and_reset_position(reader.source_mut(), b"<child-3></child-3>");
91 assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-3");
92 write_and_reset_position(reader.source_mut(), b"<child-4 type='get'");
93 match reader.next() {
94 None |
95 Some(Ok(_)) => {
96 panic!("At this point, parser must not detect something.");
97 },
98 Some(Err(_)) => {}
99 };
100 write_and_reset_position(reader.source_mut(), b" />");
101 assert_match!(reader.next(), Some(Ok(XmlEvent::StartElement { ref name, .. })) if name.local_name == "child-4");
102}
103