attribute_test.rs 12 KB

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