use markdown_stream::{parse, parse_gfm, Event, Parser, StreamParser};
fn parse_split(input: &str, at: usize) -> Vec<Event> {
let b = input.as_bytes();
let mut p = StreamParser::new();
let mut ev = p.write(&b[..at]);
ev.extend(p.write(&b[at..]));
ev.extend(p.flush());
ev
}
fn parse_split_gfm(input: &str, at: usize) -> Vec<Event> {
let b = input.as_bytes();
let mut p = StreamParser::new_gfm();
let mut ev = p.write(&b[..at]);
ev.extend(p.write(&b[at..]));
ev.extend(p.flush());
ev
}
#[test]
fn split_equivalence_on_samples() {
let samples = [
"# Heading\n\npara *one*\n",
"- a\n- b\n\n> quote\n",
"```\ncode\n```\n",
"text with `code` and **bold**\n",
"1. first\n2. second\n",
"<div>\nraw *html*\n</div>\n\nafter\n",
"<pre>\nx\n\ny\n</pre>\nokay\n",
"a <span class=\"x\"> b </span> c\n",
"- foo\n - bar\n - baz\n",
"- a\n\n- b\n\n- c\n",
"* foo\n * bar\n\n baz\n",
"1. foo\n\n ```\n bar\n ```\n\n > quux\n",
"© & *foo* A end\n",
"foo \nbar\n",
"[foo] and [bar]\n\nmiddle para\n\n[foo]: /a\n[bar]: /b\n",
"see [missing] here\n\nplain tail\n",
"- [foo]\n\n- bar\n\n[foo]: /url\n",
];
for s in samples {
let whole = parse(s);
for at in 0..=s.len() {
if !s.is_char_boundary(at) {
continue;
}
assert_eq!(parse_split(s, at), whole, "split at byte {at} of {s:?}");
}
}
}
#[test]
fn split_equivalence_gfm_samples() {
let samples = [
"Visit www.example.com/a.b. and http://x.org), mail foo@bar.example.com here\n",
"- [ ] todo\n- [x] done\n - [ ] sub\n",
"- text\n\n [ ] not a task\n",
"[foo] then www.example.com\n\nmid\n\n[foo]: /url\n",
];
for s in samples {
let whole = parse_gfm(s);
for at in 0..=s.len() {
if !s.is_char_boundary(at) {
continue;
}
assert_eq!(
parse_split_gfm(s, at),
whole,
"gfm split at byte {at} of {s:?}"
);
}
}
}