attribute_test.rs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. pub mod helper;
  2. use crate::helper::{TestOp::*, *};
  3. use flowy_ot::core::Interval;
  4. #[test]
  5. fn attributes_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 attributes_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 attributes_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 attributes_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 attributes_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 attributes_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 attributes_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 attributes_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 attributes_add_bold_with_new_line() {
  108. let ops = vec![
  109. Insert(0, "123456", 0),
  110. Bold(0, Interval::new(0, 6), true),
  111. AssertOpsJson(
  112. 0,
  113. r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
  114. ),
  115. Insert(0, "\n", 3),
  116. AssertOpsJson(
  117. 0,
  118. r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
  119. ),
  120. Insert(0, "\n", 4),
  121. AssertOpsJson(
  122. 0,
  123. r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\n\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
  124. ),
  125. Insert(0, "a", 4),
  126. AssertOpsJson(
  127. 0,
  128. r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\na\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
  129. ),
  130. ];
  131. OpTester::new().run_script_with_newline(ops);
  132. }
  133. #[test]
  134. fn attributes_add_bold_and_invert_partial_prefix() {
  135. let ops = vec![
  136. Insert(0, "1234", 0),
  137. Bold(0, Interval::new(0, 4), true),
  138. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  139. Bold(0, Interval::new(0, 2), false),
  140. AssertOpsJson(
  141. 0,
  142. r#"[{"insert":"12"},{"insert":"34","attributes":{"bold":"true"}}]"#,
  143. ),
  144. ];
  145. OpTester::new().run_script(ops);
  146. }
  147. #[test]
  148. fn attributes_add_bold_consecutive() {
  149. let ops = vec![
  150. Insert(0, "1234", 0),
  151. Bold(0, Interval::new(0, 1), true),
  152. AssertOpsJson(
  153. 0,
  154. r#"[{"insert":"1","attributes":{"bold":"true"}},{"insert":"234"}]"#,
  155. ),
  156. Bold(0, Interval::new(1, 2), true),
  157. AssertOpsJson(
  158. 0,
  159. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  160. ),
  161. ];
  162. OpTester::new().run_script(ops);
  163. }
  164. #[test]
  165. fn attributes_add_bold_italic() {
  166. let ops = vec![
  167. Insert(0, "1234", 0),
  168. Bold(0, Interval::new(0, 4), true),
  169. Italic(0, Interval::new(0, 4), true),
  170. AssertOpsJson(
  171. 0,
  172. r#"[{"insert":"1234","attributes":{"italic":"true","bold":"true"}},{"insert":"\n"}]"#,
  173. ),
  174. Insert(0, "5678", 4),
  175. AssertOpsJson(
  176. 0,
  177. r#"[{"insert":"12345678","attributes":{"bold":"true","italic":"true"}},{"insert":"\n"}]"#,
  178. ),
  179. ];
  180. OpTester::new().run_script_with_newline(ops);
  181. }
  182. #[test]
  183. fn attributes_add_bold_italic2() {
  184. let ops = vec![
  185. Insert(0, "123456", 0),
  186. Bold(0, Interval::new(0, 6), true),
  187. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  188. Italic(0, Interval::new(0, 2), true),
  189. AssertOpsJson(
  190. 0,
  191. r#"[
  192. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  193. {"insert":"3456","attributes":{"bold":"true"}}]
  194. "#,
  195. ),
  196. Italic(0, Interval::new(4, 6), true),
  197. AssertOpsJson(
  198. 0,
  199. r#"[
  200. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  201. {"insert":"34","attributes":{"bold":"true"}},
  202. {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
  203. "#,
  204. ),
  205. ];
  206. OpTester::new().run_script(ops);
  207. }
  208. #[test]
  209. fn attributes_add_bold_italic3() {
  210. let ops = vec![
  211. Insert(0, "123456789", 0),
  212. Bold(0, Interval::new(0, 5), true),
  213. Italic(0, Interval::new(0, 2), true),
  214. AssertOpsJson(
  215. 0,
  216. r#"[
  217. {"insert":"12","attributes":{"bold":"true","italic":"true"}},
  218. {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
  219. "#,
  220. ),
  221. Italic(0, Interval::new(2, 4), true),
  222. AssertOpsJson(
  223. 0,
  224. r#"[
  225. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  226. {"insert":"5","attributes":{"bold":"true"}},
  227. {"insert":"6789"}]
  228. "#,
  229. ),
  230. Bold(0, Interval::new(7, 9), true),
  231. AssertOpsJson(
  232. 0,
  233. r#"[
  234. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  235. {"insert":"5","attributes":{"bold":"true"}},
  236. {"insert":"67"},
  237. {"insert":"89","attributes":{"bold":"true"}}]
  238. "#,
  239. ),
  240. ];
  241. OpTester::new().run_script(ops);
  242. }
  243. #[test]
  244. fn attributes_add_bold_italic_delete() {
  245. let ops = vec![
  246. Insert(0, "123456789", 0),
  247. Bold(0, Interval::new(0, 5), true),
  248. Italic(0, Interval::new(0, 2), true),
  249. AssertOpsJson(
  250. 0,
  251. r#"[
  252. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  253. {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
  254. "#,
  255. ),
  256. Italic(0, Interval::new(2, 4), true),
  257. AssertOpsJson(
  258. 0,
  259. r#"[
  260. {"insert":"1234","attributes":{"bold":"true","italic":"true"}}
  261. ,{"insert":"5","attributes":{"bold":"true"}},{"insert":"6789"}]"#,
  262. ),
  263. Bold(0, Interval::new(7, 9), true),
  264. AssertOpsJson(
  265. 0,
  266. r#"[
  267. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  268. {"insert":"5","attributes":{"bold":"true"}},{"insert":"67"},
  269. {"insert":"89","attributes":{"bold":"true"}}]
  270. "#,
  271. ),
  272. Delete(0, Interval::new(0, 5)),
  273. AssertOpsJson(
  274. 0,
  275. r#"[{"insert":"67"},{"insert":"89","attributes":{"bold":"true"}}]"#,
  276. ),
  277. ];
  278. OpTester::new().run_script(ops);
  279. }
  280. #[test]
  281. fn attributes_merge_inserted_text_with_same_attribute() {
  282. let ops = vec![
  283. InsertBold(0, "123", Interval::new(0, 3)),
  284. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  285. InsertBold(0, "456", Interval::new(3, 6)),
  286. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  287. ];
  288. OpTester::new().run_script(ops);
  289. }
  290. #[test]
  291. fn attributes_compose_attr_attributes_with_attr_attributes_test() {
  292. let ops = vec![
  293. InsertBold(0, "123456", Interval::new(0, 6)),
  294. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  295. InsertBold(1, "7", Interval::new(0, 1)),
  296. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  297. Transform(0, 1),
  298. AssertOpsJson(0, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  299. AssertOpsJson(1, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  300. ];
  301. OpTester::new().run_script(ops);
  302. }
  303. #[test]
  304. fn attributes_compose_attr_attributes_with_attr_attributes_test2() {
  305. let ops = vec![
  306. Insert(0, "123456", 0),
  307. Bold(0, Interval::new(0, 6), true),
  308. Italic(0, Interval::new(0, 2), true),
  309. Italic(0, Interval::new(4, 6), true),
  310. AssertOpsJson(
  311. 0,
  312. r#"[
  313. {"insert":"12","attributes":{"bold":"true","italic":"true"}},
  314. {"insert":"34","attributes":{"bold":"true"}},
  315. {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
  316. "#,
  317. ),
  318. InsertBold(1, "7", Interval::new(0, 1)),
  319. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  320. Transform(0, 1),
  321. AssertOpsJson(
  322. 0,
  323. r#"[
  324. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  325. {"insert":"34","attributes":{"bold":"true"}},
  326. {"insert":"56","attributes":{"italic":"true","bold":"true"}},
  327. {"insert":"7","attributes":{"bold":"true"}}]
  328. "#,
  329. ),
  330. AssertOpsJson(
  331. 1,
  332. r#"[
  333. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  334. {"insert":"34","attributes":{"bold":"true"}},
  335. {"insert":"56","attributes":{"italic":"true","bold":"true"}},
  336. {"insert":"7","attributes":{"bold":"true"}}]
  337. "#,
  338. ),
  339. ];
  340. OpTester::new().run_script(ops);
  341. }
  342. #[test]
  343. fn attributes_compose_attr_attributes_with_no_attr_attributes_test() {
  344. let expected = r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"7"}]"#;
  345. let ops = vec![
  346. InsertBold(0, "123456", Interval::new(0, 6)),
  347. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  348. Insert(1, "7", 0),
  349. AssertOpsJson(1, r#"[{"insert":"7"}]"#),
  350. Transform(0, 1),
  351. AssertOpsJson(0, expected),
  352. AssertOpsJson(1, expected),
  353. ];
  354. OpTester::new().run_script(ops);
  355. }
  356. #[test]
  357. fn attributes_replace_heading() {
  358. let ops = vec![
  359. InsertBold(0, "123456", Interval::new(0, 6)),
  360. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  361. Delete(0, Interval::new(0, 2)),
  362. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  363. ];
  364. OpTester::new().run_script(ops);
  365. }
  366. #[test]
  367. fn attributes_replace_trailing() {
  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(5, 6)),
  372. AssertOpsJson(0, r#"[{"insert":"12345","attributes":{"bold":"true"}}]"#),
  373. ];
  374. OpTester::new().run_script(ops);
  375. }
  376. #[test]
  377. fn attributes_replace_middle() {
  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, 2)),
  382. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  383. Delete(0, Interval::new(2, 4)),
  384. AssertOpsJson(0, r#"[{"insert":"34","attributes":{"bold":"true"}}]"#),
  385. ];
  386. OpTester::new().run_script(ops);
  387. }
  388. #[test]
  389. fn attributes_replace_all() {
  390. let ops = vec![
  391. InsertBold(0, "123456", Interval::new(0, 6)),
  392. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  393. Delete(0, Interval::new(0, 6)),
  394. AssertOpsJson(0, r#"[]"#),
  395. ];
  396. OpTester::new().run_script(ops);
  397. }
  398. #[test]
  399. fn attributes_replace_with_text() {
  400. let ops = vec![
  401. InsertBold(0, "123456", Interval::new(0, 6)),
  402. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  403. Replace(0, Interval::new(0, 3), "ab"),
  404. AssertOpsJson(
  405. 0,
  406. r#"[{"insert":"ab"},{"insert":"456","attributes":{"bold":"true"}}]"#,
  407. ),
  408. ];
  409. OpTester::new().run_script(ops);
  410. }
  411. #[test]
  412. fn attributes_add_header() {
  413. let ops = vec![
  414. Insert(0, "123456", 0),
  415. Header(0, Interval::new(0, 6), 1, true),
  416. AssertOpsJson(
  417. 0,
  418. r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  419. ),
  420. Insert(0, "\n", 3),
  421. AssertOpsJson(
  422. 0,
  423. r#"[{"insert":"123"},{"insert":"\n","attributes":{"header":"1"}},{"insert":"456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  424. ),
  425. ];
  426. OpTester::new().run_script_with_newline(ops);
  427. }
  428. #[test]
  429. fn attributes_header_add_newline() {
  430. let ops = vec![
  431. Insert(0, "123456", 0),
  432. Header(0, Interval::new(0, 6), 1, true),
  433. Insert(0, "\n", 6),
  434. AssertOpsJson(
  435. 0,
  436. r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":"1"}},{"insert":"\n"}]"#,
  437. ),
  438. ];
  439. OpTester::new().run_script_with_newline(ops);
  440. }
  441. #[test]
  442. fn attributes_header_add_newline_2() {
  443. let ops = vec![
  444. Insert(0, "123456", 0),
  445. Header(0, Interval::new(0, 6), 1, true),
  446. Insert(0, "\n", 3),
  447. AssertOpsJson(
  448. 0,
  449. r#"[{"insert":"123"},{"insert":"\n","attributes":{"header":"1"}},{"insert":"456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  450. ),
  451. Insert(0, "\n", 4),
  452. AssertOpsJson(
  453. 0,
  454. r#"[{"insert":"123"},{"insert":"\n\n","attributes":{"header":"1"}},{"insert":"456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  455. ),
  456. Insert(0, "\n", 4),
  457. AssertOpsJson(
  458. 0,
  459. r#"[{"insert":"123"},{"insert":"\n\n","attributes":{"header":"1"}},{"insert":"\n456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  460. ),
  461. ];
  462. OpTester::new().run_script_with_newline(ops);
  463. }