diff options
Diffstat (limited to 'src/document')
| -rw-r--r-- | src/document/changes.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/document/changes.rs b/src/document/changes.rs index faba895..345f151 100644 --- a/src/document/changes.rs +++ b/src/document/changes.rs @@ -195,4 +195,39 @@ mod tests { assert!(change_from_bytes(bytes, ChangeHash([7; 32])).is_err()); assert!(change_bytes(&doc, &ChangeHash([7; 32])).is_none()); } + + /// The authors of the changes after some heads: each node that wrote some, once, + /// however their changes were merged; a change without an author is told apart. + #[test] + fn authors_of_the_changes_since() { + use crate::clock::UnixMillis; + use crate::document::replica::{Writer, transact}; + let write = |doc: &mut Document, node: &str, key: &str| { + let writer = Writer { node, user: None }; + transact(doc, UnixMillis(1), &writer, |doc| doc.put(ROOT, key, 1)).unwrap(); + }; + let mut base = Document::new(); + write(&mut base, "node-a", "base"); + let since = base.get_heads(); + assert_eq!(authors_since(&base, &since), (Vec::new(), false)); + + let mut a = base.fork(); + write(&mut a, "node-a", "a1"); + write(&mut a, "node-a", "a2"); + let mut b = base.fork(); + write(&mut b, "node-b", "b1"); + let mut merged = a.clone(); + merged.merge(&mut b).unwrap(); + let (mut authors, unknown) = authors_since(&merged, &since); + authors.sort(); + assert_eq!(authors, ["node-a", "node-b"]); + assert!(!unknown); + + // A change no node authored (a snapshot's, say). + let mut snapshot = Document::new(); + snapshot.merge(&mut merged.clone()).unwrap(); + change(&mut snapshot, |doc| doc.put(ROOT, "s", 1).unwrap()); + let (_, unknown) = authors_since(&snapshot, &merged.get_heads()); + assert!(unknown); + } } |
