attribute_test.rs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. pub mod helper;
  2. use crate::helper::{MergeTestOp::*, *};
  3. use flowy_ot::{
  4. interval::Interval,
  5. operation::{OpBuilder, Operation, Retain},
  6. };
  7. #[test]
  8. fn delta_insert_text() {
  9. let ops = vec![
  10. Insert(0, "123", 0),
  11. Insert(0, "456", 3),
  12. AssertOpsJson(0, r#"[{"insert":"123456"}]"#),
  13. ];
  14. MergeTest::new().run_script(ops);
  15. }
  16. #[test]
  17. fn delta_insert_text_at_head() {
  18. let ops = vec![
  19. Insert(0, "123", 0),
  20. Insert(0, "456", 0),
  21. AssertOpsJson(0, r#"[{"insert":"456123"}]"#),
  22. ];
  23. MergeTest::new().run_script(ops);
  24. }
  25. #[test]
  26. fn delta_insert_text_at_middle() {
  27. let ops = vec![
  28. Insert(0, "123", 0),
  29. Insert(0, "456", 2),
  30. AssertOpsJson(0, r#"[{"insert":"124563"}]"#),
  31. ];
  32. MergeTest::new().run_script(ops);
  33. }
  34. #[test]
  35. fn delta_add_bold_and_invert_all() {
  36. let ops = vec![
  37. Insert(0, "123", 0),
  38. Bold(0, Interval::new(0, 3), true),
  39. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  40. Bold(0, Interval::new(0, 3), false),
  41. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  42. ];
  43. MergeTest::new().run_script(ops);
  44. }
  45. #[test]
  46. fn delta_add_bold_and_invert_partial_suffix() {
  47. let ops = vec![
  48. Insert(0, "1234", 0),
  49. Bold(0, Interval::new(0, 4), true),
  50. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  51. Bold(0, Interval::new(2, 4), false),
  52. AssertOpsJson(
  53. 0,
  54. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  55. ),
  56. ];
  57. MergeTest::new().run_script(ops);
  58. }
  59. #[test]
  60. fn delta_add_bold_and_invert_partial_suffix2() {
  61. let ops = vec![
  62. Insert(0, "1234", 0),
  63. Bold(0, Interval::new(0, 4), true),
  64. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  65. Bold(0, Interval::new(2, 4), false),
  66. AssertOpsJson(
  67. 0,
  68. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  69. ),
  70. Bold(0, Interval::new(2, 4), true),
  71. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  72. ];
  73. MergeTest::new().run_script(ops);
  74. }
  75. #[test]
  76. fn delta_add_bold_and_invert_partial_prefix() {
  77. let ops = vec![
  78. Insert(0, "1234", 0),
  79. Bold(0, Interval::new(0, 4), true),
  80. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  81. Bold(0, Interval::new(0, 2), false),
  82. AssertOpsJson(
  83. 0,
  84. r#"[{"insert":"12"},{"insert":"34","attributes":{"bold":"true"}}]"#,
  85. ),
  86. ];
  87. MergeTest::new().run_script(ops);
  88. }
  89. #[test]
  90. fn delta_add_bold_consecutive() {
  91. let ops = vec![
  92. Insert(0, "1234", 0),
  93. Bold(0, Interval::new(0, 1), true),
  94. AssertOpsJson(
  95. 0,
  96. r#"[{"insert":"1","attributes":{"bold":"true"}},{"insert":"234"}]"#,
  97. ),
  98. Bold(0, Interval::new(1, 2), true),
  99. AssertOpsJson(
  100. 0,
  101. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  102. ),
  103. ];
  104. MergeTest::new().run_script(ops);
  105. }
  106. #[test]
  107. #[should_panic]
  108. fn delta_add_bold_empty_str() {
  109. let ops = vec![Bold(0, Interval::new(0, 4), true)];
  110. MergeTest::new().run_script(ops);
  111. }
  112. #[test]
  113. fn delta_add_bold_italic() {
  114. let ops = vec![
  115. Insert(0, "1234", 0),
  116. Bold(0, Interval::new(0, 4), true),
  117. Italic(0, Interval::new(0, 4), true),
  118. AssertOpsJson(
  119. 0,
  120. r#"[{"insert":"1234","attributes":{"italic":"true","bold":"true"}}]"#,
  121. ),
  122. Insert(0, "5678", 4),
  123. AssertOpsJson(
  124. 0,
  125. r#"[{"insert":"12345678","attributes":{"italic":"true","bold":"true"}}]"#,
  126. ),
  127. Italic(0, Interval::new(4, 6), false),
  128. AssertOpsJson(
  129. 0,
  130. r#"[{"insert":"1234","attributes":{"italic":"true","bold":"true"}},{"insert":"56"},{"insert":"78","attributes":{"bold":"true","italic":"true"}}]"#,
  131. ),
  132. ];
  133. MergeTest::new().run_script(ops);
  134. }
  135. #[test]
  136. fn delta_add_bold_italic2() {
  137. let ops = vec![
  138. Insert(0, "123456", 0),
  139. Bold(0, Interval::new(0, 6), true),
  140. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  141. Italic(0, Interval::new(0, 2), true),
  142. AssertOpsJson(
  143. 0,
  144. r#"[{"insert":"12","attributes":{"italic":"true","bold":"true"}},{"insert":"3456","attributes":{"bold":"true"}}]"#,
  145. ),
  146. Italic(0, Interval::new(4, 6), true),
  147. AssertOpsJson(
  148. 0,
  149. r#"[{"insert":"12","attributes":{"bold":"true","italic":"true"}},{"insert":"34","attributes":{"bold":"true"}},{"insert":"56","attributes":{"italic":"true"}}]"#,
  150. ),
  151. ];
  152. MergeTest::new().run_script(ops);
  153. }
  154. #[test]
  155. fn delta_add_bold_italic3() {
  156. let ops = vec![
  157. Insert(0, "123456789", 0),
  158. Bold(0, Interval::new(0, 5), true),
  159. Italic(0, Interval::new(0, 2), true),
  160. AssertOpsJson(
  161. 0,
  162. r#"[{"insert":"12","attributes":{"bold":"true","italic":"true"}},{"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]"#,
  163. ),
  164. Italic(0, Interval::new(2, 4), true),
  165. AssertOpsJson(
  166. 0,
  167. r#"[{"insert":"1234","attributes":{"bold":"true","italic":"true"}},{"insert":"5","attributes":{"bold":"true"}},{"insert":"6789"}]"#,
  168. ),
  169. Bold(0, Interval::new(7, 9), true),
  170. AssertOpsJson(
  171. 0,
  172. r#"[{"insert":"1234","attributes":{"bold":"true","italic":"true"}},{"insert":"5","attributes":{"bold":"true"}},{"insert":"67"},{"insert":"89","attributes":{"bold":"true"}}]"#,
  173. ),
  174. ];
  175. MergeTest::new().run_script(ops);
  176. }
  177. #[test]
  178. fn delta_add_bold_italic_delete() {
  179. let ops = vec![
  180. Insert(0, "123456789", 0),
  181. Bold(0, Interval::new(0, 5), true),
  182. Italic(0, Interval::new(0, 2), true),
  183. Italic(0, Interval::new(2, 4), true),
  184. Bold(0, Interval::new(7, 9), true),
  185. AssertOpsJson(
  186. 0,
  187. r#"[{"insert":"1234","attributes":{"bold":"true","italic":"true"}},{"insert":"5","attributes":{"bold":"true"}},{"insert":"67"},{"insert":"89","attributes":{"bold":"true"}}]"#,
  188. ),
  189. Delete(0, Interval::new(0, 5)),
  190. AssertOpsJson(
  191. 0,
  192. r#"[{"insert":"67","attributes":{"bold":"true"}},{"insert":"89"}]"#,
  193. ),
  194. ];
  195. MergeTest::new().run_script(ops);
  196. }
  197. #[test]
  198. fn delta_merge_inserted_text_with_same_attribute() {
  199. let ops = vec![
  200. InsertBold(0, "123", Interval::new(0, 3)),
  201. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  202. InsertBold(0, "456", Interval::new(3, 6)),
  203. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  204. ];
  205. MergeTest::new().run_script(ops);
  206. }
  207. #[test]
  208. fn delta_compose_attr_delta_with_attr_delta_test() {
  209. let ops = vec![
  210. InsertBold(0, "123456", Interval::new(0, 6)),
  211. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  212. InsertBold(1, "7", Interval::new(0, 1)),
  213. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  214. Transform(0, 1),
  215. AssertOpsJson(0, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  216. AssertOpsJson(1, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  217. ];
  218. MergeTest::new().run_script(ops);
  219. }
  220. #[test]
  221. fn delta_compose_attr_delta_with_attr_delta_test2() {
  222. let ops = vec![
  223. Insert(0, "123456", 0),
  224. Bold(0, Interval::new(0, 6), true),
  225. Italic(0, Interval::new(0, 2), true),
  226. Italic(0, Interval::new(4, 6), true),
  227. AssertOpsJson(
  228. 0,
  229. r#"[{"insert":"12","attributes":{"bold":"true","italic":"true"}},{"insert":"34","attributes":{"bold":"true"}},{"insert":"56","attributes":{"italic":"true"}}]"#,
  230. ),
  231. InsertBold(1, "7", Interval::new(0, 1)),
  232. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  233. Transform(0, 1),
  234. AssertOpsJson(
  235. 0,
  236. r#"[{"insert":"12","attributes":{"italic":"true","bold":"true"}},{"insert":"34","attributes":{"bold":"true"}},{"insert":"56","attributes":{"italic":"true"}},{"insert":"7","attributes":{"bold":"true"}}]"#,
  237. ),
  238. AssertOpsJson(
  239. 1,
  240. r#"[{"insert":"12","attributes":{"italic":"true","bold":"true"}},{"insert":"34","attributes":{"bold":"true"}},{"insert":"56","attributes":{"italic":"true"}},{"insert":"7","attributes":{"bold":"true"}}]"#,
  241. ),
  242. ];
  243. MergeTest::new().run_script(ops);
  244. }
  245. #[test]
  246. fn delta_compose_attr_delta_with_no_attr_delta_test() {
  247. let expected = r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"7"}]"#;
  248. let ops = vec![
  249. InsertBold(0, "123456", Interval::new(0, 6)),
  250. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  251. Insert(1, "7", 0),
  252. AssertOpsJson(1, r#"[{"insert":"7"}]"#),
  253. Transform(0, 1),
  254. AssertOpsJson(0, expected),
  255. AssertOpsJson(1, expected),
  256. ];
  257. MergeTest::new().run_script(ops);
  258. }
  259. #[test]
  260. fn delta_delete_heading() {
  261. let ops = vec![
  262. InsertBold(0, "123456", Interval::new(0, 6)),
  263. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  264. Delete(0, Interval::new(0, 2)),
  265. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  266. ];
  267. MergeTest::new().run_script(ops);
  268. }
  269. #[test]
  270. fn delta_delete_trailing() {
  271. let ops = vec![
  272. InsertBold(0, "123456", Interval::new(0, 6)),
  273. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  274. Delete(0, Interval::new(5, 6)),
  275. AssertOpsJson(0, r#"[{"insert":"12345","attributes":{"bold":"true"}}]"#),
  276. ];
  277. MergeTest::new().run_script(ops);
  278. }
  279. #[test]
  280. fn delta_delete_middle() {
  281. let ops = vec![
  282. InsertBold(0, "123456", Interval::new(0, 6)),
  283. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  284. Delete(0, Interval::new(0, 2)),
  285. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  286. Delete(0, Interval::new(2, 4)),
  287. AssertOpsJson(0, r#"[{"insert":"34","attributes":{"bold":"true"}}]"#),
  288. ];
  289. MergeTest::new().run_script(ops);
  290. }
  291. #[test]
  292. fn delta_delete_all() {
  293. let ops = vec![
  294. InsertBold(0, "123456", Interval::new(0, 6)),
  295. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  296. Delete(0, Interval::new(0, 6)),
  297. AssertOpsJson(0, r#"[]"#),
  298. ];
  299. MergeTest::new().run_script(ops);
  300. }