aboutsummaryrefslogtreecommitdiffstats
path: root/tests/mdx_jsx_text.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/mdx_jsx_text.rs')
-rw-r--r--tests/mdx_jsx_text.rs274
1 files changed, 273 insertions, 1 deletions
diff --git a/tests/mdx_jsx_text.rs b/tests/mdx_jsx_text.rs
index be76d6f..94e7b0c 100644
--- a/tests/mdx_jsx_text.rs
+++ b/tests/mdx_jsx_text.rs
@@ -1,6 +1,12 @@
extern crate micromark;
mod test_utils;
-use micromark::{micromark_with_options, Constructs, Options};
+use micromark::{
+ mdast::{
+ AttributeContent, AttributeValue, Emphasis, MdxJsxAttribute, MdxJsxTextElement, Node,
+ Paragraph, Position, Root, Text,
+ },
+ micromark_to_mdast, micromark_with_options, Constructs, Options,
+};
use pretty_assertions::assert_eq;
use test_utils::{parse_esm, parse_expression};
@@ -41,6 +47,272 @@ fn mdx_jsx_text_core() -> Result<(), String> {
"should support markdown inside elements"
);
+ assert_eq!(
+ micromark_to_mdast("a <b /> c.", &mdx)?,
+ Node::Root(Root {
+ children: vec![Node::Paragraph(Paragraph {
+ children: vec![
+ Node::Text(Text {
+ value: "a ".to_string(),
+ position: Some(Position::new(1, 1, 0, 1, 3, 2))
+ }),
+ Node::MdxJsxTextElement(MdxJsxTextElement {
+ name: Some("b".to_string()),
+ attributes: vec![],
+ children: vec![],
+ position: Some(Position::new(1, 3, 2, 1, 8, 7))
+ }),
+ Node::Text(Text {
+ value: " c.".to_string(),
+ position: Some(Position::new(1, 8, 7, 1, 11, 10))
+ })
+ ],
+ position: Some(Position::new(1, 1, 0, 1, 11, 10))
+ })],
+ position: Some(Position::new(1, 1, 0, 1, 11, 10))
+ }),
+ "should support mdx jsx (text) as `MdxJsxTextElement`s in mdast (self-closing)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("a <b>*c*</b> d.", &mdx)?,
+ Node::Root(Root {
+ children: vec![Node::Paragraph(Paragraph {
+ children: vec![
+ Node::Text(Text {
+ value: "a ".to_string(),
+ position: Some(Position::new(1, 1, 0, 1, 3, 2))
+ }),
+ Node::MdxJsxTextElement(MdxJsxTextElement {
+ name: Some("b".to_string()),
+ attributes: vec![],
+ children: vec![
+ Node::Emphasis(Emphasis {
+ children: vec![
+ Node::Text(Text {
+ value: "c".to_string(),
+ position: Some(Position::new(1, 7, 6, 1, 8, 7))
+ }),
+ ],
+ position: Some(Position::new(1, 6, 5, 1, 9, 8))
+ }),
+ ],
+ position: Some(Position::new(1, 3, 2, 1, 13, 12))
+ }),
+ Node::Text(Text {
+ value: " d.".to_string(),
+ position: Some(Position::new(1, 13, 12, 1, 16, 15))
+ })
+ ],
+ position: Some(Position::new(1, 1, 0, 1, 16, 15))
+ })],
+ position: Some(Position::new(1, 1, 0, 1, 16, 15))
+ }),
+ "should support mdx jsx (text) as `MdxJsxTextElement`s in mdast (matched open and close tags)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("<a:b />.", &mdx)?,
+ Node::Root(Root {
+ children: vec![Node::Paragraph(Paragraph {
+ children: vec![
+ Node::MdxJsxTextElement(MdxJsxTextElement {
+ name: Some("a:b".to_string()),
+ attributes: vec![],
+ children: vec![],
+ position: Some(Position::new(1, 1, 0, 1, 8, 7))
+ }),
+ Node::Text(Text {
+ value: ".".to_string(),
+ position: Some(Position::new(1, 8, 7, 1, 9, 8))
+ })
+ ],
+ position: Some(Position::new(1, 1, 0, 1, 9, 8))
+ })],
+ position: Some(Position::new(1, 1, 0, 1, 9, 8))
+ }),
+ "should support mdx jsx (text) as `MdxJsxTextElement`s in mdast (namespace in tag name)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("<a.b.c />.", &mdx)?,
+ Node::Root(Root {
+ children: vec![Node::Paragraph(Paragraph {
+ children: vec![
+ Node::MdxJsxTextElement(MdxJsxTextElement {
+ name: Some("a.b.c".to_string()),
+ attributes: vec![],
+ children: vec![],
+ position: Some(Position::new(1, 1, 0, 1, 10, 9))
+ }),
+ Node::Text(Text {
+ value: ".".to_string(),
+ position: Some(Position::new(1, 10, 9, 1, 11, 10))
+ })
+ ],
+ position: Some(Position::new(1, 1, 0, 1, 11, 10))
+ })],
+ position: Some(Position::new(1, 1, 0, 1, 11, 10))
+ }),
+ "should support mdx jsx (text) as `MdxJsxTextElement`s in mdast (members in tag name)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("<a {...b} />.", &mdx)?,
+ Node::Root(Root {
+ children: vec![Node::Paragraph(Paragraph {
+ children: vec![
+ Node::MdxJsxTextElement(MdxJsxTextElement {
+ name: Some("a".to_string()),
+ attributes: vec![AttributeContent::Expression("...b".to_string())],
+ children: vec![],
+ position: Some(Position::new(1, 1, 0, 1, 13, 12))
+ }),
+ Node::Text(Text {
+ value: ".".to_string(),
+ position: Some(Position::new(1, 13, 12, 1, 14, 13))
+ })
+ ],
+ position: Some(Position::new(1, 1, 0, 1, 14, 13))
+ })],
+ position: Some(Position::new(1, 1, 0, 1, 14, 13))
+ }),
+ "should support mdx jsx (text) as `MdxJsxTextElement`s in mdast (attribute expression)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("<a b c:d />.", &mdx)?,
+ Node::Root(Root {
+ children: vec![Node::Paragraph(Paragraph {
+ children: vec![
+ Node::MdxJsxTextElement(MdxJsxTextElement {
+ name: Some("a".to_string()),
+ attributes: vec![
+ AttributeContent::Property(MdxJsxAttribute {
+ name: "b".to_string(),
+ value: None,
+ }),
+ AttributeContent::Property(MdxJsxAttribute {
+ name: "c:d".to_string(),
+ value: None,
+ })
+ ],
+ children: vec![],
+ position: Some(Position::new(1, 1, 0, 1, 12, 11))
+ }),
+ Node::Text(Text {
+ value: ".".to_string(),
+ position: Some(Position::new(1, 12, 11, 1, 13, 12))
+ })
+ ],
+ position: Some(Position::new(1, 1, 0, 1, 13, 12))
+ })],
+ position: Some(Position::new(1, 1, 0, 1, 13, 12))
+ }),
+ "should support mdx jsx (text) as `MdxJsxTextElement`s in mdast (property names)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("<a b='c' d=\"e\" f={g} />.", &mdx)?,
+ Node::Root(Root {
+ children: vec![Node::Paragraph(Paragraph {
+ children: vec![
+ Node::MdxJsxTextElement(MdxJsxTextElement {
+ name: Some("a".to_string()),
+ attributes: vec![
+ AttributeContent::Property(MdxJsxAttribute {
+ name: "b".to_string(),
+ value: Some(AttributeValue::Literal("c".to_string())),
+ }),
+ AttributeContent::Property(MdxJsxAttribute {
+ name: "d".to_string(),
+ value: Some(AttributeValue::Literal("e".to_string())),
+ }),
+ AttributeContent::Property(MdxJsxAttribute {
+ name: "f".to_string(),
+ value: Some(AttributeValue::Expression("g".to_string())),
+ }),
+ ],
+ children: vec![],
+ position: Some(Position::new(1, 1, 0, 1, 24, 23))
+ }),
+ Node::Text(Text {
+ value: ".".to_string(),
+ position: Some(Position::new(1, 24, 23, 1, 25, 24))
+ })
+ ],
+ position: Some(Position::new(1, 1, 0, 1, 25, 24))
+ })],
+ position: Some(Position::new(1, 1, 0, 1, 25, 24))
+ }),
+ "should support mdx jsx (text) as `MdxJsxTextElement`s in mdast (attribute values)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("a </b> c", &mdx)
+ .err()
+ .unwrap(),
+ "1:4: Unexpected closing slash `/` in tag, expected an open tag first (mdx-jsx:unexpected-closing-slash)",
+ "should crash when building the ast on a closing tag if none is open"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("a <b> c </b/> d", &mdx)
+ .err()
+ .unwrap(),
+ "1:12: Unexpected self-closing slash `/` in closing tag, expected the end of the tag (mdx-jsx:unexpected-self-closing-slash)",
+ "should crash when building the ast on a closing tag with a self-closing slash"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("a <b> c </b d> e", &mdx)
+ .err()
+ .unwrap(),
+ "1:13: Unexpected attribute in closing tag, expected the end of the tag (mdx-jsx:unexpected-attribute)",
+ "should crash when building the ast on a closing tag with an attribute"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("a <>b</c> d", &mdx)
+ .err()
+ .unwrap(),
+ "1:6: Unexpected closing tag `</c>`, expected corresponding closing tag for `<>` (1:3) (mdx-jsx:end-tag-mismatch)",
+ "should crash when building the ast on mismatched tags (1)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("a <b>c</> d", &mdx)
+ .err()
+ .unwrap(),
+ "1:7: Unexpected closing tag `</>`, expected corresponding closing tag for `<b>` (1:3) (mdx-jsx:end-tag-mismatch)",
+ "should crash when building the ast on mismatched tags (2)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("*a <b>c* d</b>.", &mdx).err().unwrap(),
+ "1:9: Expected a closing tag for `<b>` (1:4) before the end of `Emphasis` (mdx-jsx:end-tag-mismatch)",
+ "should crash when building the ast on mismatched interleaving (1)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("<a>b *c</a> d*.", &mdx).err().unwrap(),
+ "1:8: Expected the closing tag `</a>` either before the start of `Emphasis` (1:6), or another opening tag after that start (mdx-jsx:end-tag-mismatch)",
+ "should crash when building the ast on mismatched interleaving (2)"
+ );
+
+ assert_eq!(
+ micromark_to_mdast("a <b>.", &mdx).err().unwrap(),
+ "1:7: Expected a closing tag for `<b>` (1:3) before the end of `Paragraph` (mdx-jsx:end-tag-mismatch)",
+ "should crash when building the ast on mismatched interleaving (3)"
+ );
+
+ // Note: this is flow, not text.
+ assert_eq!(
+ micromark_to_mdast("<a>", &mdx).err().unwrap(),
+ "1:4: Expected a closing tag for `<a>` (1:1) (mdx-jsx:end-tag-mismatch)",
+ "should crash when building the ast on mismatched interleaving (4)"
+ );
+
Ok(())
}