use super::*;
use crate::de::DeEvent::*;
use crate::events::BytesEnd;
use std::num::NonZeroUsize;
#[test]
fn read_and_peek() {
let mut de = make_de(
"\
<root>\
<inner>\
text\
<inner/>\
</inner>\
<next/>\
<target/>\
</root>\
",
);
assert_eq!(de.read, vec![]);
assert_eq!(de.write, vec![]);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("root"))
);
assert_eq!(
de.peek().expect("should be Ok"),
&Start(BytesStart::new("inner"))
);
let checkpoint = de.skip_checkpoint();
assert_eq!(checkpoint, 0);
de.skip().expect("should be Ok");
assert_eq!(de.read, vec![]);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("inner")),
Text("text".into()),
Start(BytesStart::new("inner")),
End(BytesEnd::new("inner")),
End(BytesEnd::new("inner")),
]
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("next"))
);
assert_eq!(de.next().expect("should be Ok"), End(BytesEnd::new("next")));
de.start_replay(checkpoint);
assert_eq!(
de.read,
vec![
Start(BytesStart::new("inner")),
Text("text".into()),
Start(BytesStart::new("inner")),
End(BytesEnd::new("inner")),
End(BytesEnd::new("inner")),
]
);
assert_eq!(de.write, vec![]);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("inner"))
);
let checkpoint = de.skip_checkpoint();
assert_eq!(checkpoint, 0);
de.skip().expect("should be Ok");
assert_eq!(
de.read,
vec![
Start(BytesStart::new("inner")),
End(BytesEnd::new("inner")),
End(BytesEnd::new("inner")),
]
);
assert_eq!(
de.write,
vec![
Text("text".into()),
]
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("inner"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("inner"))
);
de.start_replay(checkpoint);
assert_eq!(
de.read,
vec![
Text("text".into()),
End(BytesEnd::new("inner")),
]
);
assert_eq!(de.write, vec![]);
assert_eq!(de.next().expect("should be Ok"), Text("text".into()));
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("inner"))
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("target"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("target"))
);
assert_eq!(de.next().expect("should be Ok"), End(BytesEnd::new("root")));
assert_eq!(de.next().expect("should be Ok"), Eof);
}
#[test]
fn read_to_end() {
let mut de = make_de(
"\
<root>\
<skip>\
text\
<skip/>\
</skip>\
<target>\
<target/>\
</target>\
</root>\
",
);
assert_eq!(de.read, vec![]);
assert_eq!(de.write, vec![]);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("root"))
);
let checkpoint = de.skip_checkpoint();
assert_eq!(checkpoint, 0);
de.skip().expect("should be Ok");
assert_eq!(de.read, vec![]);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skip")),
Text("text".into()),
Start(BytesStart::new("skip")),
End(BytesEnd::new("skip")),
End(BytesEnd::new("skip")),
]
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("target"))
);
de.read_to_end(QName(b"target")).expect("should be Ok");
assert_eq!(de.read, vec![]);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skip")),
Text("text".into()),
Start(BytesStart::new("skip")),
End(BytesEnd::new("skip")),
End(BytesEnd::new("skip")),
]
);
de.start_replay(checkpoint);
assert_eq!(
de.read,
vec![
Start(BytesStart::new("skip")),
Text("text".into()),
Start(BytesStart::new("skip")),
End(BytesEnd::new("skip")),
End(BytesEnd::new("skip")),
]
);
assert_eq!(de.write, vec![]);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("skip"))
);
de.read_to_end(QName(b"skip")).expect("should be Ok");
assert_eq!(de.next().expect("should be Ok"), End(BytesEnd::new("root")));
assert_eq!(de.next().expect("should be Ok"), Eof);
}
#[test]
fn partial_replay() {
let mut de = make_de(
"\
<root>\
<skipped-1/>\
<skipped-2/>\
<inner>\
<skipped-3/>\
<skipped-4/>\
<target-2/>\
</inner>\
<target-1/>\
</root>\
",
);
assert_eq!(de.read, vec![]);
assert_eq!(de.write, vec![]);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("root"))
);
let checkpoint1 = de.skip_checkpoint();
assert_eq!(checkpoint1, 0);
de.skip().expect("should be Ok"); de.skip().expect("should be Ok"); assert_eq!(de.read, vec![]);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skipped-1")),
End(BytesEnd::new("skipped-1")),
Start(BytesStart::new("skipped-2")),
End(BytesEnd::new("skipped-2")),
]
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("inner"))
);
assert_eq!(
de.peek().expect("should be Ok"),
&Start(BytesStart::new("skipped-3"))
);
assert_eq!(
de.read,
vec![
Start(BytesStart::new("skipped-3")),
]
);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skipped-1")),
End(BytesEnd::new("skipped-1")),
Start(BytesStart::new("skipped-2")),
End(BytesEnd::new("skipped-2")),
]
);
let checkpoint2 = de.skip_checkpoint();
assert_eq!(checkpoint2, 4);
de.skip().expect("should be Ok"); de.skip().expect("should be Ok"); assert_eq!(de.read, vec![]);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skipped-1")),
End(BytesEnd::new("skipped-1")),
Start(BytesStart::new("skipped-2")),
End(BytesEnd::new("skipped-2")),
Start(BytesStart::new("skipped-3")),
End(BytesEnd::new("skipped-3")),
Start(BytesStart::new("skipped-4")),
End(BytesEnd::new("skipped-4")),
]
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("target-2"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("target-2"))
);
assert_eq!(
de.peek().expect("should be Ok"),
&End(BytesEnd::new("inner"))
);
assert_eq!(
de.read,
vec![
End(BytesEnd::new("inner")),
]
);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skipped-1")),
End(BytesEnd::new("skipped-1")),
Start(BytesStart::new("skipped-2")),
End(BytesEnd::new("skipped-2")),
Start(BytesStart::new("skipped-3")),
End(BytesEnd::new("skipped-3")),
Start(BytesStart::new("skipped-4")),
End(BytesEnd::new("skipped-4")),
]
);
de.start_replay(checkpoint2);
assert_eq!(
de.read,
vec![
Start(BytesStart::new("skipped-3")),
End(BytesEnd::new("skipped-3")),
Start(BytesStart::new("skipped-4")),
End(BytesEnd::new("skipped-4")),
End(BytesEnd::new("inner")),
]
);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skipped-1")),
End(BytesEnd::new("skipped-1")),
Start(BytesStart::new("skipped-2")),
End(BytesEnd::new("skipped-2")),
]
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("skipped-3"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("skipped-3"))
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("skipped-4"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("skipped-4"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("inner"))
);
assert_eq!(de.read, vec![]);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skipped-1")),
End(BytesEnd::new("skipped-1")),
Start(BytesStart::new("skipped-2")),
End(BytesEnd::new("skipped-2")),
]
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("target-1"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("target-1"))
);
assert_eq!(de.read, vec![]);
assert_eq!(
de.write,
vec![
Start(BytesStart::new("skipped-1")),
End(BytesEnd::new("skipped-1")),
Start(BytesStart::new("skipped-2")),
End(BytesEnd::new("skipped-2")),
]
);
de.start_replay(checkpoint1);
assert_eq!(
de.read,
vec![
Start(BytesStart::new("skipped-1")),
End(BytesEnd::new("skipped-1")),
Start(BytesStart::new("skipped-2")),
End(BytesEnd::new("skipped-2")),
]
);
assert_eq!(de.write, vec![]);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("skipped-1"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("skipped-1"))
);
assert_eq!(
de.next().expect("should be Ok"),
Start(BytesStart::new("skipped-2"))
);
assert_eq!(
de.next().expect("should be Ok"),
End(BytesEnd::new("skipped-2"))
);
assert_eq!(de.read, vec![]);
assert_eq!(de.write, vec![]);
assert_eq!(de.next().expect("should be Ok"), End(BytesEnd::new("root")));
assert_eq!(de.next().expect("should be Ok"), Eof);
}
#[test]
fn limit() {
use serde::Deserialize;
#[derive(Debug, Deserialize)]
#[allow(unused)]
struct List {
item: Vec<()>,
}
let mut de = make_de(
"\
<any-name>\
<item/>\
<another-item>\
<some-element>with text</some-element>\
<yet-another-element/>\
</another-item>\
<item/>\
<item/>\
</any-name>\
",
);
de.event_buffer_size(NonZeroUsize::new(3));
match List::deserialize(&mut de) {
Err(DeError::TooManyEvents(count)) => assert_eq!(count.get(), 3),
e => panic!("Expected `Err(TooManyEvents(3))`, but got `{:?}`", e),
}
}
#[test]
fn invalid_xml() {
use crate::de::DeEvent::*;
let mut de = make_de("<root>");
let checkpoint = de.skip_checkpoint();
de.skip().expect("should be Ok");
de.start_replay(checkpoint);
assert_eq!(de.read, vec![Start(BytesStart::new("root")), Eof]);
}