From 670f1d82e01ea2394b21d7d1857f41bdc67b3fce Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Fri, 26 Aug 2022 13:29:10 +0200 Subject: Add support for math (flow) --- tests/math_flow.rs | 250 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/math_text.rs | 54 +++++------- 2 files changed, 274 insertions(+), 30 deletions(-) create mode 100644 tests/math_flow.rs (limited to 'tests') diff --git a/tests/math_flow.rs b/tests/math_flow.rs new file mode 100644 index 0000000..5d161f6 --- /dev/null +++ b/tests/math_flow.rs @@ -0,0 +1,250 @@ +extern crate micromark; +use micromark::{micromark, micromark_with_options, Constructs, Options}; +use pretty_assertions::assert_eq; + +#[test] +fn math_flow() { + 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

", + "should not support math (flow) w/ less than two markers" + ); + + assert_eq!( + micromark_with_options("$$$\naaa\n$$\n$$$$", &math), + "
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
aaa\n
\n
\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

", + "should not support dollars in the opening fence after the opening sequence" + ); + + assert_eq!( + micromark_with_options("$$$\naaa\n$$$ $$\n", &math), + "
aaa\n$$$ $$\n
\n", + "should not support spaces in the closing sequence" + ); + + assert_eq!( + micromark_with_options("foo\n$$\nbar\n$$\nbaz", &math), + "

foo

\n
bar\n
\n

baz

", + "should support interrupting paragraphs" + ); + + assert_eq!( + micromark_with_options("foo\n---\n$$\nbar\n$$\n# baz", &math), + "

foo

\n
bar\n
\n

baz

", + "should support interrupting other content" + ); + + assert_eq!( + micromark_with_options("$$ruby\ndef foo(x)\n return 3\nend\n$$", &math), + "
def 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

", + "should not support dollars in the meta string" + ); + + assert_eq!( + micromark_with_options("$$\n$$ aaa\n$$", &math), + "
$$ 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

a

\n
\n
\n", + "should not support lazyness (2)" + ); + + assert_eq!( + micromark_with_options("> $$a\n$$", &math), + "
\n
\n
\n
\n", + "should not support lazyness (3)" + ); +} diff --git a/tests/math_text.rs b/tests/math_text.rs index d0e7589..4fe0288 100644 --- a/tests/math_text.rs +++ b/tests/math_text.rs @@ -7,7 +7,7 @@ fn math_text() { let math = Options { constructs: Constructs { math_text: true, - // To do: enable `math_flow`. + math_flow: true, ..Constructs::default() }, ..Options::default() @@ -21,7 +21,7 @@ fn math_text() { assert_eq!( micromark_with_options("$foo$ $$bar$$", &math), - "

foo bar

", + "

foo bar

", "should support math (text) if enabled" ); @@ -33,103 +33,97 @@ fn math_text() { ..math.clone() } ), - "

$foo$ bar

", + "

$foo$ bar

", "should not support math (text) w/ a single dollar, w/ `math_text_single_dollar: false`" ); - // assert_eq!( - // micromark_with_options("$foo$", &math), - // "

foo

", - // "should support math (text)" - // ); - assert_eq!( micromark_with_options("$$ foo $ bar $$", &math), - "

foo $ bar

", + "

foo $ bar

", "should support math (text) w/ more dollars" ); assert_eq!( micromark_with_options("$ $$ $", &math), - "

$$

", + "

$$

", "should support math (text) w/ fences inside, and padding" ); assert_eq!( micromark_with_options("$ $$ $", &math), - "

$$

", + "

$$

", "should support math (text) w/ extra padding" ); assert_eq!( micromark_with_options("$ a$", &math), - "

a

", + "

a

", "should support math (text) w/ unbalanced padding" ); assert_eq!( micromark_with_options("$\u{a0}b\u{a0}$", &math), - "

\u{a0}b\u{a0}

", + "

\u{a0}b\u{a0}

", "should support math (text) w/ non-padding whitespace" ); assert_eq!( micromark_with_options("$ $\n$ $", &math), - "

\n

", + "

\n

", "should support math (text) w/o data" ); assert_eq!( - micromark_with_options("$$\nfoo\nbar \nbaz\n$$", &math), - "

foo bar baz

", + micromark_with_options("$\nfoo\nbar \nbaz\n$", &math), + "

foo bar baz

", "should support math (text) w/o line endings (1)" ); assert_eq!( - micromark_with_options("$$\nfoo \n$$", &math), - "

foo

", + micromark_with_options("$\nfoo \n$", &math), + "

foo

", "should support math (text) w/o line endings (2)" ); assert_eq!( micromark_with_options("$foo bar \nbaz$", &math), - "

foo bar baz

", + "

foo bar baz

", "should not support whitespace collapsing" ); assert_eq!( micromark_with_options("$foo\\$bar$", &math), - "

foo\\bar$

", + "

foo\\bar$

", "should not support character escapes" ); assert_eq!( micromark_with_options("$$foo$bar$$", &math), - "

foo$bar

", + "

foo$bar

", "should support more dollars" ); assert_eq!( micromark_with_options("$ foo $$ bar $", &math), - "

foo $$ bar

", + "

foo $$ bar

", "should support less dollars" ); assert_eq!( micromark_with_options("*foo$*$", &math), - "

*foo*

", + "

*foo*

", "should precede over emphasis" ); assert_eq!( micromark_with_options("[not a $link](/foo$)", &math), - "

[not a link](/foo)

", + "

[not a link](/foo)

", "should precede over links" ); assert_eq!( micromark_with_options("$$", &math), - "

<a href="">$

", + "

<a href="">$

", "should have same precedence as HTML (1)" ); @@ -148,7 +142,7 @@ fn math_text() { assert_eq!( micromark_with_options("$$", &math), - "

<http://foo.bar.baz>$

", + "

<http://foo.bar.baz>$

", "should have same precedence as autolinks (1)" ); @@ -172,19 +166,19 @@ fn math_text() { assert_eq!( micromark_with_options("$foo$$bar$$", &math), - "

$foobar

", + "

$foobar

", "should not support no closing fence (2)" ); assert_eq!( micromark_with_options("$foo\t\tbar$", &math), - "

foo\t\tbar

", + "

foo\t\tbar

", "should support tabs in code" ); assert_eq!( micromark_with_options("\\$$x$", &math), - "

$x

", + "

$x

", "should support an escaped initial dollar" ); } -- cgit