• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #![forbid(unsafe_code)]
2 
3 extern crate xml;
4 
5 use std::io::{Cursor, Write};
6 
7 use xml::EventReader;
8 use xml::reader::ParserConfig;
9 use xml::reader::XmlEvent;
10 
11 macro_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 
write_and_reset_position<W>(c: &mut Cursor<W>, data: &[u8]) where Cursor<W>: Write29 fn 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]
reading_streamed_content()36 fn 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]
reading_streamed_content2()68 fn 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 
104