aboutsummaryrefslogtreecommitdiffstats
path: root/src/document/changes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/document/changes.rs')
-rw-r--r--src/document/changes.rs35
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);
+ }
}