From 31ab712f2e45de567fd699786a49af678a30cd15 Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Thu, 8 Sep 2022 10:23:03 +0200 Subject: Add tests for mdx jsx (text) --- tests/mdx_jsx_text.rs | 821 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 821 insertions(+) create mode 100644 tests/mdx_jsx_text.rs (limited to 'tests') diff --git a/tests/mdx_jsx_text.rs b/tests/mdx_jsx_text.rs new file mode 100644 index 0000000..1890aad --- /dev/null +++ b/tests/mdx_jsx_text.rs @@ -0,0 +1,821 @@ +extern crate micromark; +use micromark::{micromark_with_options, Constructs, Options}; +use pretty_assertions::assert_eq; + +#[test] +fn mdx_jsx_text_core() -> Result<(), String> { + let mdx = Options { + constructs: Constructs::mdx(), + ..Options::default() + }; + + assert_eq!( + micromark_with_options("a c", &mdx)?, + "

a c

", + "should support mdx jsx (text) if enabled" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx)?, + "

a c.

", + "should support a self-closing element" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx)?, + "

a c.

", + "should support a closed element" + ); + + assert_eq!( + micromark_with_options("a <> c.", &mdx)?, + "

a c.

", + "should support fragments" + ); + + assert_eq!( + micromark_with_options("a *b* c.", &mdx)?, + "

a b c.

", + "should support markdown inside elements" + ); + + Ok(()) +} + +#[test] +fn mdx_jsx_text_agnosic() -> Result<(), String> { + let mdx = Options { + constructs: Constructs::mdx(), + ..Options::default() + }; + + assert_eq!( + micromark_with_options("a c", &mdx)?, + "

a c

", + "should support a self-closing element" + ); + + assert_eq!( + micromark_with_options("a c d", &mdx)?, + "

a c d

", + "should support a closed element" + ); + + assert_eq!( + micromark_with_options("a c", &mdx)?, + "

a c

", + "should support an unclosed element" + ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c", &mdx)?, + // "

a c

", + // "should support an attribute expression" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a d", &mdx)?, + // "

a d

", + // "should support an attribute value expression" + // ); + + Ok(()) +} + +#[test] +fn mdx_jsx_text_gnostic() -> Result<(), String> { + let mdx = Options { + constructs: Constructs::mdx(), + ..Options::default() + }; + + assert_eq!( + micromark_with_options("a c", &mdx)?, + "

a c

", + "should support a self-closing element" + ); + + assert_eq!( + micromark_with_options("a c d", &mdx)?, + "

a c d

", + "should support a closed element" + ); + + assert_eq!( + micromark_with_options("a c", &mdx)?, + "

a c

", + "should support an unclosed element" + ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a d", &mdx)?, + // "

a d

", + // "should support an attribute expression" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a f", &mdx)?, + // "

a f

", + // "should support more complex attribute expression (1)" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a d", &mdx)?, + // "

a d

", + // "should support more complex attribute expression (2)" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a d", &mdx)?, + // "

a d

", + // "should support an attribute value expression" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a d", &mdx) + // .err() + // .unwrap(), + // "Unexpected empty expression", + // "should crash on an empty attribute value expression" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c", &mdx) + // .err() + // .unwrap(), + // "Could not parse expression with acorn: Unexpected token", + // "should crash on a non-spread attribute expression" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a d", &mdx) + // .err() + // .unwrap(), + // "Could not parse expression with acorn: Unexpected token", + // "should crash on invalid JS in an attribute value expression" + // ); + + // // To do: expressions. + // assert_eq!( + // micromark_with_options("a c", &mdx) + // .err() + // .unwrap(), + // "Could not parse expression with acorn: Unexpected token", + // "should crash on invalid JS in an attribute expression" + // ); + + // // To do: expressions. + // assert_eq!( + // micromark_with_options("a f", &mdx) + // .err() + // .unwrap(), + // "Unexpected `ExpressionStatement` in code: expected an object spread", + // "should crash on invalid JS in an attribute expression (2)" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a } /> f", &mdx)?, + // "

a f

", + // "should support parenthesized expressions" + // ); + + Ok(()) +} + +#[test] +fn mdx_jsx_text_complete() -> Result<(), String> { + let mdx = Options { + constructs: Constructs::mdx(), + ..Options::default() + }; + + assert_eq!( + micromark_with_options("a c", &mdx)?, + "

a c

", + "should support an unclosed element" + ); + + assert_eq!( + micromark_with_options("a <> c", &mdx)?, + "

a c

