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 / b\nc/>", &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 *b*/c>", &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("aa 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("aa b.
", "should support dots in names for method names" ); assert_eq!( micromark_with_options("aa b.
", "should support colons in names for local names" ); assert_eq!( micromark_with_options("aa 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(".
", // "should support attribute expressions directly after a member name" // ); // To do: expressions. // assert_eq!( // micromark_with_options(".
", // "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 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("aa
", "should support mismatched tags (3)" ); assert_eq!( micromark_with_options("a ", &mdx)?, "a
", "should support mismatched tags (4)" ); assert_eq!( micromark_with_options("aa
", "should support mismatched tags (5)" ); assert_eq!( micromark_with_options("aa
", "should support mismatched tags (6)" ); assert_eq!( micromark_with_options("aa
", "should support mismatched tags (7)" ); assert_eq!( micromark_with_options("aa
", "should support mismatched tags (8)" ); assert_eq!( micromark_with_options("aa
", "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( ".
", "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: © ≠ 𝌆.
", "should support character references in text" ); assert_eq!( micromark_with_options(".
", "should support as text if the closing tag is not the last thing" ); assert_eq!( micromark_with_options("aa
", "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 d.
", "should not care about precedence between label (image)" ); assert_eq!( micromark_with_options("> a \n> c d.", &mdx)?, "\n", "should support line endings in elements" ); assert_eq!( micromark_with_options("> a f", &mdx)?, "a \nc d.
\n
\n", "should support line endings in attribute values" ); // To do: expressions. // assert_eq!( // micromark_with_options("> a f", &mdx)?, // "a f
\n
\n", // "should support line endings in attribute value expressions" // ); // To do: expressions. // assert_eq!( // micromark_with_options("> a e", &mdx)?, // "a f
\n
\n", // "should support line endings in attribute expressions" // ); assert_eq!( micromark_with_options("> a c", &mdx)?, "a e
\n
\n", "should support lazy text (1)" ); assert_eq!( micromark_with_options("> a e", &mdx)?, "a c
\n
\n", "should support lazy text (2)" ); assert_eq!( micromark_with_options("> a e", &mdx)?, "a e
\n
\n", "should support lazy text (3)" ); assert_eq!( micromark_with_options("> a f", &mdx)?, "a e
\n
\n", "should support lazy text (4)" ); assert_eq!( micromark_with_options("1 < 3", &mdx)?, "a f
\n
1 < 3
", "should allow `<` followed by markdown whitespace as text in markdown" ); Ok(()) }