attribute_test.rs 13 KB

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