use pulldown_latex::{push_mathml, Parser, Storage};
fn render(input: &str) -> String {
let storage = Storage::new();
let parser = Parser::new(input, &storage);
let errors: Vec<_> = Parser::new(input, &storage)
.filter_map(|e| e.err())
.collect();
assert!(
errors.is_empty(),
"expected no parse errors for {:?}, got {:?}",
input,
errors
);
let mut out = String::new();
push_mathml(&mut out, parser, Default::default())
.unwrap_or_else(|e| panic!("rendering failed for {:?}: {}", input, e));
out
}
#[test]
fn mathord_single_char() {
let out = render(r"\mathord{+}");
assert!(
out.contains("<mi>+</mi>") || out.contains("<mi mathvariant=\"normal\">+</mi>"),
"expected <mi>+</mi> in {out}"
);
}
#[test]
fn mathrel_single_char() {
let out = render(r"a \mathrel{R} b");
assert!(out.contains("<mo>R</mo>"), "expected <mo>R</mo> in {out}");
}
#[test]
fn mathbin_single_char() {
let out = render(r"a \mathbin{*} b");
assert!(
out.contains("<mo>*</mo>") || out.contains("<mo>*</mo>"),
"expected <mo>*</mo> in {out}"
);
}
#[test]
fn mathop_single_char() {
let out = render(r"\mathop{X}_{i=1}");
assert!(out.contains("X"), "expected operator X in {out}");
}
#[test]
fn mathop_multi_char_renders_as_function() {
let out = render(r"\mathop{foo}(x)");
assert!(out.contains("foo"), "expected 'foo' in {out}");
}
#[test]
fn mathopen_mathclose() {
let out = render(r"\mathopen{[}x\mathclose{]}");
assert!(out.contains("["), "expected '[' in {out}");
assert!(out.contains("]"), "expected ']' in {out}");
}
#[test]
fn mathpunct_single_char() {
let out = render(r"a\mathpunct{;}b");
assert!(out.contains("<mo>;</mo>"), "expected <mo>;</mo> in {out}");
}
#[test]
fn mathinner_renders_without_error() {
let out = render(r"\mathinner{abc}");
assert!(out.contains("a"), "expected 'a' in {out}");
assert!(out.contains("b"), "expected 'b' in {out}");
assert!(out.contains("c"), "expected 'c' in {out}");
}
#[test]
fn all_atom_commands_parse_in_one_expression() {
let out = render(
r"\mathord{a} \mathop{f} \mathbin{+} \mathrel{=} \mathopen{(} x \mathclose{)} \mathpunct{,} \mathinner{y}",
);
assert!(!out.is_empty());
}