katana-document-viewer 0.1.4

KatanA document viewer artifact, render evaluation, and export foundation.
Documentation
use super::SurfaceMathText;

#[test]
fn renders_common_tex_as_surface_text() {
    let text = SurfaceMathText::render(r"f(x) = \int_{0}^{x} \frac{t^2}{1 + t^4} \, dt");

    assert!(text.contains(''));
    assert!(text.contains(""));
    assert!(text.contains(''));
    assert!(!text.contains(r"\int"));
    assert!(!text.contains(r"\frac"));
}

#[test]
fn renders_inline_and_sum_scripts() {
    let inline = SurfaceMathText::render("E = mc^2");
    let block = SurfaceMathText::render(r"\sum_{k=1}^{n} k = \frac{n(n+1)}{2}");

    assert!(inline.contains("mc²"));
    assert!(block.contains(''));
    assert!(block.contains(''));
    assert!(!block.contains(r"\sum_"));
}

#[test]
fn fraction_parser_requires_matching_braces() {
    let text = SurfaceMathText::render(r"\frac{a}{b");

    assert!(text.contains("frac"));
    assert!(!text.contains('\\'));
}

#[test]
fn script_parser_keeps_unbraced_script_fallback() {
    let text = SurfaceMathText::render(r"x^x_2");

    assert!(text.contains('ˣ'));
    assert!(text.contains('') || text.contains(''));
}

#[test]
fn renders_single_char_scripts_after_text() {
    let text = SurfaceMathText::render("a^{1}+b_3");

    assert!(text.contains('¹'));
    assert!(text.contains(''));
    assert!(!text.contains('\\'));
}

#[test]
fn render_skips_unrecognized_escape_and_empty_script() {
    let text = SurfaceMathText::render(r"x\\y^+");

    assert_eq!(text, "xy⁺");
}

#[test]
fn render_treats_unmatched_fraction_as_plain_text() {
    let first = SurfaceMathText::render(r"\frac a b");
    let second = SurfaceMathText::render(r"\frac{a{b");

    assert!(!first.contains(''));
    assert!(!second.contains(''));
    assert!(first.contains("frac"));
    assert!(second.contains("frac"));
}

#[test]
fn script_mapping_keeps_unknown_characters() {
    let text = SurfaceMathText::render(r"x^a + y_k");

    assert!(text.contains('a') || text.contains('x'));
    assert!(text.contains(''));
}

#[test]
fn renders_all_script_digits_and_operators() {
    let text = SurfaceMathText::render(r"x^{0123456789+-=nx}_{0123456789+-=kz}");

    assert!(text.contains("⁰¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼ⁿˣ"));
    assert!(text.contains("₀₁₂₃₄₅₆₇₈₉₊₋₌ₖz"));
}

#[test]
fn render_empty_expression_stays_empty() {
    assert_eq!(SurfaceMathText::render("   "), "");
}

#[test]
fn render_handles_internal_empty_character_paths() {
    let text = super::render_inline_text("");
    let script = super::take_script("");

    assert_eq!(text, "");
    assert_eq!(script, ("", ""));
}

#[test]
fn render_next_character_handles_empty_remaining_text() {
    let mut renderer = super::MathRenderer::new("");

    renderer.render_next_character();

    assert_eq!(renderer.remaining, "");
}

#[test]
fn script_parser_handles_nested_braces() {
    assert_eq!(super::take_script("{a{b}}c"), ("a{b}", "c"));
}