extern crate micromark;
use micromark::{
mdast::{Node, Paragraph, Root, Text},
micromark, micromark_to_mdast, micromark_with_options,
unist::Position,
Constructs, Options,
};
use pretty_assertions::assert_eq;
#[test]
fn character_reference() -> Result<(), String> {
assert_eq!(
micromark(
" & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸"
),
"<p>\u{a0} & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸</p>",
"should support named character references"
);
assert_eq!(
micromark("# Ӓ Ϡ �"),
"<p># Ӓ Ϡ �</p>",
"should support decimal character references"
);
assert_eq!(
micromark("" ആ ಫ"),
"<p>" ആ ಫ</p>",
"should support hexadecimal character references"
);
assert_eq!(
micromark(
"  &x; &#; &#x;\n�\n&#abcdef0;\n&ThisIsNotDefined; &hi?;"),
"<p>&nbsp &x; &#; &#x;\n&#987654321;\n&#abcdef0;\n&ThisIsNotDefined; &hi?;</p>",
"should not support other things that look like character references"
);
assert_eq!(
micromark("©"),
"<p>&copy</p>",
"should not support character references w/o semicolon"
);
assert_eq!(
micromark("&MadeUpEntity;"),
"<p>&MadeUpEntity;</p>",
"should not support unknown named character references"
);
assert_eq!(
micromark_with_options(
"<a href=\"öö.html\">",
&Options {
allow_dangerous_html: true,
..Options::default()
}
)?,
"<a href=\"öö.html\">",
"should not care about character references in html"
);
assert_eq!(
micromark("[foo](/föö \"föö\")"),
"<p><a href=\"/f%C3%B6%C3%B6\" title=\"föö\">foo</a></p>",
"should support character references in resource URLs and titles"
);
assert_eq!(
micromark("[foo]: /föö \"föö\"\n\n[foo]"),
"<p><a href=\"/f%C3%B6%C3%B6\" title=\"föö\">foo</a></p>",
"should support character references in definition URLs and titles"
);
assert_eq!(
micromark("``` föö\nfoo\n```"),
"<pre><code class=\"language-föö\">foo\n</code></pre>",
"should support character references in code language"
);
assert_eq!(
micromark("`föö`"),
"<p><code>f&ouml;&ouml;</code></p>",
"should not support character references in text code"
);
assert_eq!(
micromark(" föfö"),
"<pre><code>f&ouml;f&ouml;\n</code></pre>",
"should not support character references in indented code"
);
assert_eq!(
micromark("*foo*\n*foo*"),
"<p>*foo*\n<em>foo</em></p>",
"should not support character references as construct markers (1)"
);
assert_eq!(
micromark("* foo\n\n* foo"),
"<p>* foo</p>\n<ul>\n<li>foo</li>\n</ul>",
"should not support character references as construct markers (2)"
);
assert_eq!(
micromark("[a](url "tit")"),
"<p>[a](url "tit")</p>",
"should not support character references as construct markers (3)"
);
assert_eq!(
micromark("foo bar"),
"<p>foo\n\nbar</p>",
"should not support character references as whitespace (1)"
);
assert_eq!(
micromark("	foo"),
"<p>\tfoo</p>",
"should not support character references as whitespace (2)"
);
// Extra:
assert_eq!(
micromark("∳"),
"<p>∳</p>",
"should support the longest possible named character reference"
);
assert_eq!(
micromark("�"),
"<p>�</p>",
"should “support” a longest possible hexadecimal character reference"
);
assert_eq!(
micromark("�"),
"<p>�</p>",
"should “support” a longest possible decimal character reference"
);
assert_eq!(
micromark("&CounterClockwiseContourIntegrali;"),
"<p>&CounterClockwiseContourIntegrali;</p>",
"should not support the longest possible named character reference"
);
assert_eq!(
micromark("�"),
"<p>&#xff99999;</p>",
"should not support a longest possible hexadecimal character reference"
);
assert_eq!(
micromark("�"),
"<p>&#99999999;</p>",
"should not support a longest possible decimal character reference"
);
assert_eq!(
micromark("&-;"),
"<p>&-;</p>",
"should not support the other characters after `&`"
);
assert_eq!(
micromark("&#-;"),
"<p>&#-;</p>",
"should not support the other characters after `#`"
);
assert_eq!(
micromark("&#x-;"),
"<p>&#x-;</p>",
"should not support the other characters after `#x`"
);
assert_eq!(
micromark("<-;"),
"<p>&lt-;</p>",
"should not support the other characters inside a name"
);
assert_eq!(
micromark("	-;"),
"<p>&#9-;</p>",
"should not support the other characters inside a demical"
);
assert_eq!(
micromark("	-;"),
"<p>&#x9-;</p>",
"should not support the other characters inside a hexademical"
);
assert_eq!(
micromark_with_options(
"&",
&Options {
constructs: Constructs {
character_reference: false,
..Constructs::default()
},
..Options::default()
}
)?,
"<p>&amp;</p>",
"should support turning off character references"
);
assert_eq!(
micromark_to_mdast(" & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸", &Options::default())?,
Node::Root(Root {
children: vec![Node::Paragraph(Paragraph {
children: vec![Node::Text(Text {
value: "\u{a0} & © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸".to_string(),
position: Some(Position::new(1, 1, 0, 3, 33, 109))
}),],
position: Some(Position::new(1, 1, 0, 3, 33, 109))
})],
position: Some(Position::new(1, 1, 0, 3, 33, 109))
}),
"should support character references as `Text`s in mdast"
);
Ok(())
}