From ef65551340a77f1504a8f542566e29eeed81f45a Mon Sep 17 00:00:00 2001 From: Vincent Chan Date: Mon, 22 Aug 2022 18:33:02 +0800 Subject: [PATCH] feat: add serialize/deserialize --- .../lib-ot/src/core/document/attributes.rs | 2 +- .../src/core/document/document_operation.rs | 55 ++++++++++++++++++- shared-lib/lib-ot/src/core/document/node.rs | 2 +- .../lib-ot/src/core/document/position.rs | 4 +- 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/shared-lib/lib-ot/src/core/document/attributes.rs b/shared-lib/lib-ot/src/core/document/attributes.rs index b682fd8404..52b33dce08 100644 --- a/shared-lib/lib-ot/src/core/document/attributes.rs +++ b/shared-lib/lib-ot/src/core/document/attributes.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -#[derive(Clone)] +#[derive(Clone, serde::Serialize, serde::Deserialize)] pub struct NodeAttributes(pub HashMap>); impl NodeAttributes { diff --git a/shared-lib/lib-ot/src/core/document/document_operation.rs b/shared-lib/lib-ot/src/core/document/document_operation.rs index 0ce16ae89c..46cb79be4a 100644 --- a/shared-lib/lib-ot/src/core/document/document_operation.rs +++ b/shared-lib/lib-ot/src/core/document/document_operation.rs @@ -1,7 +1,7 @@ use crate::core::document::position::Position; use crate::core::{NodeAttributes, NodeData, TextDelta}; -#[derive(Clone)] +#[derive(Clone, serde::Serialize, serde::Deserialize)] pub enum DocumentOperation { Insert { path: Position, @@ -98,3 +98,56 @@ impl DocumentOperation { } } } + +#[cfg(test)] +mod tests { + use crate::core::Position; + + #[test] + fn test_transform_path_1() { + assert_eq!( + { Position::transform(&Position(vec![0, 1]), &Position(vec![0, 1]), 1) }.0, + vec![0, 2] + ); + } + + #[test] + fn test_transform_path_2() { + assert_eq!( + { Position::transform(&Position(vec![0, 1]), &Position(vec![0, 2]), 1) }.0, + vec![0, 3] + ); + } + + #[test] + fn test_transform_path_3() { + assert_eq!( + { Position::transform(&Position(vec![0, 1]), &Position(vec![0, 2, 7, 8, 9]), 1) }.0, + vec![0, 3, 7, 8, 9] + ); + } + + #[test] + fn test_transform_path_not_changed() { + assert_eq!( + { Position::transform(&Position(vec![0, 1, 2]), &Position(vec![0, 0, 7, 8, 9]), 1) }.0, + vec![0, 0, 7, 8, 9] + ); + assert_eq!( + { Position::transform(&Position(vec![0, 1, 2]), &Position(vec![0, 1]), 1) }.0, + vec![0, 1] + ); + assert_eq!( + { Position::transform(&Position(vec![1, 1]), &Position(vec![1, 0]), 1) }.0, + vec![1, 0] + ); + } + + #[test] + fn test_transform_delta() { + assert_eq!( + { Position::transform(&Position(vec![0, 1]), &Position(vec![0, 1]), 5) }.0, + vec![0, 6] + ); + } +} diff --git a/shared-lib/lib-ot/src/core/document/node.rs b/shared-lib/lib-ot/src/core/document/node.rs index e7c5e0e68f..96747b0fd8 100644 --- a/shared-lib/lib-ot/src/core/document/node.rs +++ b/shared-lib/lib-ot/src/core/document/node.rs @@ -1,6 +1,6 @@ use crate::core::{NodeAttributes, TextDelta}; -#[derive(Clone)] +#[derive(Clone, serde::Serialize, serde::Deserialize)] pub struct NodeData { pub node_type: String, pub attributes: NodeAttributes, diff --git a/shared-lib/lib-ot/src/core/document/position.rs b/shared-lib/lib-ot/src/core/document/position.rs index 76f6a0eec4..521d0e9a60 100644 --- a/shared-lib/lib-ot/src/core/document/position.rs +++ b/shared-lib/lib-ot/src/core/document/position.rs @@ -1,4 +1,4 @@ -#[derive(Clone)] +#[derive(Clone, serde::Serialize, serde::Deserialize)] pub struct Position(pub Vec); impl Position { @@ -20,7 +20,7 @@ impl Position { return b.clone(); } // check the prefix - for i in 0..(pre_insert_path.len()) { + for i in 0..(pre_insert_path.len() - 1) { if pre_insert_path.0[i] != b.0[i] { return b.clone(); }