katana-document-viewer 0.1.4

KatanA document viewer artifact, render evaluation, and export foundation.
Documentation
use super::*;
use katana_markdown_model::{
    ByteRange, HeadingNode, LineColumn, LineColumnRange, MarkdownInput, RawSnippet, TextFingerprint,
};

#[test]
fn snapshot_keeps_kmm_outline_and_revision() {
    let source = DocumentSource {
        uri: SourceUri("file:///sample.md".to_string()),
        kind: SourceKind::Markdown,
        revision: SourceRevision("rev-1".to_string()),
        content: "# Title".to_string(),
    };
    let snapshot = DocumentSnapshotFactory::from_kmm(source, sample_document());

    assert_eq!(snapshot.revision, SourceRevision("rev-1".to_string()));
    assert_eq!(snapshot.outline.items.len(), 1);
    assert_eq!(snapshot.outline.items[0].text, "Title");
}

fn sample_document() -> KmmDocument {
    KmmDocument {
        path: PathBuf::from("sample.md"),
        fingerprint: TextFingerprint {
            algorithm: "test".to_string(),
            value: "doc-1".to_string(),
        },
        nodes: vec![KmmNode {
            id: KmmNodeId("node-1".to_string()),
            kind: KmmNodeKind::Heading(HeadingNode {
                level: 1,
                text: "Title".to_string(),
            }),
            source: sample_span("# Title"),
            children: Vec::new(),
        }],
    }
}

fn sample_span(text: &str) -> SourceSpan {
    SourceSpan {
        byte_range: ByteRange {
            start: 0,
            end: text.len(),
        },
        line_column_range: LineColumnRange {
            start: LineColumn { line: 1, column: 1 },
            end: LineColumn {
                line: 1,
                column: text.len() + 1,
            },
        },
        raw: RawSnippet {
            text: text.to_string(),
        },
    }
}

#[test]
fn from_parse_result_returns_snapshot_for_success() -> Result<(), Box<dyn std::error::Error>> {
    let source = DocumentSource {
        uri: SourceUri("file:///success.md".to_string()),
        kind: SourceKind::Markdown,
        revision: SourceRevision("rev".to_string()),
        content: "# Success".to_string(),
    };
    let parsed = katana_markdown_model::KatanaMarkdownModel::parse(MarkdownInput::from_content(
        "success.md",
        source.content.clone(),
    ))?;
    let snapshot = DocumentSnapshotFactory::from_parse_result(source, Ok(parsed))?;

    assert_eq!(snapshot.revision, SourceRevision("rev".to_string()));
    assert_eq!(snapshot.kind, DocumentKind::Markdown);
    assert_eq!(
        snapshot.source_uri,
        SourceUri("file:///success.md".to_string())
    );
    Ok(())
}

#[test]
fn from_parse_result_propagates_parse_error() {
    let source = DocumentSource {
        uri: SourceUri("file:///error.md".to_string()),
        kind: SourceKind::Markdown,
        revision: SourceRevision("rev".to_string()),
        content: String::new(),
    };

    let snapshot = DocumentSnapshotFactory::from_parse_result(source, Err(KmmError::EmptySource));

    assert!(matches!(
        snapshot,
        Err(DocumentModelError::KmmParse(KmmError::EmptySource))
    ));
}