serde_test.rs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. use lib_ot::core::{
  2. AttributeBuilder, Changeset, Extension, Interval, NodeData, NodeDataBuilder, NodeOperation, NodeTree, Path,
  3. Transaction,
  4. };
  5. use lib_ot::text_delta::TextOperationBuilder;
  6. #[test]
  7. fn operation_insert_node_serde_test() {
  8. let insert = NodeOperation::Insert {
  9. path: Path(vec![0, 1]),
  10. nodes: vec![NodeData::new("text".to_owned())],
  11. };
  12. let result = serde_json::to_string(&insert).unwrap();
  13. assert_eq!(result, r#"{"op":"insert","path":[0,1],"nodes":[{"type":"text"}]}"#);
  14. }
  15. #[test]
  16. fn operation_insert_node_with_children_serde_test() {
  17. let node = NodeDataBuilder::new("text")
  18. .add_node_data(NodeData::new("sub_text".to_owned()))
  19. .build();
  20. let insert = NodeOperation::Insert {
  21. path: Path(vec![0, 1]),
  22. nodes: vec![node],
  23. };
  24. assert_eq!(
  25. serde_json::to_string(&insert).unwrap(),
  26. r#"{"op":"insert","path":[0,1],"nodes":[{"type":"text","children":[{"type":"sub_text"}]}]}"#
  27. );
  28. }
  29. #[test]
  30. fn operation_update_node_attributes_serde_test() {
  31. let operation = NodeOperation::Update {
  32. path: Path(vec![0, 1]),
  33. changeset: Changeset::Attributes {
  34. new: AttributeBuilder::new().insert("bold", true).build(),
  35. old: AttributeBuilder::new().insert("bold", false).build(),
  36. },
  37. };
  38. let result = serde_json::to_string(&operation).unwrap();
  39. assert_eq!(
  40. result,
  41. r#"{"op":"update","path":[0,1],"new":{"bold":true},"old":{"bold":null}}"#
  42. );
  43. }
  44. #[test]
  45. fn operation_update_node_body_serialize_test() {
  46. let delta = TextOperationBuilder::new().insert("AppFlowy...").build();
  47. let inverted = delta.invert_str("");
  48. let changeset = Changeset::Delta { delta, inverted };
  49. let insert = NodeOperation::Update {
  50. path: Path(vec![0, 1]),
  51. changeset,
  52. };
  53. let result = serde_json::to_string(&insert).unwrap();
  54. assert_eq!(
  55. result,
  56. r#"{"op":"update","path":[0,1],"delta":[{"insert":"AppFlowy..."}],"inverted":[{"delete":11}]}"#
  57. );
  58. }
  59. #[test]
  60. fn operation_update_node_body_deserialize_test() {
  61. let json_1 = r#"{"op":"update","path":[0,1],"delta":[{"insert":"AppFlowy..."}],"inverted":[{"delete":11}]}"#;
  62. let operation: NodeOperation = serde_json::from_str(json_1).unwrap();
  63. let json_2 = serde_json::to_string(&operation).unwrap();
  64. assert_eq!(json_1, json_2);
  65. }
  66. #[test]
  67. fn transaction_serialize_test() {
  68. let insert = NodeOperation::Insert {
  69. path: Path(vec![0, 1]),
  70. nodes: vec![NodeData::new("text".to_owned())],
  71. };
  72. let mut transaction = Transaction::from_operations(vec![insert]);
  73. transaction.extension = Extension::TextSelection {
  74. before_selection: Interval::new(0, 1),
  75. after_selection: Interval::new(1, 2),
  76. };
  77. let json = serde_json::to_string(&transaction).unwrap();
  78. assert_eq!(
  79. json,
  80. r#"{"operations":[{"op":"insert","path":[0,1],"nodes":[{"type":"text"}]}],"TextSelection":{"before_selection":{"start":0,"end":1},"after_selection":{"start":1,"end":2}}}"#
  81. );
  82. }
  83. #[test]
  84. fn transaction_deserialize_test() {
  85. 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}}}"#;
  86. let transaction: Transaction = serde_json::from_str(json).unwrap();
  87. assert_eq!(transaction.operations.len(), 1);
  88. }
  89. #[test]
  90. fn node_tree_deserialize_test() {
  91. let tree: NodeTree = serde_json::from_str(TREE_JSON).unwrap();
  92. assert_eq!(tree.number_of_children(None), 1);
  93. }
  94. #[test]
  95. fn node_tree_serialize_test() {
  96. let tree: NodeTree = serde_json::from_str(TREE_JSON).unwrap();
  97. let json = serde_json::to_string_pretty(&tree).unwrap();
  98. assert_eq!(json, TREE_JSON);
  99. }
  100. #[allow(dead_code)]
  101. const TREE_JSON: &str = r#"{
  102. "type": "editor",
  103. "children": [
  104. {
  105. "type": "image",
  106. "attributes": {
  107. "image_src": "https://s1.ax1x.com/2022/08/26/v2sSbR.jpg"
  108. }
  109. },
  110. {
  111. "type": "text",
  112. "attributes": {
  113. "heading": "h1"
  114. },
  115. "body": {
  116. "delta": [
  117. {
  118. "insert": "👋 "
  119. },
  120. {
  121. "insert": "Welcome to ",
  122. "attributes": {
  123. "href": "appflowy.io"
  124. }
  125. },
  126. {
  127. "insert": "AppFlowy Editor",
  128. "attributes": {
  129. "italic": true
  130. }
  131. }
  132. ]
  133. }
  134. }
  135. ]
  136. }"#;