betteroffice-pptx-edit 0.5.1

Collaborative yrs-backed editing core for PPTX decks.
Documentation
use pptx_edit::{DeckSession, EditCtx, EditError};

const FIXTURE: &[u8] = include_bytes!("../../../apps/demo/public/betteroffice-demo.pptx");

fn context() -> EditCtx {
    EditCtx::local("test")
}

#[test]
fn slide_scope_matches_the_full_snapshot_position() {
    let session = DeckSession::open(FIXTURE, 7).unwrap();
    let deck = session.snapshot().unwrap();
    for (i, slide) in deck.slides.iter().enumerate() {
        let scope = session.slide_scope(i).unwrap();
        assert_eq!(scope.index, i);
        assert_eq!(&scope.slide, slide);
        assert_eq!(scope.width_emu, deck.width_emu);
        assert_eq!(scope.height_emu, deck.height_emu);
    }
    assert!(matches!(
        session.slide_scope(deck.slides.len()),
        Err(EditError::OutOfBounds { .. })
    ));
}

#[test]
fn slide_scope_tracks_insert_and_reorder() {
    let session = DeckSession::open(FIXTURE, 7).unwrap();
    let inserted = session.insert_slide(&context(), 0, None).unwrap();
    let deck = session.snapshot().unwrap();
    let scope = session.slide_scope(0).unwrap();
    assert_eq!(scope.slide, deck.slides[0]);
    assert_eq!(scope.slide.id, inserted.slide_id);

    let moved_id = deck.slides[1].id.clone();
    session.move_slide(&context(), &moved_id, 0).unwrap();
    let deck = session.snapshot().unwrap();
    assert_eq!(deck.slides[0].id, moved_id);
    let scope = session.slide_scope(0).unwrap();
    assert_eq!(scope.slide, deck.slides[0]);
    assert_eq!(scope.slide.id, moved_id);
}