attribute_test.rs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. pub mod helper;
  2. use crate::helper::{TestOp::*, *};
  3. use flowy_ot::core::{Interval, NEW_LINE, WHITESPACE};
  4. #[test]
  5. fn attributes_bold_added() {
  6. let ops = vec![
  7. Insert(0, "123456", 0),
  8. Bold(0, Interval::new(3, 5), true),
  9. AssertOpsJson(
  10. 0,
  11. r#"[
  12. {"insert":"123"},
  13. {"insert":"45","attributes":{"bold":"true"}},
  14. {"insert":"6"}
  15. ]"#,
  16. ),
  17. ];
  18. OpTester::new().run_script(ops);
  19. }
  20. #[test]
  21. fn attributes_bold_added_and_invert_all() {
  22. let ops = vec![
  23. Insert(0, "123", 0),
  24. Bold(0, Interval::new(0, 3), true),
  25. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  26. Bold(0, Interval::new(0, 3), false),
  27. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  28. ];
  29. OpTester::new().run_script(ops);
  30. }
  31. #[test]
  32. fn attributes_bold_added_and_invert_partial_suffix() {
  33. let ops = vec![
  34. Insert(0, "1234", 0),
  35. Bold(0, Interval::new(0, 4), true),
  36. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  37. Bold(0, Interval::new(2, 4), false),
  38. AssertOpsJson(
  39. 0,
  40. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  41. ),
  42. ];
  43. OpTester::new().run_script(ops);
  44. }
  45. #[test]
  46. fn attributes_bold_added_and_invert_partial_suffix2() {
  47. let ops = vec![
  48. Insert(0, "1234", 0),
  49. Bold(0, Interval::new(0, 4), true),
  50. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  51. Bold(0, Interval::new(2, 4), false),
  52. AssertOpsJson(
  53. 0,
  54. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  55. ),
  56. Bold(0, Interval::new(2, 4), true),
  57. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  58. ];
  59. OpTester::new().run_script(ops);
  60. }
  61. #[test]
  62. fn attributes_bold_added_with_new_line() {
  63. let ops = vec![
  64. Insert(0, "123456", 0),
  65. Bold(0, Interval::new(0, 6), true),
  66. AssertOpsJson(
  67. 0,
  68. r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
  69. ),
  70. Insert(0, "\n", 3),
  71. AssertOpsJson(
  72. 0,
  73. r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
  74. ),
  75. Insert(0, "\n", 4),
  76. AssertOpsJson(
  77. 0,
  78. r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\n\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
  79. ),
  80. Insert(0, "a", 4),
  81. AssertOpsJson(
  82. 0,
  83. r#"[{"insert":"123","attributes":{"bold":"true"}},{"insert":"\na\n"},{"insert":"456","attributes":{"bold":"true"}},{"insert":"\n"}]"#,
  84. ),
  85. ];
  86. OpTester::new().run_script_with_newline(ops);
  87. }
  88. #[test]
  89. fn attributes_bold_added_and_invert_partial_prefix() {
  90. let ops = vec![
  91. Insert(0, "1234", 0),
  92. Bold(0, Interval::new(0, 4), true),
  93. AssertOpsJson(0, r#"[{"insert":"1234","attributes":{"bold":"true"}}]"#),
  94. Bold(0, Interval::new(0, 2), false),
  95. AssertOpsJson(
  96. 0,
  97. r#"[{"insert":"12"},{"insert":"34","attributes":{"bold":"true"}}]"#,
  98. ),
  99. ];
  100. OpTester::new().run_script(ops);
  101. }
  102. #[test]
  103. fn attributes_bold_added_consecutive() {
  104. let ops = vec![
  105. Insert(0, "1234", 0),
  106. Bold(0, Interval::new(0, 1), true),
  107. AssertOpsJson(
  108. 0,
  109. r#"[{"insert":"1","attributes":{"bold":"true"}},{"insert":"234"}]"#,
  110. ),
  111. Bold(0, Interval::new(1, 2), true),
  112. AssertOpsJson(
  113. 0,
  114. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34"}]"#,
  115. ),
  116. ];
  117. OpTester::new().run_script(ops);
  118. }
  119. #[test]
  120. fn attributes_bold_added_italic() {
  121. let ops = vec![
  122. Insert(0, "1234", 0),
  123. Bold(0, Interval::new(0, 4), true),
  124. Italic(0, Interval::new(0, 4), true),
  125. AssertOpsJson(
  126. 0,
  127. r#"[{"insert":"1234","attributes":{"italic":"true","bold":"true"}},{"insert":"\n"}]"#,
  128. ),
  129. Insert(0, "5678", 4),
  130. AssertOpsJson(
  131. 0,
  132. r#"[{"insert":"12345678","attributes":{"bold":"true","italic":"true"}},{"insert":"\n"}]"#,
  133. ),
  134. ];
  135. OpTester::new().run_script_with_newline(ops);
  136. }
  137. #[test]
  138. fn attributes_bold_added_italic2() {
  139. let ops = vec![
  140. Insert(0, "123456", 0),
  141. Bold(0, Interval::new(0, 6), true),
  142. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  143. Italic(0, Interval::new(0, 2), true),
  144. AssertOpsJson(
  145. 0,
  146. r#"[
  147. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  148. {"insert":"3456","attributes":{"bold":"true"}}]
  149. "#,
  150. ),
  151. Italic(0, Interval::new(4, 6), true),
  152. AssertOpsJson(
  153. 0,
  154. r#"[
  155. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  156. {"insert":"34","attributes":{"bold":"true"}},
  157. {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
  158. "#,
  159. ),
  160. ];
  161. OpTester::new().run_script(ops);
  162. }
  163. #[test]
  164. fn attributes_bold_added_italic3() {
  165. let ops = vec![
  166. Insert(0, "123456789", 0),
  167. Bold(0, Interval::new(0, 5), true),
  168. Italic(0, Interval::new(0, 2), true),
  169. AssertOpsJson(
  170. 0,
  171. r#"[
  172. {"insert":"12","attributes":{"bold":"true","italic":"true"}},
  173. {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
  174. "#,
  175. ),
  176. Italic(0, Interval::new(2, 4), true),
  177. AssertOpsJson(
  178. 0,
  179. r#"[
  180. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  181. {"insert":"5","attributes":{"bold":"true"}},
  182. {"insert":"6789"}]
  183. "#,
  184. ),
  185. Bold(0, Interval::new(7, 9), true),
  186. AssertOpsJson(
  187. 0,
  188. r#"[
  189. {"insert":"1234","attributes":{"bold":"true","italic":"true"}},
  190. {"insert":"5","attributes":{"bold":"true"}},
  191. {"insert":"67"},
  192. {"insert":"89","attributes":{"bold":"true"}}]
  193. "#,
  194. ),
  195. ];
  196. OpTester::new().run_script(ops);
  197. }
  198. #[test]
  199. fn attributes_bold_added_italic_delete() {
  200. let ops = vec![
  201. Insert(0, "123456789", 0),
  202. Bold(0, Interval::new(0, 5), true),
  203. Italic(0, Interval::new(0, 2), true),
  204. AssertOpsJson(
  205. 0,
  206. r#"[
  207. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  208. {"insert":"345","attributes":{"bold":"true"}},{"insert":"6789"}]
  209. "#,
  210. ),
  211. Italic(0, Interval::new(2, 4), true),
  212. AssertOpsJson(
  213. 0,
  214. r#"[
  215. {"insert":"1234","attributes":{"bold":"true","italic":"true"}}
  216. ,{"insert":"5","attributes":{"bold":"true"}},{"insert":"6789"}]"#,
  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"}},{"insert":"67"},
  224. {"insert":"89","attributes":{"bold":"true"}}]
  225. "#,
  226. ),
  227. Delete(0, Interval::new(0, 5)),
  228. AssertOpsJson(
  229. 0,
  230. r#"[{"insert":"67"},{"insert":"89","attributes":{"bold":"true"}}]"#,
  231. ),
  232. ];
  233. OpTester::new().run_script(ops);
  234. }
  235. #[test]
  236. fn attributes_merge_inserted_text_with_same_attribute() {
  237. let ops = vec![
  238. InsertBold(0, "123", Interval::new(0, 3)),
  239. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  240. InsertBold(0, "456", Interval::new(3, 6)),
  241. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  242. ];
  243. OpTester::new().run_script(ops);
  244. }
  245. #[test]
  246. fn attributes_compose_attr_attributes_with_attr_attributes_test() {
  247. let ops = vec![
  248. InsertBold(0, "123456", Interval::new(0, 6)),
  249. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  250. InsertBold(1, "7", Interval::new(0, 1)),
  251. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  252. Transform(0, 1),
  253. AssertOpsJson(0, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  254. AssertOpsJson(1, r#"[{"insert":"1234567","attributes":{"bold":"true"}}]"#),
  255. ];
  256. OpTester::new().run_script(ops);
  257. }
  258. #[test]
  259. fn attributes_compose_attr_attributes_with_attr_attributes_test2() {
  260. let ops = vec![
  261. Insert(0, "123456", 0),
  262. Bold(0, Interval::new(0, 6), true),
  263. Italic(0, Interval::new(0, 2), true),
  264. Italic(0, Interval::new(4, 6), true),
  265. AssertOpsJson(
  266. 0,
  267. r#"[
  268. {"insert":"12","attributes":{"bold":"true","italic":"true"}},
  269. {"insert":"34","attributes":{"bold":"true"}},
  270. {"insert":"56","attributes":{"italic":"true","bold":"true"}}]
  271. "#,
  272. ),
  273. InsertBold(1, "7", Interval::new(0, 1)),
  274. AssertOpsJson(1, r#"[{"insert":"7","attributes":{"bold":"true"}}]"#),
  275. Transform(0, 1),
  276. AssertOpsJson(
  277. 0,
  278. r#"[
  279. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  280. {"insert":"34","attributes":{"bold":"true"}},
  281. {"insert":"56","attributes":{"italic":"true","bold":"true"}},
  282. {"insert":"7","attributes":{"bold":"true"}}]
  283. "#,
  284. ),
  285. AssertOpsJson(
  286. 1,
  287. r#"[
  288. {"insert":"12","attributes":{"italic":"true","bold":"true"}},
  289. {"insert":"34","attributes":{"bold":"true"}},
  290. {"insert":"56","attributes":{"italic":"true","bold":"true"}},
  291. {"insert":"7","attributes":{"bold":"true"}}]
  292. "#,
  293. ),
  294. ];
  295. OpTester::new().run_script(ops);
  296. }
  297. #[test]
  298. fn attributes_compose_attr_attributes_with_no_attr_attributes_test() {
  299. let expected = r#"[{"insert":"123456","attributes":{"bold":"true"}},{"insert":"7"}]"#;
  300. let ops = vec![
  301. InsertBold(0, "123456", Interval::new(0, 6)),
  302. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  303. Insert(1, "7", 0),
  304. AssertOpsJson(1, r#"[{"insert":"7"}]"#),
  305. Transform(0, 1),
  306. AssertOpsJson(0, expected),
  307. AssertOpsJson(1, expected),
  308. ];
  309. OpTester::new().run_script(ops);
  310. }
  311. #[test]
  312. fn attributes_replace_heading() {
  313. let ops = vec![
  314. InsertBold(0, "123456", Interval::new(0, 6)),
  315. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  316. Delete(0, Interval::new(0, 2)),
  317. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  318. ];
  319. OpTester::new().run_script(ops);
  320. }
  321. #[test]
  322. fn attributes_replace_trailing() {
  323. let ops = vec![
  324. InsertBold(0, "123456", Interval::new(0, 6)),
  325. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  326. Delete(0, Interval::new(5, 6)),
  327. AssertOpsJson(0, r#"[{"insert":"12345","attributes":{"bold":"true"}}]"#),
  328. ];
  329. OpTester::new().run_script(ops);
  330. }
  331. #[test]
  332. fn attributes_replace_middle() {
  333. let ops = vec![
  334. InsertBold(0, "123456", Interval::new(0, 6)),
  335. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  336. Delete(0, Interval::new(0, 2)),
  337. AssertOpsJson(0, r#"[{"insert":"3456","attributes":{"bold":"true"}}]"#),
  338. Delete(0, Interval::new(2, 4)),
  339. AssertOpsJson(0, r#"[{"insert":"34","attributes":{"bold":"true"}}]"#),
  340. ];
  341. OpTester::new().run_script(ops);
  342. }
  343. #[test]
  344. fn attributes_replace_all() {
  345. let ops = vec![
  346. InsertBold(0, "123456", Interval::new(0, 6)),
  347. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  348. Delete(0, Interval::new(0, 6)),
  349. AssertOpsJson(0, r#"[]"#),
  350. ];
  351. OpTester::new().run_script(ops);
  352. }
  353. #[test]
  354. fn attributes_replace_with_text() {
  355. let ops = vec![
  356. InsertBold(0, "123456", Interval::new(0, 6)),
  357. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  358. Replace(0, Interval::new(0, 3), "ab"),
  359. AssertOpsJson(
  360. 0,
  361. r#"[{"insert":"ab"},{"insert":"456","attributes":{"bold":"true"}}]"#,
  362. ),
  363. ];
  364. OpTester::new().run_script(ops);
  365. }
  366. #[test]
  367. fn attributes_header_insert_newline_at_middle() {
  368. let ops = vec![
  369. Insert(0, "123456", 0),
  370. Header(0, Interval::new(0, 6), 1, true),
  371. AssertOpsJson(
  372. 0,
  373. r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  374. ),
  375. Insert(0, "\n", 3),
  376. AssertOpsJson(
  377. 0,
  378. r#"[{"insert":"123"},{"insert":"\n","attributes":{"header":"1"}},{"insert":"456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  379. ),
  380. ];
  381. OpTester::new().run_script_with_newline(ops);
  382. }
  383. #[test]
  384. fn attributes_header_insert_double_newline_at_middle() {
  385. let ops = vec![
  386. Insert(0, "123456", 0),
  387. Header(0, Interval::new(0, 6), 1, true),
  388. Insert(0, "\n", 3),
  389. AssertOpsJson(
  390. 0,
  391. r#"[{"insert":"123"},{"insert":"\n","attributes":{"header":"1"}},{"insert":"456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  392. ),
  393. Insert(0, "\n", 4),
  394. AssertOpsJson(
  395. 0,
  396. r#"[{"insert":"123"},{"insert":"\n\n","attributes":{"header":"1"}},{"insert":"456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  397. ),
  398. Insert(0, "\n", 4),
  399. AssertOpsJson(
  400. 0,
  401. r#"[{"insert":"123"},{"insert":"\n\n","attributes":{"header":"1"}},{"insert":"\n456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  402. ),
  403. ];
  404. OpTester::new().run_script_with_newline(ops);
  405. }
  406. #[test]
  407. fn attributes_header_insert_newline_at_trailing() {
  408. let ops = vec![
  409. Insert(0, "123456", 0),
  410. Header(0, Interval::new(0, 6), 1, true),
  411. Insert(0, "\n", 6),
  412. AssertOpsJson(
  413. 0,
  414. r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":"1"}},{"insert":"\n"}]"#,
  415. ),
  416. ];
  417. OpTester::new().run_script_with_newline(ops);
  418. }
  419. #[test]
  420. fn attributes_header_insert_double_newline_at_trailing() {
  421. let ops = vec![
  422. Insert(0, "123456", 0),
  423. Header(0, Interval::new(0, 6), 1, true),
  424. Insert(0, "\n", 6),
  425. Insert(0, "\n", 7),
  426. AssertOpsJson(
  427. 0,
  428. r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":"1"}},{"insert":"\n\n"}]"#,
  429. ),
  430. ];
  431. OpTester::new().run_script_with_newline(ops);
  432. }
  433. #[test]
  434. fn attributes_link_added() {
  435. let ops = vec![
  436. Insert(0, "123456", 0),
  437. Link(0, Interval::new(0, 6), "https://appflowy.io", true),
  438. AssertOpsJson(
  439. 0,
  440. r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
  441. ),
  442. ];
  443. OpTester::new().run_script_with_newline(ops);
  444. }
  445. #[test]
  446. fn attributes_link_format_with_bold() {
  447. let ops = vec![
  448. Insert(0, "123456", 0),
  449. Link(0, Interval::new(0, 6), "https://appflowy.io", true),
  450. Bold(0, Interval::new(0, 3), true),
  451. AssertOpsJson(
  452. 0,
  453. r#"[
  454. {"insert":"123","attributes":{"bold":"true","link":"https://appflowy.io"}},
  455. {"insert":"456","attributes":{"link":"https://appflowy.io"}},
  456. {"insert":"\n"}]
  457. "#,
  458. ),
  459. ];
  460. OpTester::new().run_script_with_newline(ops);
  461. }
  462. #[test]
  463. fn attributes_link_insert_char_at_head() {
  464. let ops = vec![
  465. Insert(0, "123456", 0),
  466. Link(0, Interval::new(0, 6), "https://appflowy.io", true),
  467. AssertOpsJson(
  468. 0,
  469. r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
  470. ),
  471. Insert(0, "a", 0),
  472. AssertOpsJson(
  473. 0,
  474. r#"[{"insert":"a"},{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
  475. ),
  476. ];
  477. OpTester::new().run_script_with_newline(ops);
  478. }
  479. #[test]
  480. fn attributes_link_insert_char_at_middle() {
  481. let ops = vec![
  482. Insert(0, "1256", 0),
  483. Link(0, Interval::new(0, 4), "https://appflowy.io", true),
  484. Insert(0, "34", 2),
  485. AssertOpsJson(
  486. 0,
  487. r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
  488. ),
  489. ];
  490. OpTester::new().run_script_with_newline(ops);
  491. }
  492. #[test]
  493. fn attributes_link_insert_char_at_trailing() {
  494. let ops = vec![
  495. Insert(0, "123456", 0),
  496. Link(0, Interval::new(0, 6), "https://appflowy.io", true),
  497. AssertOpsJson(
  498. 0,
  499. r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
  500. ),
  501. Insert(0, "a", 6),
  502. AssertOpsJson(
  503. 0,
  504. r#"[{"insert":"123456","attributes":{"link":"https://appflowy.io"}},{"insert":"a\n"}]"#,
  505. ),
  506. ];
  507. OpTester::new().run_script_with_newline(ops);
  508. }
  509. #[test]
  510. fn attributes_link_insert_newline_at_middle() {
  511. let ops = vec![
  512. Insert(0, "123456", 0),
  513. Link(0, Interval::new(0, 6), "https://appflowy.io", true),
  514. Insert(0, NEW_LINE, 3),
  515. AssertOpsJson(
  516. 0,
  517. r#"[{"insert":"123","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"},{"insert":"456","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
  518. ),
  519. ];
  520. OpTester::new().run_script_with_newline(ops);
  521. }
  522. #[test]
  523. fn attributes_link_auto_format() {
  524. let site = "https://appflowy.io";
  525. let ops = vec![
  526. Insert(0, site, 0),
  527. AssertOpsJson(0, r#"[{"insert":"https://appflowy.io\n"}]"#),
  528. Insert(0, WHITESPACE, site.len()),
  529. AssertOpsJson(
  530. 0,
  531. r#"[{"insert":"https://appflowy.io","attributes":{"link":"https://appflowy.io/"}},{"insert":" \n"}]"#,
  532. ),
  533. ];
  534. OpTester::new().run_script_with_newline(ops);
  535. }
  536. #[test]
  537. fn attributes_link_auto_format_exist() {
  538. let site = "https://appflowy.io";
  539. let ops = vec![
  540. Insert(0, site, 0),
  541. Link(0, Interval::new(0, site.len()), site, true),
  542. Insert(0, WHITESPACE, site.len()),
  543. AssertOpsJson(
  544. 0,
  545. r#"[{"insert":"https://appflowy.io","attributes":{"link":"https://appflowy.io/"}},{"insert":" \n"}]"#,
  546. ),
  547. ];
  548. OpTester::new().run_script_with_newline(ops);
  549. }
  550. #[test]
  551. fn attributes_link_auto_format_exist2() {
  552. let site = "https://appflowy.io";
  553. let ops = vec![
  554. Insert(0, site, 0),
  555. Link(0, Interval::new(0, site.len() / 2), site, true),
  556. Insert(0, WHITESPACE, site.len()),
  557. AssertOpsJson(
  558. 0,
  559. r#"[{"insert":"https://a","attributes":{"link":"https://appflowy.io"}},{"insert":"ppflowy.io \n"}]"#,
  560. ),
  561. ];
  562. OpTester::new().run_script_with_newline(ops);
  563. }
  564. #[test]
  565. fn attributes_bullet_added() {
  566. let ops = vec![
  567. Insert(0, "12", 0),
  568. Bullet(0, Interval::new(0, 1), true),
  569. AssertOpsJson(
  570. 0,
  571. r#"[{"insert":"12"},{"insert":"\n","attributes":{"bullet":"true"}}]"#,
  572. ),
  573. ];
  574. OpTester::new().run_script_with_newline(ops);
  575. }
  576. #[test]
  577. fn attributes_bullet_added_2() {
  578. let ops = vec![
  579. Insert(0, "1", 0),
  580. Bullet(0, Interval::new(0, 1), true),
  581. AssertOpsJson(
  582. 0,
  583. r#"[{"insert":"1"},{"insert":"\n","attributes":{"bullet":"true"}}]"#,
  584. ),
  585. Insert(0, NEW_LINE, 1),
  586. AssertOpsJson(
  587. 0,
  588. r#"[{"insert":"1"},{"insert":"\n\n","attributes":{"bullet":"true"}}]"#,
  589. ),
  590. Insert(0, "2", 2),
  591. AssertOpsJson(
  592. 0,
  593. r#"[{"insert":"1"},{"insert":"\n","attributes":{"bullet":"true"}},{"insert":"2"},{"insert":"\n","attributes":{"bullet":"true"}}]"#,
  594. ),
  595. ];
  596. OpTester::new().run_script_with_newline(ops);
  597. }
  598. #[test]
  599. fn attributes_bullet_remove_partial() {
  600. let ops = vec![
  601. Insert(0, "1", 0),
  602. Bullet(0, Interval::new(0, 1), true),
  603. Insert(0, NEW_LINE, 1),
  604. Insert(0, "2", 2),
  605. Bullet(0, Interval::new(2, 3), false),
  606. AssertOpsJson(
  607. 0,
  608. r#"[{"insert":"1"},{"insert":"\n","attributes":{"bullet":"true"}},{"insert":"2\n"}]"#,
  609. ),
  610. ];
  611. OpTester::new().run_script_with_newline(ops);
  612. }
  613. #[test]
  614. fn attributes_bullet_auto_exit() {
  615. let ops = vec![
  616. Insert(0, "1", 0),
  617. Bullet(0, Interval::new(0, 1), true),
  618. Insert(0, NEW_LINE, 1),
  619. Insert(0, NEW_LINE, 2),
  620. AssertOpsJson(
  621. 0,
  622. r#"[{"insert":"1"},{"insert":"\n","attributes":{"bullet":"true"}},{"insert":"\n"}]"#,
  623. ),
  624. ];
  625. OpTester::new().run_script_with_newline(ops);
  626. }
  627. #[test]
  628. fn attributes_preserve_block_when_insert_newline_inside() {
  629. let ops = vec![
  630. Insert(0, "12", 0),
  631. Bullet(0, Interval::new(0, 2), true),
  632. Insert(0, NEW_LINE, 2),
  633. AssertOpsJson(
  634. 0,
  635. r#"[{"insert":"12"},{"insert":"\n\n","attributes":{"bullet":"true"}}]"#,
  636. ),
  637. Insert(0, "34", 3),
  638. AssertOpsJson(
  639. 0,
  640. r#"[
  641. {"insert":"12"},{"insert":"\n","attributes":{"bullet":"true"}},
  642. {"insert":"34"},{"insert":"\n","attributes":{"bullet":"true"}}
  643. ]"#,
  644. ),
  645. Insert(0, NEW_LINE, 3),
  646. AssertOpsJson(
  647. 0,
  648. r#"[
  649. {"insert":"12"},{"insert":"\n\n","attributes":{"bullet":"true"}},
  650. {"insert":"34"},{"insert":"\n","attributes":{"bullet":"true"}}
  651. ]"#,
  652. ),
  653. Insert(0, "ab", 3),
  654. AssertOpsJson(
  655. 0,
  656. r#"[
  657. {"insert":"12"},{"insert":"\n","attributes":{"bullet":"true"}},
  658. {"insert":"ab"},{"insert":"\n","attributes":{"bullet":"true"}},
  659. {"insert":"34"},{"insert":"\n","attributes":{"bullet":"true"}}
  660. ]"#,
  661. ),
  662. ];
  663. OpTester::new().run_script_with_newline(ops);
  664. }
  665. #[test]
  666. fn attributes_preserve_header_format_on_merge() {
  667. let ops = vec![
  668. Insert(0, "123456", 0),
  669. Header(0, Interval::new(0, 6), 1, true),
  670. Insert(0, NEW_LINE, 3),
  671. AssertOpsJson(
  672. 0,
  673. r#"[{"insert":"123"},{"insert":"\n","attributes":{"header":"1"}},{"insert":"456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  674. ),
  675. Delete(0, Interval::new(3, 4)),
  676. AssertOpsJson(
  677. 0,
  678. r#"[{"insert":"123456"},{"insert":"\n","attributes":{"header":"1"}}]"#,
  679. ),
  680. ];
  681. OpTester::new().run_script_with_newline(ops);
  682. }
  683. #[test]
  684. fn attributes_preserve_list_format_on_merge() {
  685. let ops = vec![
  686. Insert(0, "123456", 0),
  687. Bullet(0, Interval::new(0, 6), true),
  688. Insert(0, NEW_LINE, 3),
  689. AssertOpsJson(
  690. 0,
  691. r#"[{"insert":"123"},{"insert":"\n","attributes":{"bullet":"true"}},{"insert":"456"},{"insert":"\n","attributes":{"bullet":"true"}}]"#,
  692. ),
  693. Delete(0, Interval::new(3, 4)),
  694. AssertOpsJson(
  695. 0,
  696. r#"[{"insert":"123456"},{"insert":"\n","attributes":{"bullet":"true"}}]"#,
  697. ),
  698. ];
  699. OpTester::new().run_script_with_newline(ops);
  700. }