extern crate micromark; use micromark::{ mdast::{Math, Node, Root}, micromark, micromark_to_mdast, micromark_with_options, unist::Position, Constructs, Options, }; use pretty_assertions::assert_eq; #[test] fn math_flow() -> Result<(), String> { let math = Options { constructs: Constructs { math_text: true, math_flow: true, ..Constructs::default() }, ..Options::default() }; assert_eq!( micromark("$$\na\n$$"), "
$$\na\n$$
", "should not support math (flow) by default" ); assert_eq!( micromark_with_options("$$\na\n$$", &math)?, "a\n
",
"should support math (flow) if enabled"
);
assert_eq!(
micromark_with_options("$$\n<\n >\n$$", &math)?,
"<\n >\n
",
"should support math (flow)"
);
assert_eq!(
micromark_with_options("$\nfoo\n$", &math)?,
"foo
aaa\n$$\n
",
"should support a closing sequence longer, but not shorter than, the opening"
);
assert_eq!(
micromark_with_options("$$", &math)?,
"
\n",
"should support an eof right after an opening sequence"
);
assert_eq!(
micromark_with_options("$$$\n\n$$\naaa\n", &math)?,
"\n$$\naaa\n
\n",
"should support an eof somewhere in content"
);
assert_eq!(
micromark_with_options("> $$\n> aaa\n\nbbb", &math)?,
"\n\n\naaa\n
bbb
", "should support no closing sequence in a block quote" ); assert_eq!( micromark_with_options("$$\n\n \n$$", &math)?, "\n \n
",
"should support blank lines in math (flow)"
);
assert_eq!(
micromark_with_options("$$\n$$", &math)?,
"
",
"should support empty math (flow)"
);
assert_eq!(
micromark_with_options(" $$\n aaa\naaa\n$$", &math)?,
"aaa\naaa\n
",
"should remove up to one space from the content if the opening sequence is indented w/ 1 space"
);
assert_eq!(
micromark_with_options(" $$\naaa\n aaa\naaa\n $$", &math)?,
"aaa\naaa\naaa\n
",
"should remove up to two space from the content if the opening sequence is indented w/ 2 spaces"
);
assert_eq!(
micromark_with_options(" $$\n aaa\n aaa\n aaa\n $$", &math)?,
"aaa\n aaa\naaa\n
",
"should remove up to three space from the content if the opening sequence is indented w/ 3 spaces"
);
assert_eq!(
micromark_with_options(" $$\n aaa\n $$", &math)?,
"$$\naaa\n$$\n
",
"should not support indenteding the opening sequence w/ 4 spaces"
);
assert_eq!(
micromark_with_options("$$\naaa\n $$", &math)?,
"aaa\n
",
"should support an indented closing sequence"
);
assert_eq!(
micromark_with_options(" $$\naaa\n $$", &math)?,
"aaa\n
",
"should support a differently indented closing sequence than the opening sequence"
);
assert_eq!(
micromark_with_options("$$\naaa\n $$\n", &math)?,
"aaa\n $$\n
\n",
"should not support an indented closing sequence w/ 4 spaces"
);
assert_eq!(
micromark_with_options("$$ $$\naaa", &math)?,
"
\naaa
aaa\n$$$ $$\n
\n",
"should not support spaces in the closing sequence"
);
assert_eq!(
micromark_with_options("foo\n$$\nbar\n$$\nbaz", &math)?,
"foo
\nbar\n
\nbaz
", "should support interrupting paragraphs" ); assert_eq!( micromark_with_options("foo\n---\n$$\nbar\n$$\n# baz", &math)?, "bar\n
\ndef foo(x)\n return 3\nend\n
",
"should not support an “info” string (1)"
);
assert_eq!(
micromark_with_options("$$$;\n$$$", &math)?,
"
",
"should not support an “info” string (2)"
);
assert_eq!(
micromark_with_options("$$ ruby startline=3 `%@#`\ndef foo(x)\n return 3\nend\n$$$$", &math)?,
"def foo(x)\n return 3\nend\n
",
"should not support an “info” string (3)"
);
assert_eq!(
micromark_with_options("$$ aa $$\nfoo", &math)?,
"aa
\nfoo
$$ aaa\n
",
"should not support meta string on closing sequences"
);
// Our own:
assert_eq!(
micromark_with_options("$$ ", &math)?,
"
\n",
"should support an eof after whitespace, after the start fence sequence"
);
assert_eq!(
micromark_with_options("$$ js\nalert(1)\n$$", &math)?,
"alert(1)\n
",
"should support whitespace between the sequence and the meta string"
);
assert_eq!(
micromark_with_options("$$js", &math)?,
"
\n",
"should support an eof after the meta string"
);
assert_eq!(
micromark_with_options("$$ js \nalert(1)\n$$", &math)?,
"alert(1)\n
",
"should support whitespace after the meta string"
);
assert_eq!(
micromark_with_options("$$\n ", &math)?,
" \n
\n",
"should support an eof after whitespace in content"
);
assert_eq!(
micromark_with_options(" $$\n ", &math)?,
"
\n",
"should support an eof in the prefix, in content"
);
assert_eq!(
micromark_with_options("$$j\\+s©", &math)?,
"
\n",
"should support character escapes and character references in meta strings"
);
assert_eq!(
micromark_with_options("$$a\\&b\0c", &math)?,
"
\n",
"should support dangerous characters in meta strings"
);
assert_eq!(
micromark_with_options(" $$\naaa\n $$", &math)?,
"aaa\n $$\n
\n",
"should not support a closing sequence w/ too much indent, regardless of opening sequence (1)"
);
assert_eq!(
micromark_with_options("> $$\n>\n>\n>\n\na", &math)?,
"\n\n\n\n\n\n
a
", "should not support a closing sequence w/ too much indent, regardless of opening sequence (2)" ); assert_eq!( micromark_with_options("> $$a\nb", &math)?, "\n\n\n
b
", "should not support lazyness (1)" ); assert_eq!( micromark_with_options("> a\n$$b", &math)?, "\n\na
\n
\n",
"should not support lazyness (2)"
);
assert_eq!(
micromark_with_options("> $$a\n$$", &math)?,
"\n\n\n
\n",
"should not support lazyness (3)"
);
assert_eq!(
micromark_to_mdast("$$extra\nabc\ndef\n$$", &math)?,
Node::Root(Root {
children: vec![Node::Math(Math {
meta: Some("extra".to_string()),
value: "abc\ndef".to_string(),
position: Some(Position::new(1, 1, 0, 4, 3, 18))
})],
position: Some(Position::new(1, 1, 0, 4, 3, 18))
}),
"should support math (flow) as `Math`s in mdast"
);
Ok(())
}