", + "should support an unclosed fragment" + ); + + assert_eq!( + micromark_with_options("a < \t>b", &mdx)?, + "

a < \t>b

", + "should *not* support whitespace in the opening tag (fragment)" + ); + + assert_eq!( + micromark_with_options("a < \nb\t>b
", &mdx)?, + "

a <\nb\t>b

", + "should *not* support whitespace in the opening tag (named)" + ); + + assert_eq!( + micromark_with_options("a b", &mdx) + .err() + .unwrap(), + "1:4: Unexpected character `!` (U+0021) before name, expected a character that can start a name, such as a letter, `$`, or `_` (note: to create a comment in MDX, use `{/* text */}`)", + "should crash on a nonconforming start identifier" + ); + + assert_eq!( + micromark_with_options("a b.", &mdx) + .err() + .unwrap(), + "1:5: Unexpected character `(` (U+0028) before name, expected a character that can start a name, such as a letter, `$`, or `_`", + "should crash on a nonconforming start identifier in a closing tag" + ); + + assert_eq!( + micromark_with_options("a <π /> b.", &mdx)?, + "

a b.

", + "should support non-ascii identifier start characters" + ); + + assert_eq!( + micromark_with_options("a <© /> b.", &mdx) + .err() + .unwrap(), + "1:4: Unexpected character U+00A9 before name, expected a character that can start a name, such as a letter, `$`, or `_`", + "should crash on non-conforming non-ascii identifier start characters" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:4: Unexpected character `!` (U+0021) before name, expected a character that can start a name, such as a letter, `$`, or `_` (note: to create a comment in MDX, use `{/* text */}`)", + "should crash nicely on what might be a comment" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:5: Unexpected character `/` (U+002F) before name, expected a character that can start a name, such as a letter, `$`, or `_` (note: JS comments in JSX tags are not supported in MDX)", + "should crash nicely on JS line comments inside tags (1)" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:6: Unexpected character `/` (U+002F) after self-closing slash, expected `>` to end the tag (note: JS comments in JSX tags are not supported in MDX)", + "should crash nicely JS line comments inside tags (2)" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:5: Unexpected character `*` (U+002A) before name, expected a character that can start a name, such as a letter, `$`, or `_`", + "should crash nicely JS multiline comments inside tags (1)" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:6: Unexpected character `*` (U+002A) after self-closing slash, expected `>` to end the tag", + "should crash nicely JS multiline comments inside tags (2)" + ); + + assert_eq!( + micromark_with_options("a b.", &mdx)?, + "

a b.

", + "should support non-ascii identifier continuation characters" + ); + + assert_eq!( + micromark_with_options("a b.", &mdx) + .err() + .unwrap(), + "1:5: Unexpected character U+00AC in name, expected a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on non-conforming non-ascii identifier continuation characters" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:5: Unexpected character `@` (U+0040) in name, expected a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag (note: to create a link in MDX, use `[text](url)`)", + "should crash nicely on what might be an email link" + ); + + assert_eq!( + micromark_with_options("a b.", &mdx)?, + "

a b.

", + "should support dashes in names" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:5: Unexpected character `?` (U+003F) in name, expected a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on nonconforming identifier continuation characters" + ); + + assert_eq!( + micromark_with_options("a b.", &mdx)?, + "

a b.

", + "should support dots in names for method names" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:7: Unexpected character `@` (U+0040) in member name, expected a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag (note: to create a link in MDX, use `[text](url)`)", + "should crash nicely on what might be an email link in member names" + ); + + assert_eq!( + micromark_with_options("a b.", &mdx)?, + "

a b.

", + "should support colons in names for local names" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:6: Unexpected character `+` (U+002B) before local name, expected a character that can start a name, such as a letter, `$`, or `_` (note: to create a link in MDX, use `[text](url)`)", + "should crash on a nonconforming character to start a local name" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:9: Unexpected character `/` (U+002F) before local name, expected a character that can start a name, such as a letter, `$`, or `_` (note: to create a link in MDX, use `[text](url)`)", + "should crash nicely on what might be a protocol in local names" + ); + + assert_eq!( + micromark_with_options("a ", &mdx) + .err() + .unwrap(), + "1:10: Unexpected character `>` (U+003E) before local name, expected a character that can start a name, such as a letter, `$`, or `_`", + "should crash nicely on what might be a protocol in local names" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:7: Unexpected character `|` (U+007C) in local name, expected a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character in a local name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:6: Unexpected character `.` (U+002E) before member name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character to start a member name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:7: Unexpected character `,` (U+002C) in member name, expected a name character such as letters, digits, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character in a member name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:8: Unexpected character `.` (U+002E) after local name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character after a local name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:8: Unexpected character `:` (U+003A) after member name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character after a member name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:6: Unexpected character `=` (U+003D) after name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character after name" + ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c.", &mdx)?, + // "

a c.

", + // "should support attribute expressions" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c.", &mdx)?, + // "

