aboutsummaryrefslogtreecommitdiffstats
path: root/src/document/testing.rs
blob: 7b75a96e4eb580627e5d18f8f62d211d45c6b8e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//! For tests: writing to documents the way the node does, one change at a time, so
//! that tests don't depend on how the engine groups writes into changes.

use super::{Document, Transaction};

/// The writes `f` makes to `doc`, as one change; what `f` returns.
pub(crate) fn change<T>(doc: &mut Document, f: impl FnOnce(&mut Transaction<'_>) -> T) -> T {
    let mut transaction = doc.transaction();
    let out = f(&mut transaction);
    transaction.commit();
    out
}

/// The writes `f` makes to `doc`, as one change if it succeeds, dropped if not; what
/// `f` returns. Committed at time 0: the same writes make the same change.
pub(crate) fn try_change<T, E>(
    doc: &mut Document,
    f: impl FnOnce(&mut Transaction<'_>) -> Result<T, E>,
) -> Result<T, E> {
    let mut transaction = doc.transaction();
    let out = f(&mut transaction);
    match &out {
        Ok(_) => {
            transaction.commit_with(automerge::transaction::CommitOptions::default().with_time(0));
        }
        Err(_) => {
            transaction.rollback();
        }
    }
    out
}