attribute_test.rs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. pub mod helper;
  2. use crate::helper::{TestOp::*, *};
  3. use flowy_ot::core::Interval;
  4. #[test]
  5. fn delta_insert_text() {
  6. let ops = vec![
  7. Insert(0, "123", 0),
  8. Insert(0, "456", 3),
  9. AssertOpsJson(0, r#"[{"insert":"123456"}]"#),
  10. ];
  11. OpTester::new().run_script(ops);
  12. }
  13. #[test]
  14. fn delta_insert_text_at_head() {
  15. let ops = vec![
  16. Insert(0, "123", 0),
  17. Insert(0, "456", 0),
  18. AssertOpsJson(0, r#"[{"insert":"456123"}]"#),
  19. ];
  20. OpTester::new().run_script(ops);
  21. }
  22. #[test]
  23. fn delta_insert_text_at_middle() {
  24. let ops = vec![
  25. Insert(0, "123", 0),
  26. Insert(0, "456", 1),
  27. AssertOpsJson(0, r#"[{"insert":"145623"}]"#),
  28. ];
  29. OpTester::new().run_script(ops);
  30. }
  31. #[test]
  32. fn delta_insert_text_with_attr() {
  33. let ops = vec![
  34. Insert(0, "145", 0),
  35. Insert(0, "23", 1),
  36. Bold(0, Interval::new(0, 2), true),
  37. AssertOpsJson(
  38. 0,
  39. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"345"}]"#,
  40. ),
  41. /* Insert(0, "abc", 1),
  42. * AssertOpsJson(
  43. * 0,
  44. * r#"[{"insert":"1abc2","attributes":{"bold":"true"}},{"insert":"345"}]"#,
  45. * ), */
  46. ];
  47. OpTester::new().run_script(ops);
  48. }
  49. #[test]
  50. fn delta_add_bold() {
  51. let ops = vec![
  52. Insert(0, "123456", 0),
  53. Bold(0, Interval::new(3, 5), true),
  54. AssertOpsJson(
  55. 0,
  56. r#"[
  57. {"insert":"123"},
  58. {"insert":"45","attributes":{"bold":"true"}},
  59. {"insert":"6"}
  60. ]"#,
  61. ),
  62. ];
  63. OpTester::new().run_script(ops);
  64. }
  65. #[test]
  66. fn delta_add_bold_and_invert_all() {
  67. let ops = vec![
  68. Insert(0, "123", 0),
  69. Bold(0, Interval::new(0, 3), true),
  70. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  71. Bold(0, Interval::new(0, 3), false),
  72. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  73. ];
  74. OpTester::new().run_script(ops);
  75. }
  76. #[test]
  77. fn delta_add_bold_and_invert_partial_suffix() {
  78. let ops = vec![
  79. Insert(0, "1234", 0),
  80. Bold(0, Interval::new(0, 4), true),
  81. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  82. Bold(0, Interval::new(2, 4), false),
  83. AssertOpsJson(
  84. 0,
  85. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  86. ),
  87. ];
  88. OpTester::new().run_script(ops);
  89. }
  90. #[test]
  91. fn delta_add_bold_and_invert_partial_suffix2() {
  92. let ops = vec![
  93. Insert(0, "1234", 0),
  94. Bold(0, Interval::new(0, 4), true),
  95. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  96. Bold(0, Interval::new(2, 4), false),
  97. AssertOpsJson(
  98. 0,
  99. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  100. ),
  101. Bold(0, Interval::new(2, 4), true),
  102. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  103. ];
  104. OpTester::new().run_script(ops);
  105. }
  106. #[test]
  107. fn delta_add_bold_and_invert_partial_prefix() {
  108. let ops = vec![
  109. Insert(0, "1234", 0),
  110. Bold(0, Interval::new(0, 4), true),
  111. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  112. Bold(0, Interval::new(0, 2), false),
  113. AssertOpsJson(
  114. 0,
  115. r#"[{"insert":"12"},{"insert":"34","attributes":{"bold":"true"}}]"#,
  116. ),
  117. ];
  118. OpTester::new().run_script(ops);
  119. }
  120. #[test]
  121. fn delta_add_bold_consecutive() {
  122. let ops = vec![
  123. Insert(0, "1234", 0),
  124. Bold(0, Interval::new(0, 1), true),
  125. AssertOpsJson(
  126. 0,
  127. r#"[{"insert":"1","attributes":{"bold":"true"}},{"insert":"234"}]"#,
  128. ),
  129. Bold(0, Interval::new(1, 2), true),
  130. AssertOpsJson(
  131. 0,
  132. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  133. ),
  134. ];
  135. OpTester::new().run_script(ops);
  136. }
  137. #[test]
  138. fn delta_add_bold_italic() {
  139. let ops = vec![
  140. Insert(0, "1234", 0),
  141. Bold(0, Interval::new(0, 4), true),
  142. Italic(0, Interval::new(0, 4), true),
  143. AssertOpsJson(
  144. 0,
  145. r#"[{"insert":"1234","attributes":{"italic":"true","bold":"true"}}]"#,
  146. ),
  147. Insert(0, "5678", 4),
  148. AssertOpsJson(
  149. 0,
  150. r#"[{"insert":"12345678","attributes":{"italic":"true","bold":"true"}}]"#,
  151. ),
  152. Italic(0, Interval::new(4, 6), false),
  153. AssertOpsJson(
  154. 0,
  155. r#"[{"insert":"1234","attributes":{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"}},{"insert":"78","attributes":{"bold":"true","italic":"true"}}]"#,
  156. ),
  157. ];
  158. OpTester::new().run_script(ops);
  159. }
  160. #[test]
  161. fn delta_add_bold_italic2() {
  162. let ops = vec![
  163. Insert(0, "123456", 0),
  164. Bold(0, Interval::new(0, 6), true),
  165. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  166. Italic(0, Interval::new(0, 2), true),
  167. AssertOpsJson(
  168. 0,
  169. r#"[
  170. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  171. {"insert":"3456","attributes":{"bold":"true"}}]
  172. "#,
  173. ),
  174. Italic(0, Interval::new(4, 6), true),
  175. AssertOpsJson(
  176. 0,
  177. r#"[
  178. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  179. {"insert":"34","attributes":{"bold":"true"}},
  180. {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
  181. "#,
  182. ),
  183. ];
  184. OpTester::new().run_script(ops);
  185. }
  186. #[test]
  187. fn delta_add_bold_italic3() {
  188. let ops = vec![
  189. Insert(0, "123456789", 0),
  190. Bold(0, Interval::new(0, 5), true),
  191. Italic(0, Interval::new(0, 2), true),
  192. AssertOpsJson(
  193. 0,
  194. r#"[
  195. {"insert":"12","attributes":{"bold":"true","italic":"true"}},
  196. {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
  197. "#,
  198. ),
  199. Italic(0, Interval::new(2, 4), true),
  200. AssertOpsJson(
  201. 0,
  202. r#"[
  203. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  204. {"insert":"5","attributes":{"bold":"true"}},
  205. {"insert":"6789"}]
  206. "#,
  207. ),
  208. Bold(0, Interval::new(7, 9), true),
  209. AssertOpsJson(
  210. 0,
  211. r#"[
  212. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  213. {"insert":"5","attributes":{"bold":"true"}},
  214. {"insert":"67"},
  215. {"insert":"89","attributes":{"bold":"true"}}]
  216. "#,
  217. ),
  218. ];
  219. OpTester::new().run_script(ops);
  220. }
  221. #[test]
  222. fn delta_add_bold_italic_delete() {
  223. let ops = vec![
  224. Insert(0, "123456789", 0),
  225. Bold(0, Interval::new(0, 5), true),
  226. Italic(0, Interval::new(0, 2), true),
  227. AssertOpsJson(
  228. 0,
  229. r#"[
  230. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  231. {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
  232. "#,
  233. ),
  234. Italic(0, Interval::new(2, 4), true),
  235. AssertOpsJson(
  236. 0,
  237. r#"[
  238. {"insert":"1234","attributes":{"bold":"true","italic":"true"}}
  239. ,{"insert":"5","attributes":{"bold":"true"}},{"insert":"6789"}]"#,
  240. ),
  241. Bold(0, Interval::new(7, 9), true),
  242. AssertOpsJson(
  243. 0,
  244. r#"[
  245. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  246. {"insert":"5","attributes":{"bold":"true"}},{"insert":"67"},
  247. {"insert":"89","attributes":{"bold":"true"}}]
  248. "#,
  249. ),
  250. Delete(0, Interval::new(0, 5)),
  251. AssertOpsJson(
  252. 0,
  253. r#"[{"insert":"67"},{"insert":"89","attributes":{"bold":"true"}}]"#,
  254. ),
  255. ];
  256. OpTester::new().run_script(ops);
  257. }
  258. #[test]
  259. fn delta_merge_inserted_text_with_same_attribute() {
  260. let ops = vec![
  261. InsertBold(0, "123", Interval::new(0, 3)),
  262. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  263. InsertBold(0, "456", Interval::new(3, 6)),
  264. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  265. ];
  266. OpTester::new().run_script(ops);
  267. }
  268. #[test]
  269. fn delta_compose_attr_delta_with_attr_delta_test() {
  270. let ops = vec![
  271. InsertBold(0, "123456", Interval::new(0, 6)),
  272. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  273. InsertBold(1, "7", Interval::new(0, 1)),
  274. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  275. Transform(0, 1),
  276. AssertOpsJson(0, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  277. AssertOpsJson(1, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  278. ];
  279. OpTester::new().run_script(ops);
  280. }
  281. #[test]
  282. fn delta_compose_attr_delta_with_attr_delta_test2() {
  283. let ops = vec![
  284. Insert(0, "123456", 0),
  285. Bold(0, Interval::new(0, 6), true),
  286. Italic(0, Interval::new(0, 2), true),
  287. Italic(0, Interval::new(4, 6), true),
  288. AssertOpsJson(
  289. 0,
  290. r#"[
  291. {"insert":"12","attributes":{"bold":"true","italic":"true"}},
  292. {"insert":"34","attributes":{"bold":"true"}},
  293. {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
  294. "#,
  295. ),
  296. InsertBold(1, "7", Interval::new(0, 1)),
  297. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  298. Transform(0, 1),
  299. AssertOpsJson(
  300. 0,
  301. r#"[
  302. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  303. {"insert":"34","attributes":{"bold":"true"}},
  304. {"insert":"56","attributes":{"italic":"true","bold":"true"}},
  305. {"insert":"7","attributes":{"bold":"true"}}]
  306. "#,
  307. ),
  308. AssertOpsJson(
  309. 1,
  310. r#"[
  311. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  312. {"insert":"34","attributes":{"bold":"true"}},
  313. {"insert":"56","attributes":{"italic":"true","bold":"true"}},
  314. {"insert":"7","attributes":{"bold":"true"}}]
  315. "#,
  316. ),
  317. ];
  318. OpTester::new().run_script(ops);
  319. }
  320. #[test]
  321. fn delta_compose_attr_delta_with_no_attr_delta_test() {
  322. let expected = r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"7"}]"#;
  323. let ops = vec![
  324. InsertBold(0, "123456", Interval::new(0, 6)),
  325. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  326. Insert(1, "7", 0),
  327. AssertOpsJson(1, r#"[{"insert":"7"}]"#),
  328. Transform(0, 1),
  329. AssertOpsJson(0, expected),
  330. AssertOpsJson(1, expected),
  331. ];
  332. OpTester::new().run_script(ops);
  333. }
  334. #[test]
  335. fn delta_replace_heading() {
  336. let ops = vec![
  337. InsertBold(0, "123456", Interval::new(0, 6)),
  338. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  339. Delete(0, Interval::new(0, 2)),
  340. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  341. ];
  342. OpTester::new().run_script(ops);
  343. }
  344. #[test]
  345. fn delta_replace_trailing() {
  346. let ops = vec![
  347. InsertBold(0, "123456", Interval::new(0, 6)),
  348. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  349. Delete(0, Interval::new(5, 6)),
  350. AssertOpsJson(0, r#"[{"insert":"12345","attributes":{"bold":"true"}}]"#),
  351. ];
  352. OpTester::new().run_script(ops);
  353. }
  354. #[test]
  355. fn delta_replace_middle() {
  356. let ops = vec![
  357. InsertBold(0, "123456", Interval::new(0, 6)),
  358. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  359. Delete(0, Interval::new(0, 2)),
  360. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  361. Delete(0, Interval::new(2, 4)),
  362. AssertOpsJson(0, r#"[{"insert":"34","attributes":{"bold":"true"}}]"#),
  363. ];
  364. OpTester::new().run_script(ops);
  365. }
  366. #[test]
  367. fn delta_replace_all() {
  368. let ops = vec![
  369. InsertBold(0, "123456", Interval::new(0, 6)),
  370. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  371. Delete(0, Interval::new(0, 6)),
  372. AssertOpsJson(0, r#"[]"#),
  373. ];
  374. OpTester::new().run_script(ops);
  375. }
  376. #[test]
  377. fn delta_replace_with_text() {
  378. let ops = vec![
  379. InsertBold(0, "123456", Interval::new(0, 6)),
  380. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  381. Replace(0, Interval::new(0, 3), "ab"),
  382. AssertOpsJson(
  383. 0,
  384. r#"[{"insert":"ab"},{"insert":"456","attributes":{"bold":"true"}}]"#,
  385. ),
  386. ];
  387. OpTester::new().run_script(ops);
  388. }