a c.

", + // "should support nested balanced braces in attribute expressions" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options(".", &mdx)?, + // "

.

", + // "should support attribute expressions directly after a name" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options(".", &mdx)?, + // "

.

", + // "should support attribute expressions directly after a member name" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options(".", &mdx)?, + // "

.

", + // "should support attribute expressions directly after a local name" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a .", &mdx)?, + // "

a .

", + // "should support attribute expressions directly after boolean attributes" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a .", &mdx)?, + // "

a .

", + // "should support attribute expressions directly after boolean qualified attributes" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c.", &mdx)?, + // "

a c.

", + // "should support attribute expressions and normal attributes" + // ); + + assert_eq!( + micromark_with_options("a c.", &mdx)?, + "

a c.

", + "should support attributes" + ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c.", &mdx) + // .err() + // .unwrap(), + // "Unexpected character `~` (U+007E) before attribute name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag", + // "should crash on a nonconforming character before an attribute name" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:7: Unexpected character `@` (U+0040) in attribute name, expected an attribute name character such as letters, digits, `$`, or `_`; `=` to initialize a value; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character in attribute name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx)?, + "

a c.

", + "should support prefixed attributes" + ); + + assert_eq!( + micromark_with_options("a .", &mdx)?, + "

a .

", + "should support prefixed and normal attributes" + ); + + assert_eq!( + micromark_with_options("a
c.", &mdx) + .err() + .unwrap(), + "1:8: Unexpected character `1` (U+0031) after attribute name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; `=` to initialize a value; or the end of the tag", + "should crash on a nonconforming character after an attribute name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:8: Unexpected character `#` (U+0023) before local attribute name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; `=` to initialize a value; or the end of the tag", + "should crash on a nonconforming character to start a local attribute name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:9: Unexpected character `%` (U+0025) in local attribute name, expected an attribute name character such as letters, digits, `$`, or `_`; `=` to initialize a value; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character in a local attribute name" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:10: Unexpected character `^` (U+005E) after local attribute name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; `=` to initialize a value; or the end of the tag", + "should crash on a nonconforming character after a local attribute name" + ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c.", &mdx)?, + // "

a c.

", + // "should support attribute value expressions" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c.", &mdx)?, + // "

a c.

