Files
markdown-rs/mdast_util_to_markdown/tests/math.rs
T

308 lines
7.8 KiB
Rust

use markdown::mdast::{Definition, InlineMath, Math, Node, Paragraph, Text};
use mdast_util_to_markdown::{
to_markdown as to, to_markdown_with_options as to_md_with_opts, Options,
};
use pretty_assertions::assert_eq;
#[test]
fn math() {
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a"),
position: None
}))
.unwrap(),
"$a$\n",
"should serialize math (text)"
);
assert_eq!(
to_md_with_opts(
&Node::InlineMath(InlineMath {
value: String::from("a"),
position: None
}),
&Options {
single_dollar_text_math: false,
..Default::default()
}
)
.unwrap(),
"$$a$$\n",
"should serialize math (text) with at least 2 dollars w/ `single_dollar_text_math: false`"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::new(),
position: None
}))
.unwrap(),
"$$\n",
"should serialize math (text) w/o `value`"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a \\$ b"),
position: None
}))
.unwrap(),
"$$a \\$ b$$\n",
"should serialize math (text) w/ two dollar signs when including a dollar"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a \\$"),
position: None
}))
.unwrap(),
"$$ a \\$ $$\n",
"should serialize math (text) w/ padding when ending in a dollar sign"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("$ a"),
position: None
}))
.unwrap(),
"$$ $ a $$\n",
"should serialize math (text) w/ padding when starting in a dollar sign"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from(" a "),
position: None
}))
.unwrap(),
"$ a $\n",
"should pad w/ a space if the value starts and ends w/ a space"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from(" a"),
position: None
}))
.unwrap(),
"$ a$\n",
"should not pad w/ spaces if the value ends w/ a non-space"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a "),
position: None
}))
.unwrap(),
"$a $\n",
"should not pad w/ spaces if the value starts w/ a non-space"
);
assert_eq!(
to(&Node::Math(Math {
value: String::from("a"),
position: None,
meta: None
}))
.unwrap(),
"$$\na\n$$\n",
"should serialize math (flow)"
);
assert_eq!(
to(&Node::Math(Math {
value: String::new(),
position: None,
meta: None
}))
.unwrap(),
"$$\n$$\n",
"should serialize math (flow) w/o `value`"
);
assert_eq!(
to(&Node::Math(Math {
value: String::new(),
position: None,
meta: String::from("a").into()
}))
.unwrap(),
"$$a\n$$\n",
"should serialize math (flow) w/ `meta`"
);
assert_eq!(
to(&Node::Math(Math {
value: String::from("$$"),
position: None,
meta: None
}))
.unwrap(),
"$$$\n$$\n$$$\n",
"should serialize math (flow) w/ more dollars than occur together in `value`"
);
assert_eq!(
to(&Node::Paragraph(Paragraph {
children: vec![Node::Text(Text {
value: String::from("a $ b"),
position: None
})],
position: None
}))
.unwrap(),
"a \\$ b\n",
"should escape `$` in phrasing"
);
assert_eq!(
to_md_with_opts(
&Node::Paragraph(Paragraph {
children: vec![Node::Text(Text {
value: String::from("a $ b"),
position: None
})],
position: None
}),
&Options {
single_dollar_text_math: false,
..Default::default()
}
)
.unwrap(),
"a $ b\n",
"should not escape a single dollar in phrasing w/ `single_dollar_text_math: false`'"
);
assert_eq!(
to_md_with_opts(
&Node::Paragraph(Paragraph {
children: vec![Node::Text(Text {
value: String::from("a $$ b"),
position: None
})],
position: None
}),
&Options {
single_dollar_text_math: false,
..Default::default()
}
)
.unwrap(),
"a \\$$ b\n",
"should escape two dollars in phrasing w/ `single_dollar_text_math: false`"
);
assert_eq!(
to(&Node::Paragraph(Paragraph {
children: vec![
Node::Text(Text {
value: String::from("a $"),
position: None
}),
Node::InlineMath(InlineMath {
value: String::from("b"),
position: None
}),
Node::Text(Text {
value: String::from("$ c"),
position: None
}),
],
position: None
}))
.unwrap(),
"a \\$$b$\\$ c\n",
"should escape `$` around math (text)"
);
assert_eq!(
to(&Node::Definition(Definition {
position: None,
url: String::from("b"),
title: String::from("a\n$\nb").into(),
identifier: String::from("a"),
label: String::from("a").into(),
}))
.unwrap(),
"[a]: b \"a\n$\nb\"\n",
"should not escape `$` at the start of a line"
);
assert_eq!(
to(&Node::Math(Math {
value: String::new(),
position: None,
meta: String::from("a\rb\nc").into()
}))
.unwrap(),
"$$a
b
c\n$$\n",
"should escape `\\r`, `\\n` when in `meta` of math (flow)"
);
assert_eq!(
to(&Node::Math(Math {
value: String::new(),
position: None,
meta: String::from("a$b").into()
}))
.unwrap(),
"$$a$b\n$$\n",
"should escape `$` when in `meta` of math (flow)"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a\n- b"),
position: None
}))
.unwrap(),
"$a - b$\n",
"should prevent breaking out of code (-)"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a\n#"),
position: None
}))
.unwrap(),
"$a #$\n",
"should prevent breaking out of code (#)"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a\n1. "),
position: None
}))
.unwrap(),
"$a 1. $\n",
"should prevent breaking out of code (\\d\\.)"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a\r- b"),
position: None
}))
.unwrap(),
"$a - b$\n",
"should prevent breaking out of code (cr)"
);
assert_eq!(
to(&Node::InlineMath(InlineMath {
value: String::from("a\n- b"),
position: None
}))
.unwrap(),
"$a - b$\n",
"should prevent breaking out of code (crlf)"
);
}