extern crate micromark; use micromark::{ mdast::{List, ListItem, MdxJsxFlowElement, Node, Paragraph, Root, Text}, micromark_to_mdast, micromark_with_options, unist::Position, Constructs, Options, ParseOptions, }; use pretty_assertions::assert_eq; #[test] fn mdx_jsx_flow_agnostic() -> Result<(), String> { let mdx = Options { parse: ParseOptions { constructs: Constructs::mdx(), ..ParseOptions::default() }, ..Options::default() }; assert_eq!( micromark_with_options("", &mdx)?, "", "should support a self-closing element" ); assert_eq!( micromark_with_options("", &mdx)?, "", "should support a closed element" ); assert_eq!( micromark_with_options("\nb\n", &mdx)?, "

b

\n", "should support an element w/ content" ); assert_eq!( micromark_with_options("\n- b\n", &mdx)?, "\n", "should support an element w/ containers as content" ); assert_eq!( micromark_with_options("", &mdx)?, "", "should support attributes" ); Ok(()) } // Flow is mostly the same as `text`, so we only test the relevant // differences. #[test] fn mdx_jsx_flow_essence() -> Result<(), String> { let mdx = Options { parse: ParseOptions { constructs: Constructs::mdx(), ..ParseOptions::default() }, ..Options::default() }; assert_eq!( micromark_with_options("", &mdx)?, "", "should support an element" ); assert_eq!( micromark_with_options("\n- b\n", &mdx)?, "\n", "should support an element around a container" ); assert_eq!( micromark_with_options(" \nb\n ", &mdx)?, "

b

\n", "should support a dangling `>` in a tag (not a block quote)" ); assert_eq!( micromark_with_options(" \nb\n ", &mdx)?, "

b

\n", "should support trailing initial and final whitespace around tags" ); assert_eq!( micromark_with_options(" \t\nc\n ", &mdx)?, "

c

\n", "should support tags after tags" ); assert_eq!( micromark_with_options("> ", &mdx).err().unwrap(), "2:1: Unexpected lazy line in jsx in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc", "should not support lazy flow (1)" ); assert_eq!( micromark_with_options("> a\n> ", &mdx) .err() .unwrap(), "3:1: Unexpected lazy line in jsx in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc", "should not support lazy flow (2)" ); assert_eq!( micromark_with_options("> ", &mdx) .err() .unwrap(), "2:1: Unexpected lazy line in jsx in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc", "should not support lazy flow (3)" ); assert_eq!( micromark_with_options("> ", &mdx) .err() .unwrap(), "2:1: Unexpected lazy line in jsx in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc", "should not support lazy flow (4)" ); assert_eq!( micromark_with_options("> ", &mdx) .err() .unwrap(), "2:1: Unexpected lazy line in jsx in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc", "should not support lazy flow (4)" ); assert_eq!( micromark_with_options("> ", &mdx) .err() .unwrap(), "2:1: Unexpected lazy line in expression in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc", "should not support lazy flow (5)" ); assert_eq!( micromark_with_options("> ", &mdx) .err() .unwrap(), "2:1: Unexpected lazy line in expression in container, expected line to be prefixed with `>` when in a block quote, whitespace when in a list, etc", "should not support lazy flow (6)" ); assert_eq!( micromark_with_options("> a\n", &mdx)?, "
\n

a

\n
\n", "should not support lazy flow (7)" ); assert_eq!( micromark_to_mdast("<>\n * a\n", &mdx.parse)?, Node::Root(Root { children: vec![Node::MdxJsxFlowElement(MdxJsxFlowElement { name: None, attributes: vec![], children: vec![Node::List(List { ordered: false, spread: false, start: None, children: vec![Node::ListItem(ListItem { checked: None, spread: false, children: vec![Node::Paragraph(Paragraph { children: vec![Node::Text(Text { value: "a".into(), position: Some(Position::new(2, 5, 7, 2, 6, 8)) }),], position: Some(Position::new(2, 5, 7, 2, 6, 8)) })], position: Some(Position::new(2, 1, 3, 2, 6, 8)) })], position: Some(Position::new(2, 1, 3, 2, 6, 8)) })], position: Some(Position::new(1, 1, 0, 3, 4, 12)) })], position: Some(Position::new(1, 1, 0, 3, 4, 12)) }), "should support mdx jsx (flow) as `MdxJsxFlowElement`s in mdast" ); Ok(()) }