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)?,
"\na
\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".to_string(),
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(())
}