clankerdiff-markdown 0.1.2

Portable semantic Markdown parsing and review state
Documentation
#![cfg(feature = "review")]

use clankerdiff_markdown::{
    MarkdownDocument, MarkdownReviewDecision, MarkdownReviewEvent, MarkdownReviewSession,
};
use std::{error::Error, sync::Arc};

#[test]
fn edit_cancel_and_undo_preserve_review_comments() -> Result<(), Box<dyn Error>> {
    let mut session = session();
    assert!(session.begin_draft(None));
    session
        .draft_mut()
        .ok_or("missing draft")?
        .set_body("Please clarify");
    assert!(session.submit_draft().is_some());
    assert_eq!(session.review().len(), 1);
    let MarkdownReviewEvent::Submit(submission) = session.request_changes()? else {
        return Err("missing submission".into());
    };
    assert_eq!(
        submission.decision,
        MarkdownReviewDecision::ChangesRequested
    );
    assert!(session.edit_comment_at_selection());
    assert_eq!(
        session.draft().ok_or("missing edit draft")?.body(),
        "Please clarify"
    );
    session.cancel_draft();
    assert_eq!(session.review().len(), 1);
    assert!(session.undo_last_comment());
    assert!(session.review().is_empty());
    Ok(())
}

#[test]
fn missing_comment_operations_do_not_create_drafts() {
    let mut session = session();
    assert!(!session.edit_comment_at_selection());
    assert!(!session.delete_comment_at_selection());
    assert!(!session.undo_last_comment());
    assert!(session.draft().is_none());
    assert!(session.review().is_empty());
    let mut empty = MarkdownReviewSession::new(Arc::new(MarkdownDocument::parse("")));
    assert!(!empty.begin_draft(None));
}

#[test]
fn blank_submission_closes_the_draft_without_adding_a_comment() {
    let mut session = session();
    assert!(session.begin_draft(None));
    assert_eq!(session.submit_draft(), None);
    assert!(session.draft().is_none());
    assert!(session.review().is_empty());
}

fn session() -> MarkdownReviewSession {
    MarkdownReviewSession::new(Arc::new(MarkdownDocument::parse(
        "# One\n\nText\n\n## Two\n\nMore text",
    )))
}