|
@@ -0,0 +1,95 @@
|
|
|
+use lib_ot::core::{
|
|
|
+ AttributeBuilder, Changeset, Extension, Interval, NodeData, NodeDataBuilder, NodeOperation, Path, Transaction,
|
|
|
+};
|
|
|
+use lib_ot::text_delta::TextOperationBuilder;
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn operation_insert_node_serde_test() {
|
|
|
+ let insert = NodeOperation::Insert {
|
|
|
+ path: Path(vec![0, 1]),
|
|
|
+ nodes: vec![NodeData::new("text".to_owned())],
|
|
|
+ };
|
|
|
+ let result = serde_json::to_string(&insert).unwrap();
|
|
|
+ assert_eq!(result, r#"{"op":"insert","path":[0,1],"nodes":[{"type":"text"}]}"#);
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn operation_insert_node_with_children_serde_test() {
|
|
|
+ let node = NodeDataBuilder::new("text")
|
|
|
+ .add_node(NodeData::new("sub_text".to_owned()))
|
|
|
+ .build();
|
|
|
+
|
|
|
+ let insert = NodeOperation::Insert {
|
|
|
+ path: Path(vec![0, 1]),
|
|
|
+ nodes: vec![node],
|
|
|
+ };
|
|
|
+ assert_eq!(
|
|
|
+ serde_json::to_string(&insert).unwrap(),
|
|
|
+ r#"{"op":"insert","path":[0,1],"nodes":[{"type":"text","children":[{"type":"sub_text"}]}]}"#
|
|
|
+ );
|
|
|
+}
|
|
|
+#[test]
|
|
|
+fn operation_update_node_attributes_serde_test() {
|
|
|
+ let operation = NodeOperation::Update {
|
|
|
+ path: Path(vec![0, 1]),
|
|
|
+ changeset: Changeset::Attributes {
|
|
|
+ new: AttributeBuilder::new().insert("bold", true).build(),
|
|
|
+ old: AttributeBuilder::new().insert("bold", false).build(),
|
|
|
+ },
|
|
|
+ };
|
|
|
+
|
|
|
+ let result = serde_json::to_string(&operation).unwrap();
|
|
|
+ assert_eq!(
|
|
|
+ result,
|
|
|
+ r#"{"op":"update","path":[0,1],"new":{"bold":true},"old":{"bold":null}}"#
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn operation_update_node_body_serialize_test() {
|
|
|
+ let delta = TextOperationBuilder::new().insert("AppFlowy...").build();
|
|
|
+ let inverted = delta.invert_str("");
|
|
|
+ let changeset = Changeset::Delta { delta, inverted };
|
|
|
+ let insert = NodeOperation::Update {
|
|
|
+ path: Path(vec![0, 1]),
|
|
|
+ changeset,
|
|
|
+ };
|
|
|
+ let result = serde_json::to_string(&insert).unwrap();
|
|
|
+ assert_eq!(
|
|
|
+ result,
|
|
|
+ r#"{"op":"update","path":[0,1],"delta":[{"insert":"AppFlowy..."}],"inverted":[{"delete":11}]}"#
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn operation_update_node_body_deserialize_test() {
|
|
|
+ let json_1 = r#"{"op":"update","path":[0,1],"delta":[{"insert":"AppFlowy..."}],"inverted":[{"delete":11}]}"#;
|
|
|
+ let operation: NodeOperation = serde_json::from_str(json_1).unwrap();
|
|
|
+ let json_2 = serde_json::to_string(&operation).unwrap();
|
|
|
+ assert_eq!(json_1, json_2);
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn transaction_serialize_test() {
|
|
|
+ let insert = NodeOperation::Insert {
|
|
|
+ path: Path(vec![0, 1]),
|
|
|
+ nodes: vec![NodeData::new("text".to_owned())],
|
|
|
+ };
|
|
|
+ let mut transaction = Transaction::from_operations(vec![insert]);
|
|
|
+ transaction.extension = Extension::TextSelection {
|
|
|
+ before_selection: Interval::new(0, 1),
|
|
|
+ after_selection: Interval::new(1, 2),
|
|
|
+ };
|
|
|
+ let json = serde_json::to_string(&transaction).unwrap();
|
|
|
+ assert_eq!(
|
|
|
+ json,
|
|
|
+ r#"{"operations":[{"op":"insert","path":[0,1],"nodes":[{"type":"text"}]}],"TextSelection":{"before_selection":{"start":0,"end":1},"after_selection":{"start":1,"end":2}}}"#
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+#[test]
|
|
|
+fn transaction_deserialize_test() {
|
|
|
+ let json = r#"{"operations":[{"op":"insert","path":[0,1],"nodes":[{"type":"text"}]}],"TextSelection":{"before_selection":{"start":0,"end":1},"after_selection":{"start":1,"end":2}}}"#;
|
|
|
+ let transaction: Transaction = serde_json::from_str(json).unwrap();
|
|
|
+ assert_eq!(transaction.operations.len(), 1);
|
|
|
+}
|