katex 0.4.6

Rust bindings to KaTeX
Documentation
use super::*;

#[cfg(feature = "wasm-js")]
use wasm_bindgen_test::wasm_bindgen_test as test;

#[cfg(all(feature = "wasm-js", feature = "wasm-js-test-in-browser"))]
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);

#[test]
fn test_render() {
    let html = render("a = b + c").unwrap();
    assert!(!html.contains(r#"span class="katex-display""#));
    assert!(html.contains(r#"span class="katex""#));
    assert!(html.contains(r#"span class="katex-mathml""#));
    assert!(html.contains(r#"span class="katex-html""#));
    assert!(!html.contains(r#"span class="katex-error""#));
}

#[test]
fn test_render_mhchem() {
    let html = render(r#"\ce{CO2 + C -> 2 CO}"#).unwrap();
    assert!(!html.contains(r#"span class="katex-display""#));
    assert!(html.contains(r#"span class="katex""#));
    assert!(html.contains(r#"span class="katex-mathml""#));
    assert!(html.contains(r#"span class="katex-html""#));
    assert!(!html.contains(r#"span class="katex-error""#));
}

#[test]
fn test_passing_opts_by_reference_and_value() {
    let opts = Opts::builder().display_mode(true).build().unwrap();
    let html1 = render_with_opts("a = b + c", &opts).unwrap();
    let html2 = render_with_opts("a = b + c", opts).unwrap();
    assert_eq!(html1, html2);
}

#[test]
fn test_display_mode() {
    let opts = Opts::builder().display_mode(true).build().unwrap();
    let html = render_with_opts("a = b + c", opts).unwrap();
    assert!(html.contains(r#"span class="katex-display""#));
}

#[test]
fn test_output_html_only() {
    let opts = Opts::builder()
        .output_type(OutputType::Html)
        .build()
        .unwrap();
    let html = render_with_opts("a = b + c", opts).unwrap();
    assert!(!html.contains(r#"span class="katex-mathml""#));
    assert!(html.contains(r#"span class="katex-html""#));
}

#[test]
fn test_output_mathml_only() {
    let opts = Opts::builder()
        .output_type(OutputType::Mathml)
        .build()
        .unwrap();
    let html = render_with_opts("a = b + c", opts).unwrap();
    assert!(html.contains(r#"MathML"#));
    assert!(!html.contains(r#"span class="katex-html""#));
}

#[test]
fn test_leqno() {
    let opts = Opts::builder()
        .display_mode(true)
        .leqno(true)
        .build()
        .unwrap();
    let html = render_with_opts("a = b + c", opts).unwrap();
    assert!(html.contains(r#"span class="katex-display leqno""#));
}

#[test]
fn test_fleqn() {
    let opts = Opts::builder()
        .display_mode(true)
        .fleqn(true)
        .build()
        .unwrap();
    let html = render_with_opts("a = b + c", opts).unwrap();
    assert!(html.contains(r#"span class="katex-display fleqn""#));
}

#[test]
fn test_throw_on_error() {
    let err_msg = match render(r#"\"#) {
        Ok(_) => unreachable!(),
        Err(e) => match e {
            Error::JsExecError(msg) => msg,
            _ => unreachable!(),
        },
    };
    assert!(err_msg.contains("ParseError"));
}

#[test]
fn test_error_color() {
    let opts = Opts::builder()
        .throw_on_error(false)
        .error_color("#ff0000")
        .build()
        .unwrap();
    let html = render_with_opts(r#"\"#, opts).unwrap();
    assert!(html.contains(r#"span class="katex-error""#));
    assert!(html.contains("color:#ff0000"));
}

#[test]
fn test_macros() {
    let opts = Opts::builder()
        .add_macro(r#"\RR"#.to_owned(), r#"\mathbb{R}"#.to_owned())
        .build()
        .unwrap();
    let html = render_with_opts(r#"\RR"#, opts).unwrap();
    assert!(html.contains("mathbb"));
}

#[test]
fn test_trust() {
    let opts = Opts::builder().error_color("#ff0000").build().unwrap();
    let html = render_with_opts(r#"\url{https://www.google.com}"#, opts).unwrap();
    assert!(html.contains(r#"color:#ff0000"#));
    assert!(!html.contains(r#"a href="https://www.google.com""#));

    let opts = Opts::builder()
        .error_color("#ff0000")
        .trust(true)
        .build()
        .unwrap();
    let html = render_with_opts(r#"\url{https://www.google.com}"#, opts).unwrap();
    assert!(!html.contains(r#"color:#ff0000"#));
    assert!(html.contains(r#"a href="https://www.google.com""#));
}

#[test]
fn test_stack_overflow() {
    #[inline(never)]
    fn simulate_deep_stack(i: i32) {
        if i > 0 {
            simulate_deep_stack(i - 1);
        } else {
            let html = render("a = b + c").unwrap();
            assert!(html.contains(r#"span class="katex""#));
        }
    }
    simulate_deep_stack(100);
    simulate_deep_stack(0);
}

#[test]
fn test_opts_sync_send() {
    fn is_sync_send<T: Sync + Send>(_: T) {}
    let opts = Opts::builder().build().unwrap();
    is_sync_send(opts);
}

#[test]
fn test_katex_version() {
    assert!(!crate::KATEX_VERSION.is_empty());
    assert!(!crate::KATEX_VERSION.contains('\n'));
}