extern crate micromark;
use micromark::{
mdast::{Heading, Node, Root, Text},
micromark, micromark_to_mdast, micromark_with_options,
unist::Position,
Constructs, Options,
};
use pretty_assertions::assert_eq;
#[test]
fn heading_setext() -> Result<(), String> {
assert_eq!(
micromark("Foo *bar*\n========="),
"
Foo bar
",
"should support a heading w/ an equals to (rank of 1)"
);
assert_eq!(
micromark("Foo *bar*\n---------"),
"Foo bar
",
"should support a heading w/ a dash (rank of 2)"
);
assert_eq!(
micromark("Foo *bar\nbaz*\n===="),
"Foo bar\nbaz
",
"should support line endings in setext headings"
);
assert_eq!(
micromark(" Foo *bar\nbaz*\t\n===="),
"Foo bar\nbaz
",
"should not include initial and final whitespace around content"
);
assert_eq!(
micromark("Foo\n-------------------------"),
"Foo
",
"should support long underlines"
);
assert_eq!(
micromark("Foo\n="),
"Foo
",
"should support short underlines"
);
assert_eq!(
micromark(" Foo\n ==="),
"Foo
",
"should support indented content w/ 1 space"
);
assert_eq!(
micromark(" Foo\n---"),
"Foo
",
"should support indented content w/ 2 spaces"
);
assert_eq!(
micromark(" Foo\n---"),
"Foo
",
"should support indented content w/ 3 spaces"
);
assert_eq!(
micromark(" Foo\n ---"),
"Foo\n---\n
",
"should not support too much indented content (1)"
);
assert_eq!(
micromark(" Foo\n---"),
"Foo\n
\n
",
"should not support too much indented content (2)"
);
assert_eq!(
micromark("Foo\n ---- "),
"Foo
",
"should support initial and final whitespace around the underline"
);
assert_eq!(
micromark("Foo\n ="),
"Foo
",
"should support whitespace before underline"
);
assert_eq!(
micromark("Foo\n ="),
"Foo\n=
",
"should not support too much whitespace before underline (1)"
);
assert_eq!(
micromark("Foo\n\t="),
"Foo\n=
",
"should not support too much whitespace before underline (2)"
);
assert_eq!(
micromark("Foo\n= ="),
"Foo\n= =
",
"should not support whitespace in the underline (1)"
);
assert_eq!(
micromark("Foo\n--- -"),
"Foo
\n
",
"should not support whitespace in the underline (2)"
);
assert_eq!(
micromark("Foo \n-----"),
"Foo
",
"should not support a hard break w/ spaces at the end"
);
assert_eq!(
micromark("Foo\\\n-----"),
"Foo\\
",
"should not support a hard break w/ backslash at the end"
);
assert_eq!(
micromark("`Foo\n----\n`"),
"`Foo
\n`
",
"should precede over inline constructs (1)"
);
assert_eq!(
micromark(""),
"<a title="a lot
\nof dashes"/>
",
"should precede over inline constructs (2)"
);
assert_eq!(
micromark("> Foo\n---"),
"\nFoo
\n
\n
",
"should not allow underline to be lazy (1)"
);
assert_eq!(
micromark("> foo\nbar\n==="),
"\nfoo\nbar\n===
\n
",
"should not allow underline to be lazy (2)"
);
assert_eq!(
micromark("- Foo\n---"),
"\n
",
"should not allow underline to be lazy (3)"
);
assert_eq!(
micromark("Foo\nBar\n---"),
"Foo\nBar
",
"should support line endings in setext headings"
);
assert_eq!(
micromark("---\nFoo\n---\nBar\n---\nBaz"),
"
\nFoo
\nBar
\nBaz
",
"should support adjacent setext headings"
);
assert_eq!(
micromark("\n===="),
"====
",
"should not support empty setext headings"
);
assert_eq!(
micromark("---\n---"),
"
\n
",
"should prefer other constructs over setext headings (1)"
);
assert_eq!(
micromark("- foo\n-----"),
"\n
",
"should prefer other constructs over setext headings (2)"
);
assert_eq!(
micromark(" foo\n---"),
"foo\n
\n
",
"should prefer other constructs over setext headings (3)"
);
assert_eq!(
micromark("> foo\n-----"),
"\nfoo
\n
\n
",
"should prefer other constructs over setext headings (4)"
);
assert_eq!(
micromark("\\> foo\n------"),
"> foo
",
"should support starting w/ character escapes"
);
assert_eq!(
micromark("Foo\nbar\n---\nbaz"),
"Foo\nbar
\nbaz
",
"paragraph and heading interplay (1)"
);
assert_eq!(
micromark("Foo\n\nbar\n---\nbaz"),
"Foo
\nbar
\nbaz
",
"paragraph and heading interplay (2)"
);
assert_eq!(
micromark("Foo\nbar\n\n---\n\nbaz"),
"Foo\nbar
\n
\nbaz
",
"paragraph and heading interplay (3)"
);
assert_eq!(
micromark("Foo\nbar\n* * *\nbaz"),
"Foo\nbar
\n
\nbaz
",
"paragraph and heading interplay (4)"
);
assert_eq!(
micromark("Foo\nbar\n\\---\nbaz"),
"Foo\nbar\n---\nbaz
",
"paragraph and heading interplay (5)"
);
// Extra:
assert_eq!(
micromark("Foo \nbar\n-----"),
"Foo
\nbar
",
"should support a hard break w/ spaces in between"
);
assert_eq!(
micromark("Foo\\\nbar\n-----"),
"Foo
\nbar
",
"should support a hard break w/ backslash in between"
);
assert_eq!(
micromark("a\n-\nb"),
"a
\nb
",
"should prefer a setext heading over an interrupting list"
);
assert_eq!(
micromark("> ===\na"),
"\n===\na
\n
",
"should not support lazyness (1)"
);
assert_eq!(
micromark("> a\n==="),
"\na\n===
\n
",
"should not support lazyness (2)"
);
assert_eq!(
micromark("a\n- ==="),
"a
\n",
"should not support piercing (1)"
);
assert_eq!(
micromark("a\n* ---"),
"a
\n",
"should not support piercing (2)"
);
assert_eq!(
micromark_with_options(
"a\n-",
&Options {
constructs: Constructs {
heading_setext: false,
..Constructs::default()
},
..Options::default()
}
)?,
"a\n-
",
"should support turning off setext underlines"
);
assert_eq!(
micromark_to_mdast("alpha\nbravo\n==", &Options::default())?,
Node::Root(Root {
children: vec![Node::Heading(Heading {
depth: 1,
children: vec![Node::Text(Text {
value: "alpha\nbravo".to_string(),
position: Some(Position::new(1, 1, 0, 2, 6, 11))
}),],
position: Some(Position::new(1, 1, 0, 3, 3, 14))
})],
position: Some(Position::new(1, 1, 0, 3, 3, 14))
}),
"should support heading (atx) as `Heading`s in mdast"
);
Ok(())
}