xml-core 1.0.0

Low-level generic XML reading/writing, shared building block for all OOXML formats in the toolkit.
Documentation
//! Integration tests exercising only `xml-core`'s public API: read a small
//! XML document, write it back out, and check the result is well-formed
//! and equivalent.

use xml_core::{BytesEnd, BytesStart, BytesText, Event, Reader, Writer};

#[test]
fn round_trips_a_minimal_document() {
    let input = r#"<root attr="value"><child>text</child></root>"#;

    let mut reader = Reader::from_xml_str(input);
    let mut writer = Writer::new(Vec::new());

    loop {
        match reader.read_event().expect("input should be well-formed") {
            Event::Eof => break,
            event => writer.write_event(event).expect("write should succeed"),
        }
    }

    let output = writer.into_inner();
    assert_eq!(output, input.as_bytes());
}

#[test]
fn builds_a_document_from_scratch_and_reads_it_back() {
    let mut writer = Writer::new(Vec::new());

    let mut root = BytesStart::new("root");
    root.push_attribute(("attr", "value"));
    writer.write_event(Event::Start(root)).unwrap();
    writer
        .write_event(Event::Start(BytesStart::new("child")))
        .unwrap();
    writer
        .write_event(Event::Text(BytesText::new("text")))
        .unwrap();
    writer
        .write_event(Event::End(BytesEnd::new("child")))
        .unwrap();
    writer
        .write_event(Event::End(BytesEnd::new("root")))
        .unwrap();

    let output = writer.into_inner();
    let xml = String::from_utf8(output).unwrap();

    let mut reader = Reader::from_xml_str(&xml);
    let mut texts = Vec::new();
    loop {
        match reader.read_event().unwrap() {
            Event::Eof => break,
            Event::Text(text) => texts.push(text.decode().unwrap().into_owned()),
            _ => {}
        }
    }

    assert_eq!(texts, vec!["text".to_string()]);
}