changeset_compose_test.rs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. use crate::node::script::NodeScript::*;
  2. use crate::node::script::NodeTest;
  3. use lib_ot::core::{AttributeEntry, Changeset, NodeData, OperationTransform};
  4. use lib_ot::text_delta::DeltaTextOperationBuilder;
  5. #[test]
  6. fn changeset_delta_compose_delta_test() {
  7. // delta 1
  8. let delta_1 = DeltaTextOperationBuilder::new()
  9. .insert("Hello world")
  10. .build();
  11. let inverted_1 = delta_1.inverted();
  12. let mut changeset_1 = Changeset::Delta {
  13. delta: delta_1.clone(),
  14. inverted: inverted_1,
  15. };
  16. // delta 2
  17. let delta_2 = DeltaTextOperationBuilder::new()
  18. .retain(delta_1.utf16_target_len)
  19. .insert("!")
  20. .build();
  21. let inverted_2 = delta_2.inverted();
  22. let changeset_2 = Changeset::Delta {
  23. delta: delta_2,
  24. inverted: inverted_2,
  25. };
  26. // compose
  27. changeset_1.compose(&changeset_2).unwrap();
  28. if let Changeset::Delta { delta, inverted } = changeset_1 {
  29. assert_eq!(delta.content().unwrap(), "Hello world!");
  30. let new_delta = delta.compose(&inverted).unwrap();
  31. assert_eq!(new_delta.content().unwrap(), "");
  32. }
  33. }
  34. #[test]
  35. fn operation_compose_delta_changeset_then_invert_test() {
  36. let delta = DeltaTextOperationBuilder::new()
  37. .insert("Hello world")
  38. .build();
  39. let inverted = delta.inverted();
  40. let changeset = Changeset::Delta {
  41. delta: delta.clone(),
  42. inverted: inverted.clone(),
  43. };
  44. let mut test = NodeTest::new();
  45. let text_node = NodeData::new("text");
  46. let scripts = vec![
  47. InsertNode {
  48. path: 0.into(),
  49. node_data: text_node,
  50. rev_id: 1,
  51. },
  52. UpdateBody {
  53. path: 0.into(),
  54. changeset: changeset.clone(),
  55. },
  56. AssertNodeDelta {
  57. path: 0.into(),
  58. expected: delta.clone(),
  59. },
  60. UpdateBody {
  61. path: 0.into(),
  62. changeset: changeset.inverted(),
  63. },
  64. AssertNodeDelta {
  65. path: 0.into(),
  66. expected: delta.compose(&inverted).unwrap(),
  67. },
  68. ];
  69. test.run_scripts(scripts);
  70. }
  71. #[test]
  72. fn operation_compose_multiple_delta_changeset_then_invert_test() {
  73. // delta 1
  74. let delta_1 = DeltaTextOperationBuilder::new()
  75. .insert("Hello world")
  76. .build();
  77. let inverted_1 = delta_1.inverted();
  78. let changeset_1 = Changeset::Delta {
  79. delta: delta_1.clone(),
  80. inverted: inverted_1,
  81. };
  82. // delta 2
  83. let delta_2 = DeltaTextOperationBuilder::new()
  84. .retain(delta_1.utf16_target_len)
  85. .insert("!")
  86. .build();
  87. let inverted_2 = delta_2.inverted();
  88. let changeset_2 = Changeset::Delta {
  89. delta: delta_2.clone(),
  90. inverted: inverted_2,
  91. };
  92. // delta 3
  93. let delta_3 = DeltaTextOperationBuilder::new()
  94. .retain(delta_2.utf16_target_len)
  95. .insert("AppFlowy")
  96. .build();
  97. let inverted_3 = delta_3.inverted();
  98. let changeset_3 = Changeset::Delta {
  99. delta: delta_3.clone(),
  100. inverted: inverted_3,
  101. };
  102. let mut test = NodeTest::new();
  103. let text_node = NodeData::new("text");
  104. let scripts = vec![
  105. InsertNode {
  106. path: 0.into(),
  107. node_data: text_node,
  108. rev_id: 1,
  109. },
  110. UpdateBody {
  111. path: 0.into(),
  112. changeset: changeset_1.clone(),
  113. },
  114. UpdateBody {
  115. path: 0.into(),
  116. changeset: changeset_2.clone(),
  117. },
  118. UpdateBody {
  119. path: 0.into(),
  120. changeset: changeset_3.clone(),
  121. },
  122. AssertNodeDelta {
  123. path: 0.into(),
  124. expected: delta_1
  125. .compose(&delta_2)
  126. .unwrap()
  127. .compose(&delta_3)
  128. .unwrap(),
  129. },
  130. UpdateBody {
  131. path: 0.into(),
  132. changeset: changeset_3.inverted(),
  133. },
  134. AssertNodeDeltaContent {
  135. path: 0.into(),
  136. expected: r#"Hello world!"#,
  137. },
  138. UpdateBody {
  139. path: 0.into(),
  140. changeset: changeset_2.inverted(),
  141. },
  142. AssertNodeDeltaContent {
  143. path: 0.into(),
  144. expected: r#"Hello world"#,
  145. },
  146. UpdateBody {
  147. path: 0.into(),
  148. changeset: changeset_1.inverted(),
  149. },
  150. AssertNodeDeltaContent {
  151. path: 0.into(),
  152. expected: r#""#,
  153. },
  154. ];
  155. test.run_scripts(scripts);
  156. }
  157. #[test]
  158. #[should_panic]
  159. fn changeset_delta_compose_attributes_test() {
  160. // delta 1
  161. let delta = DeltaTextOperationBuilder::new()
  162. .insert("Hello world")
  163. .build();
  164. let inverted = delta.inverted();
  165. let mut delta_changeset = Changeset::Delta { delta, inverted };
  166. // attributes
  167. let attribute_changeset = Changeset::Attributes {
  168. new: Default::default(),
  169. old: Default::default(),
  170. };
  171. // compose
  172. delta_changeset.compose(&attribute_changeset).unwrap();
  173. }
  174. #[test]
  175. fn changeset_attributes_compose_attributes_test() {
  176. // attributes
  177. let mut changeset_1 = Changeset::Attributes {
  178. new: AttributeEntry::new("bold", true).into(),
  179. old: Default::default(),
  180. };
  181. let changeset_2 = Changeset::Attributes {
  182. new: AttributeEntry::new("Italic", true).into(),
  183. old: Default::default(),
  184. };
  185. // compose
  186. changeset_1.compose(&changeset_2).unwrap();
  187. if let Changeset::Attributes { new, old: _ } = changeset_1 {
  188. assert_eq!(new, AttributeEntry::new("Italic", true).into());
  189. }
  190. }