changeset_compose_test.rs 5.3 KB

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