diff --git a/.cargo/config.toml b/.cargo/config.toml index 4768414..2603371 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,5 @@ [env] CARGO_WORKSPACE_DIR = { value = "", relative = true } + +[unstable] +gc = true diff --git a/y-octo/src/doc/codec/update.rs b/y-octo/src/doc/codec/update.rs index 1f48eb0..d107666 100644 --- a/y-octo/src/doc/codec/update.rs +++ b/y-octo/src/doc/codec/update.rs @@ -466,6 +466,11 @@ mod tests { (include_bytes!("../../fixtures/database.bin").to_vec(), 1, 149), (include_bytes!("../../fixtures/large.bin").to_vec(), 1, 9036), (include_bytes!("../../fixtures/with-subdoc.bin").to_vec(), 2, 30), + ( + include_bytes!("../../fixtures/edge-case-left-right-same-node.bin").to_vec(), + 2, + 243, + ), ]; for (doc, clients, structs) in docs { diff --git a/y-octo/src/doc/document.rs b/y-octo/src/doc/document.rs index a180ffc..8acad3f 100644 --- a/y-octo/src/doc/document.rs +++ b/y-octo/src/doc/document.rs @@ -608,4 +608,21 @@ mod tests { assert_eq!(&text.to_string(), "hello world"); }); } + + #[test] + #[cfg_attr(any(miri, loom), ignore)] + fn test_apply_update() { + let updates = [ + include_bytes!("../fixtures/basic.bin").to_vec(), + include_bytes!("../fixtures/database.bin").to_vec(), + include_bytes!("../fixtures/large.bin").to_vec(), + include_bytes!("../fixtures/with-subdoc.bin").to_vec(), + include_bytes!("../fixtures/edge-case-left-right-same-node.bin").to_vec(), + ]; + + for update in updates { + let mut doc = Doc::new(); + doc.apply_update_from_binary_v1(&update).unwrap(); + } + } } diff --git a/y-octo/src/doc/store.rs b/y-octo/src/doc/store.rs index aeb8316..d13eaea 100644 --- a/y-octo/src/doc/store.rs +++ b/y-octo/src/doc/store.rs @@ -554,7 +554,6 @@ impl DocStore { let mut right = right.get_mut_unchecked(); right.left = item_owner_ref.clone(); } - this.right = right.clone(); } else { // no right, parent.start = this, delete this.left if let Some(parent_sub) = &this.parent_sub { @@ -565,6 +564,7 @@ impl DocStore { } } } + this.right = right.clone(); let parent_deleted = parent.item.get().map(|item| item.deleted()).unwrap_or(false); diff --git a/y-octo/src/fixtures/edge-case-left-right-same-node.bin b/y-octo/src/fixtures/edge-case-left-right-same-node.bin new file mode 100644 index 0000000..c598191 Binary files /dev/null and b/y-octo/src/fixtures/edge-case-left-right-same-node.bin differ