attribute_test.rs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  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_empty_str() {
  139. let ops = vec![Bold(0, Interval::new(0, 4), true)];
  140. OpTester::new().run_script(ops);
  141. }
  142. #[test]
  143. fn delta_add_bold_italic() {
  144. let ops = vec![
  145. Insert(0, "1234", 0),
  146. Bold(0, Interval::new(0, 4), true),
  147. Italic(0, Interval::new(0, 4), true),
  148. AssertOpsJson(
  149. 0,
  150. r#"[{"insert":"1234","attributes":{"italic":"true","bold":"true"}}]"#,
  151. ),
  152. Insert(0, "5678", 4),
  153. AssertOpsJson(
  154. 0,
  155. r#"[{"insert":"12345678","attributes":{"italic":"true","bold":"true"}}]"#,
  156. ),
  157. Italic(0, Interval::new(4, 6), false),
  158. AssertOpsJson(
  159. 0,
  160. r#"[{"insert":"1234","attributes":{"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"}},{"insert":"78","attributes":{"bold":"true","italic":"true"}}]"#,
  161. ),
  162. ];
  163. OpTester::new().run_script(ops);
  164. }
  165. #[test]
  166. fn delta_add_bold_italic2() {
  167. let ops = vec![
  168. Insert(0, "123456", 0),
  169. Bold(0, Interval::new(0, 6), true),
  170. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  171. Italic(0, Interval::new(0, 2), true),
  172. AssertOpsJson(
  173. 0,
  174. r#"[
  175. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  176. {"insert":"3456","attributes":{"bold":"true"}}]
  177. "#,
  178. ),
  179. Italic(0, Interval::new(4, 6), true),
  180. AssertOpsJson(
  181. 0,
  182. r#"[
  183. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  184. {"insert":"34","attributes":{"bold":"true"}},
  185. {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
  186. "#,
  187. ),
  188. ];
  189. OpTester::new().run_script(ops);
  190. }
  191. #[test]
  192. fn delta_add_bold_italic3() {
  193. let ops = vec![
  194. Insert(0, "123456789", 0),
  195. Bold(0, Interval::new(0, 5), true),
  196. Italic(0, Interval::new(0, 2), true),
  197. AssertOpsJson(
  198. 0,
  199. r#"[
  200. {"insert":"12","attributes":{"bold":"true","italic":"true"}},
  201. {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
  202. "#,
  203. ),
  204. Italic(0, Interval::new(2, 4), true),
  205. AssertOpsJson(
  206. 0,
  207. r#"[
  208. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  209. {"insert":"5","attributes":{"bold":"true"}},
  210. {"insert":"6789"}]
  211. "#,
  212. ),
  213. Bold(0, Interval::new(7, 9), true),
  214. AssertOpsJson(
  215. 0,
  216. r#"[
  217. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  218. {"insert":"5","attributes":{"bold":"true"}},
  219. {"insert":"67"},
  220. {"insert":"89","attributes":{"bold":"true"}}]
  221. "#,
  222. ),
  223. ];
  224. OpTester::new().run_script(ops);
  225. }
  226. #[test]
  227. fn delta_add_bold_italic_delete() {
  228. let ops = vec![
  229. Insert(0, "123456789", 0),
  230. Bold(0, Interval::new(0, 5), true),
  231. Italic(0, Interval::new(0, 2), true),
  232. AssertOpsJson(
  233. 0,
  234. r#"[
  235. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  236. {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
  237. "#,
  238. ),
  239. Italic(0, Interval::new(2, 4), true),
  240. AssertOpsJson(
  241. 0,
  242. r#"[
  243. {"insert":"1234","attributes":{"bold":"true","italic":"true"}}
  244. ,{"insert":"5","attributes":{"bold":"true"}},{"insert":"6789"}]"#,
  245. ),
  246. Bold(0, Interval::new(7, 9), true),
  247. AssertOpsJson(
  248. 0,
  249. r#"[
  250. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  251. {"insert":"5","attributes":{"bold":"true"}},{"insert":"67"},
  252. {"insert":"89","attributes":{"bold":"true"}}]
  253. "#,
  254. ),
  255. Delete(0, Interval::new(0, 5)),
  256. AssertOpsJson(
  257. 0,
  258. r#"[{"insert":"67"},{"insert":"89","attributes":{"bold":"true"}}]"#,
  259. ),
  260. ];
  261. OpTester::new().run_script(ops);
  262. }
  263. #[test]
  264. fn delta_merge_inserted_text_with_same_attribute() {
  265. let ops = vec![
  266. InsertBold(0, "123", Interval::new(0, 3)),
  267. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  268. InsertBold(0, "456", Interval::new(3, 6)),
  269. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  270. ];
  271. OpTester::new().run_script(ops);
  272. }
  273. #[test]
  274. fn delta_compose_attr_delta_with_attr_delta_test() {
  275. let ops = vec![
  276. InsertBold(0, "123456", Interval::new(0, 6)),
  277. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  278. InsertBold(1, "7", Interval::new(0, 1)),
  279. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  280. Transform(0, 1),
  281. AssertOpsJson(0, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  282. AssertOpsJson(1, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  283. ];
  284. OpTester::new().run_script(ops);
  285. }
  286. #[test]
  287. fn delta_compose_attr_delta_with_attr_delta_test2() {
  288. let ops = vec![
  289. Insert(0, "123456", 0),
  290. Bold(0, Interval::new(0, 6), true),
  291. Italic(0, Interval::new(0, 2), true),
  292. Italic(0, Interval::new(4, 6), true),
  293. AssertOpsJson(
  294. 0,
  295. r#"[
  296. {"insert":"12","attributes":{"bold":"true","italic":"true"}},
  297. {"insert":"34","attributes":{"bold":"true"}},
  298. {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
  299. "#,
  300. ),
  301. InsertBold(1, "7", Interval::new(0, 1)),
  302. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  303. Transform(0, 1),
  304. AssertOpsJson(
  305. 0,
  306. r#"[
  307. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  308. {"insert":"34","attributes":{"bold":"true"}},
  309. {"insert":"56","attributes":{"italic":"true","bold":"true"}},
  310. {"insert":"7","attributes":{"bold":"true"}}]
  311. "#,
  312. ),
  313. AssertOpsJson(
  314. 1,
  315. r#"[
  316. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  317. {"insert":"34","attributes":{"bold":"true"}},
  318. {"insert":"56","attributes":{"italic":"true","bold":"true"}},
  319. {"insert":"7","attributes":{"bold":"true"}}]
  320. "#,
  321. ),
  322. ];
  323. OpTester::new().run_script(ops);
  324. }
  325. #[test]
  326. fn delta_compose_attr_delta_with_no_attr_delta_test() {
  327. let expected = r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"7"}]"#;
  328. let ops = vec![
  329. InsertBold(0, "123456", Interval::new(0, 6)),
  330. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  331. Insert(1, "7", 0),
  332. AssertOpsJson(1, r#"[{"insert":"7"}]"#),
  333. Transform(0, 1),
  334. AssertOpsJson(0, expected),
  335. AssertOpsJson(1, expected),
  336. ];
  337. OpTester::new().run_script(ops);
  338. }
  339. #[test]
  340. fn delta_replace_heading() {
  341. let ops = vec![
  342. InsertBold(0, "123456", Interval::new(0, 6)),
  343. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  344. Delete(0, Interval::new(0, 2)),
  345. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  346. ];
  347. OpTester::new().run_script(ops);
  348. }
  349. #[test]
  350. fn delta_replace_trailing() {
  351. let ops = vec![
  352. InsertBold(0, "123456", Interval::new(0, 6)),
  353. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  354. Delete(0, Interval::new(5, 6)),
  355. AssertOpsJson(0, r#"[{"insert":"12345","attributes":{"bold":"true"}}]"#),
  356. ];
  357. OpTester::new().run_script(ops);
  358. }
  359. #[test]
  360. fn delta_replace_middle() {
  361. let ops = vec![
  362. InsertBold(0, "123456", Interval::new(0, 6)),
  363. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  364. Delete(0, Interval::new(0, 2)),
  365. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  366. Delete(0, Interval::new(2, 4)),
  367. AssertOpsJson(0, r#"[{"insert":"34","attributes":{"bold":"true"}}]"#),
  368. ];
  369. OpTester::new().run_script(ops);
  370. }
  371. #[test]
  372. fn delta_replace_all() {
  373. let ops = vec![
  374. InsertBold(0, "123456", Interval::new(0, 6)),
  375. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  376. Delete(0, Interval::new(0, 6)),
  377. AssertOpsJson(0, r#"[]"#),
  378. ];
  379. OpTester::new().run_script(ops);
  380. }
  381. #[test]
  382. fn delta_replace_with_text() {
  383. let ops = vec![
  384. InsertBold(0, "123456", Interval::new(0, 6)),
  385. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  386. Replace(0, Interval::new(0, 3), "ab"),
  387. AssertOpsJson(
  388. 0,
  389. r#"[{"insert":"ab"},{"insert":"456","attributes":{"bold":"true"}}]"#,
  390. ),
  391. ];
  392. OpTester::new().run_script(ops);
  393. }