katana-render-runtime 0.3.6

Versioned render runtime for KatanA diagrams and math (Mermaid, Draw.io, ZenUML, PlantUML, MathJax).
Documentation
use super::MermaidRuntimeScripts;

#[test]
fn zenuml_runtime_loads_after_mermaid_zenuml_and_before_render_script() {
    let scripts = MermaidRuntimeScripts::build_with_zenuml(
        "mermaid bundle",
        "globalThis[\"mermaid-zenuml\"] = { id: \"registered\" };",
        r#"{"source":"zenuml\nA.method()","diagramType":"zenuml"}"#,
    );
    let names = script_names(&scripts);

    assert_order(&names, "mermaid-zenuml.min.js", "zenuml-runtime.min.js");
    assert_order(&names, "zenuml-runtime.min.js", "render-mermaid.js");
}

#[test]
fn non_zenuml_runtime_does_not_load_zenuml_runtime_bundle() {
    let scripts = MermaidRuntimeScripts::build_with_zenuml(
        "mermaid bundle",
        "globalThis[\"mermaid-zenuml\"] = { id: \"registered\" };",
        r#"{"source":"graph TD; A-->B","diagramType":""}"#,
    );

    assert!(!script_names(&scripts).contains(&"zenuml-runtime.min.js"));
}

#[test]
fn render_script_calls_only_mermaid_entrypoint() {
    let scripts = MermaidRuntimeScripts::build_with_zenuml(
        "mermaid bundle",
        "globalThis[\"mermaid-zenuml\"] = { id: \"registered\" };",
        r#"{"source":"graph TD; A-->B","diagramType":""}"#,
    );
    let render_script = scripts
        .iter()
        .find(|script| script.name == "render-mermaid.js")
        .map(|script| script.code.as_ref())
        .unwrap_or("");

    assert!(render_script.contains("katanaRunMermaidRuntime("));
    assert!(!render_script.contains("katanaInstallMermaidZenumlRuntimeAdapter"));
}

fn script_names(
    scripts: &[crate::markdown::diagram_js_runtime::DiagramRuntimeScript<'_>],
) -> Vec<&'static str> {
    scripts.iter().map(|script| script.name).collect()
}

fn assert_order(names: &[&str], before: &str, after: &str) {
    let before_index = names.iter().position(|name| *name == before).unwrap_or(0);
    let after_index = names.iter().position(|name| *name == after).unwrap_or(0);
    assert!(
        before_index < after_index,
        "{before} should be loaded before {after}: {names:?}"
    );
}