", + // "should support nested balanced braces in attribute value expressions" + // ); + + assert_eq!( + micromark_with_options("a
c.", &mdx) + .err() + .unwrap(), + "1:8: Unexpected character `` ` `` (U+0060) before attribute value, expected a character that can start an attribute value, such as `\"`, `'`, or `{`", + "should crash on a nonconforming character before an attribute value" + ); + + assert_eq!( + micromark_with_options("a > d.", &mdx) + .err() + .unwrap(), + "1:8: Unexpected character `<` (U+003C) before attribute value, expected a character that can start an attribute value, such as `\"`, `'`, or `{` (note: to use an element or fragment as a prop value in MDX, use `{}`)", + "should crash nicely on what might be a fragment, element as prop value" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:13: Unexpected end of file in attribute value, expected a corresponding closing quote `\"` (U+0022)", + "should crash on a missing closing quote in double quoted attribute value" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:13: Unexpected end of file in attribute value, expected a corresponding closing quote `\"` (U+0022)", + "should crash on a missing closing quote in single quoted attribute value" + ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("a c.", &mdx) + // .err() + // .unwrap(), + // "Unexpected end of file in expression, expected a corresponding closing brace for `{`", + // "should crash on a missing closing brace in an attribute value expression" + // ); + + assert_eq!( + micromark_with_options("a c.", &mdx) + .err() + .unwrap(), + "1:10: Unexpected character `*` (U+002A) before attribute name, expected a character that can start an attribute name, such as a letter, `$`, or `_`; whitespace before attributes; or the end of the tag", + "should crash on a nonconforming character after an attribute value" + ); + + assert_eq!( + micromark_with_options(".", &mdx)?, + "

.

", + "should support an attribute directly after a value" + ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options(".", &mdx)?, + // "

.

", + // "should support an attribute directly after an attribute expression" + // ); + + assert_eq!( + micromark_with_options("a
c.", &mdx) + .err() + .unwrap(), + "1:6: Unexpected character `b` (U+0062) after self-closing slash, expected `>` to end the tag", + "should crash on a nonconforming character after a self-closing slash" + ); + + assert_eq!( + micromark_with_options(".", &mdx)?, + "

.

", + "should support whitespace directly after closing slash" + ); + + assert_eq!( + micromark_with_options("a > c.", &mdx).err(), + None, + "should *not* crash on closing angle in text" + ); + + assert_eq!( + micromark_with_options("a <>`<` c.", &mdx).err(), + None, + "should *not* crash on opening angle in tick code in an element" + ); + + assert_eq!( + micromark_with_options("a <>`` ``` ``", &mdx).err(), + None, + "should *not* crash on ticks in tick code in an element" + ); + + assert_eq!( + micromark_with_options("a c.", &mdx)?, + "

a c.

", + "should support a closing tag w/o open elements" + ); + + assert_eq!( + micromark_with_options("a <>
", &mdx)?, + "

a

", + "should support mismatched tags (1)" + ); + assert_eq!( + micromark_with_options("a ", &mdx)?, + "

a

", + "should support mismatched tags (2)" + ); + assert_eq!( + micromark_with_options("a
", &mdx)?, + "

a

", + "should support mismatched tags (3)" + ); + assert_eq!( + micromark_with_options("a
", &mdx)?, + "

a

", + "should support mismatched tags (4)" + ); + assert_eq!( + micromark_with_options("a ", &mdx)?, + "

a

", + "should support mismatched tags (5)" + ); + assert_eq!( + micromark_with_options("a
", &mdx)?, + "

a

", + "should support mismatched tags (6)" + ); + assert_eq!( + micromark_with_options("a
", &mdx)?, + "

a

", + "should support mismatched tags (7)" + ); + assert_eq!( + micromark_with_options("a ", &mdx)?, + "

a

", + "should support mismatched tags (8)" + ); + assert_eq!( + micromark_with_options("a ", &mdx)?, + "

a

", + "should support mismatched tags (9)" + ); + + assert_eq!( + micromark_with_options("a
b", &mdx)?, + "

a b

", + "should support a closing self-closing tag" + ); + + assert_eq!( + micromark_with_options("a b", &mdx)?, + "

a b

", + "should support a closing tag w/ attributes" + ); + + assert_eq!( + micromark_with_options("a <>b <>c d.", &mdx)?, + "

a b c d.

", + "should support nested tags" + ); + + assert_eq!( + micromark_with_options( + ".", + &mdx + )?, + "

.

", + "should support character references in attribute values" + ); + + assert_eq!( + micromark_with_options( + "Character references can be used: ", ', <, >, {, and }, they can be named, decimal, or hexadecimal: © ≠ 𝌆.", + &mdx + )?, + "

Character references can be used: ", ', <, >, {, and }, they can be named, decimal, or hexadecimal: © ≠ 𝌆.

", + "should support character references in text" + ); + + assert_eq!( + micromark_with_options(".", &mdx)?, + "

.

", + "should support as text if the closing tag is not the last thing" + ); + + assert_eq!( + micromark_with_options("a ", &mdx)?, + "

a

", + "should support as text if the opening is not the first thing" + ); + + assert_eq!( + micromark_with_options("a *open close* c.", &mdx)?, + "

a open close c.

", + "should not care about precedence between attention (emphasis)" + ); + + assert_eq!( + micromark_with_options("a **open close** c.", &mdx)?, + "

a open close c.

", + "should not care about precedence between attention (strong)" + ); + + assert_eq!( + micromark_with_options("a [open close](c) d.", &mdx)?, + "

a open close d.

", + "should not care about precedence between label (link)" + ); + + assert_eq!( + micromark_with_options("a ![open close](c) d.", &mdx)?, + "

a \"open d.

", + "should not care about precedence between label (image)" + ); + + assert_eq!( + micromark_with_options("> a \n> c d.", &mdx)?, + "
\n

a \nc d.

\n
", + "should support line endings in elements" + ); + + assert_eq!( + micromark_with_options("> a f", &mdx)?, + "
\n

a f

\n
", + "should support line endings in attribute values" + ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("> a f", &mdx)?, + // "
\n

a f

\n
", + // "should support line endings in attribute value expressions" + // ); + + // To do: expressions. + // assert_eq!( + // micromark_with_options("> a e", &mdx)?, + // "
\n

a e

\n
", + // "should support line endings in attribute expressions" + // ); + + assert_eq!( + micromark_with_options("1 < 3", &mdx)?, + "

1 < 3

", + "should allow `<` followed by markdown whitespace as text in markdown" + ); + + Ok(()) +} -- cgit