invert_test.rs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. pub mod helper;
  2. use crate::helper::{TestOp::*, *};
  3. use flowy_ot::core::{Builder, Delta, Interval};
  4. #[test]
  5. fn delta_invert_no_attribute_delta() {
  6. let mut delta = Delta::default();
  7. delta.add(Builder::insert("123").build());
  8. let mut change = Delta::default();
  9. change.add(Builder::retain(3).build());
  10. change.add(Builder::insert("456").build());
  11. let undo = change.invert(&delta);
  12. let new_delta = delta.compose(&change).unwrap();
  13. let delta_after_undo = new_delta.compose(&undo).unwrap();
  14. assert_eq!(delta_after_undo, delta);
  15. }
  16. #[test]
  17. fn delta_invert_no_attribute_delta2() {
  18. let ops = vec![
  19. Insert(0, "123", 0),
  20. Insert(1, "4567", 0),
  21. Invert(0, 1),
  22. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  23. ];
  24. OpTester::new().run_script(ops);
  25. }
  26. #[test]
  27. fn delta_invert_attribute_delta_with_no_attribute_delta() {
  28. let ops = vec![
  29. Insert(0, "123", 0),
  30. Bold(0, Interval::new(0, 3), true),
  31. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  32. Insert(1, "4567", 0),
  33. Invert(0, 1),
  34. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  35. ];
  36. OpTester::new().run_script(ops);
  37. }
  38. #[test]
  39. fn delta_invert_attribute_delta_with_no_attribute_delta2() {
  40. let ops = vec![
  41. Insert(0, "123", 0),
  42. Bold(0, Interval::new(0, 3), true),
  43. Insert(0, "456", 3),
  44. AssertOpsJson(
  45. 0,
  46. r#"[
  47. {"insert":"123456","attributes":{"bold":"true"}}]
  48. "#,
  49. ),
  50. Italic(0, Interval::new(2, 4), true),
  51. AssertOpsJson(
  52. 0,
  53. r#"[
  54. {"insert":"12","attributes":{"bold":"true"}},
  55. {"insert":"34","attributes":{"bold":"true","italic":"true"}},
  56. {"insert":"56","attributes":{"bold":"true"}}
  57. ]"#,
  58. ),
  59. Insert(1, "abc", 0),
  60. Invert(0, 1),
  61. AssertOpsJson(
  62. 0,
  63. r#"[
  64. {"insert":"12","attributes":{"bold":"true"}},
  65. {"insert":"34","attributes":{"bold":"true","italic":"true"}},
  66. {"insert":"56","attributes":{"bold":"true"}}
  67. ]"#,
  68. ),
  69. ];
  70. OpTester::new().run_script(ops);
  71. }
  72. #[test]
  73. fn delta_invert_no_attribute_delta_with_attribute_delta() {
  74. let ops = vec![
  75. Insert(0, "123", 0),
  76. Insert(1, "4567", 0),
  77. Bold(1, Interval::new(0, 3), true),
  78. AssertOpsJson(
  79. 1,
  80. r#"[{"insert":"456","attributes":{"bold":"true"}},{"insert":"7"}]"#,
  81. ),
  82. Invert(0, 1),
  83. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  84. ];
  85. OpTester::new().run_script(ops);
  86. }
  87. #[test]
  88. fn delta_invert_no_attribute_delta_with_attribute_delta2() {
  89. let ops = vec![
  90. Insert(0, "123", 0),
  91. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  92. Insert(1, "abc", 0),
  93. Bold(1, Interval::new(0, 3), true),
  94. Insert(1, "d", 3),
  95. Italic(1, Interval::new(1, 3), true),
  96. AssertOpsJson(
  97. 1,
  98. r#"[{"insert":"a","attributes":{"bold":"true"}},{"insert":"bc","attributes":
  99. {"bold":"true","italic":"true"}},{"insert":"d","attributes":{"bold":"true"
  100. }}]"#,
  101. ),
  102. Invert(0, 1),
  103. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  104. ];
  105. OpTester::new().run_script(ops);
  106. }
  107. #[test]
  108. fn delta_invert_attribute_delta_with_attribute_delta() {
  109. let ops = vec![
  110. Insert(0, "123", 0),
  111. Bold(0, Interval::new(0, 3), true),
  112. Insert(0, "456", 3),
  113. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  114. Italic(0, Interval::new(2, 4), true),
  115. AssertOpsJson(
  116. 0,
  117. r#"[
  118. {"insert":"12","attributes":{"bold":"true"}},
  119. {"insert":"34","attributes":{"bold":"true","italic":"true"}},
  120. {"insert":"56","attributes":{"bold":"true"}}
  121. ]"#,
  122. ),
  123. Insert(1, "abc", 0),
  124. Bold(1, Interval::new(0, 3), true),
  125. Insert(1, "d", 3),
  126. Italic(1, Interval::new(1, 3), true),
  127. AssertOpsJson(
  128. 1,
  129. r#"[
  130. {"insert":"a","attributes":{"bold":"true"}},
  131. {"insert":"bc","attributes":{"bold":"true","italic":"true"}},
  132. {"insert":"d","attributes":{"bold":"true"}}
  133. ]"#,
  134. ),
  135. Invert(0, 1),
  136. AssertOpsJson(
  137. 0,
  138. r#"[
  139. {"insert":"12","attributes":{"bold":"true"}},
  140. {"insert":"34","attributes":{"bold":"true","italic":"true"}},
  141. {"insert":"56","attributes":{"bold":"true"}}
  142. ]"#,
  143. ),
  144. ];
  145. OpTester::new().run_script(ops);
  146. }
  147. #[test]
  148. fn delta_get_ops_in_interval_1() {
  149. let mut delta = Delta::default();
  150. let insert_a = Builder::insert("123").build();
  151. let insert_b = Builder::insert("4").build();
  152. delta.add(insert_a.clone());
  153. delta.add(insert_b.clone());
  154. assert_eq!(
  155. delta.ops_in_interval(Interval::new(0, 4)),
  156. vec![delta.ops.last().unwrap().clone()]
  157. );
  158. }
  159. #[test]
  160. fn delta_get_ops_in_interval_2() {
  161. let mut delta = Delta::default();
  162. let insert_a = Builder::insert("123").build();
  163. let insert_b = Builder::insert("4").build();
  164. let insert_c = Builder::insert("5").build();
  165. let retain_a = Builder::retain(3).build();
  166. delta.add(insert_a.clone());
  167. delta.add(retain_a.clone());
  168. delta.add(insert_b.clone());
  169. delta.add(insert_c.clone());
  170. assert_eq!(
  171. delta.ops_in_interval(Interval::new(0, 2)),
  172. vec![Builder::insert("12").build()]
  173. );
  174. assert_eq!(
  175. delta.ops_in_interval(Interval::new(0, 3)),
  176. vec![insert_a.clone()]
  177. );
  178. assert_eq!(
  179. delta.ops_in_interval(Interval::new(0, 4)),
  180. vec![insert_a.clone(), Builder::retain(1).build()]
  181. );
  182. assert_eq!(
  183. delta.ops_in_interval(Interval::new(0, 6)),
  184. vec![insert_a.clone(), retain_a.clone()]
  185. );
  186. assert_eq!(
  187. delta.ops_in_interval(Interval::new(0, 7)),
  188. vec![insert_a.clone(), retain_a.clone(), insert_b.clone()]
  189. );
  190. }
  191. #[test]
  192. fn delta_get_ops_in_interval_3() {
  193. let mut delta = Delta::default();
  194. let insert_a = Builder::insert("123456").build();
  195. delta.add(insert_a.clone());
  196. assert_eq!(
  197. delta.ops_in_interval(Interval::new(3, 5)),
  198. vec![Builder::insert("45").build()]
  199. );
  200. }
  201. #[test]
  202. fn delta_get_ops_in_interval_4() {
  203. let mut delta = Delta::default();
  204. let insert_a = Builder::insert("12").build();
  205. let insert_b = Builder::insert("34").build();
  206. let insert_c = Builder::insert("56").build();
  207. delta.ops.push(insert_a.clone());
  208. delta.ops.push(insert_b.clone());
  209. delta.ops.push(insert_c.clone());
  210. assert_eq!(delta.ops_in_interval(Interval::new(0, 2)), vec![insert_a]);
  211. assert_eq!(delta.ops_in_interval(Interval::new(2, 4)), vec![insert_b]);
  212. assert_eq!(delta.ops_in_interval(Interval::new(4, 6)), vec![insert_c]);
  213. assert_eq!(
  214. delta.ops_in_interval(Interval::new(2, 5)),
  215. vec![Builder::insert("34").build(), Builder::insert("5").build()]
  216. );
  217. }
  218. #[test]
  219. fn delta_get_ops_in_interval_5() {
  220. let mut delta = Delta::default();
  221. let insert_a = Builder::insert("123456").build();
  222. let insert_b = Builder::insert("789").build();
  223. delta.ops.push(insert_a.clone());
  224. delta.ops.push(insert_b.clone());
  225. assert_eq!(
  226. delta.ops_in_interval(Interval::new(4, 8)),
  227. vec![Builder::insert("56").build(), Builder::insert("78").build()]
  228. );
  229. }
  230. #[test]
  231. fn delta_get_ops_in_interval_6() {
  232. let mut delta = Delta::default();
  233. let insert_a = Builder::insert("12345678").build();
  234. delta.add(insert_a.clone());
  235. assert_eq!(
  236. delta.ops_in_interval(Interval::new(4, 6)),
  237. vec![Builder::insert("56").build()]
  238. );
  239. }