undo_redo_test.rs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. use crate::editor::{TestBuilder, TestOp::*};
  2. use flowy_client_sync::client_document::{EmptyDocument, NewlineDocument, RECORD_THRESHOLD};
  3. use lib_ot::core::{Interval, NEW_LINE, WHITESPACE};
  4. #[test]
  5. fn history_insert_undo() {
  6. let ops = vec![
  7. Insert(0, "123", 0),
  8. Undo(0),
  9. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  10. ];
  11. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  12. }
  13. #[test]
  14. fn history_insert_undo_with_lagging() {
  15. let ops = vec![
  16. Insert(0, "123", 0),
  17. Wait(RECORD_THRESHOLD),
  18. Insert(0, "456", 0),
  19. Undo(0),
  20. AssertDocJson(0, r#"[{"insert":"123\n"}]"#),
  21. Undo(0),
  22. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  23. ];
  24. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  25. }
  26. #[test]
  27. fn history_insert_redo() {
  28. let ops = vec![
  29. Insert(0, "123", 0),
  30. AssertDocJson(0, r#"[{"insert":"123\n"}]"#),
  31. Undo(0),
  32. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  33. Redo(0),
  34. AssertDocJson(0, r#"[{"insert":"123\n"}]"#),
  35. ];
  36. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  37. }
  38. #[test]
  39. fn history_insert_redo_with_lagging() {
  40. let ops = vec![
  41. Insert(0, "123", 0),
  42. Wait(RECORD_THRESHOLD),
  43. Insert(0, "456", 3),
  44. Wait(RECORD_THRESHOLD),
  45. AssertStr(0, "123456\n"),
  46. AssertDocJson(0, r#"[{"insert":"123456\n"}]"#),
  47. Undo(0),
  48. AssertDocJson(0, r#"[{"insert":"123\n"}]"#),
  49. Redo(0),
  50. AssertDocJson(0, r#"[{"insert":"123456\n"}]"#),
  51. Undo(0),
  52. AssertDocJson(0, r#"[{"insert":"123\n"}]"#),
  53. ];
  54. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  55. }
  56. #[test]
  57. fn history_bold_undo() {
  58. let ops = vec![
  59. Insert(0, "123", 0),
  60. Bold(0, Interval::new(0, 3), true),
  61. Undo(0),
  62. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  63. ];
  64. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  65. }
  66. #[test]
  67. fn history_bold_undo_with_lagging() {
  68. let ops = vec![
  69. Insert(0, "123", 0),
  70. Wait(RECORD_THRESHOLD),
  71. Bold(0, Interval::new(0, 3), true),
  72. Undo(0),
  73. AssertDocJson(0, r#"[{"insert":"123\n"}]"#),
  74. ];
  75. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  76. }
  77. #[test]
  78. fn history_bold_redo() {
  79. let ops = vec![
  80. Insert(0, "123", 0),
  81. Bold(0, Interval::new(0, 3), true),
  82. Undo(0),
  83. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  84. Redo(0),
  85. AssertDocJson(
  86. 0,
  87. r#" [{"insert":"123","attributes":{"bold":true}},{"insert":"\n"}]"#,
  88. ),
  89. ];
  90. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  91. }
  92. #[test]
  93. fn history_bold_redo_with_lagging() {
  94. let ops = vec![
  95. Insert(0, "123", 0),
  96. Wait(RECORD_THRESHOLD),
  97. Bold(0, Interval::new(0, 3), true),
  98. Undo(0),
  99. AssertDocJson(0, r#"[{"insert":"123\n"}]"#),
  100. Redo(0),
  101. AssertDocJson(
  102. 0,
  103. r#"[{"insert":"123","attributes":{"bold":true}},{"insert":"\n"}]"#,
  104. ),
  105. ];
  106. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  107. }
  108. #[test]
  109. fn history_delete_undo() {
  110. let ops = vec![
  111. Insert(0, "123", 0),
  112. Wait(RECORD_THRESHOLD),
  113. AssertDocJson(0, r#"[{"insert":"123"}]"#),
  114. Delete(0, Interval::new(0, 3)),
  115. AssertDocJson(0, r#"[]"#),
  116. Undo(0),
  117. AssertDocJson(0, r#"[{"insert":"123"}]"#),
  118. ];
  119. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  120. }
  121. #[test]
  122. fn history_delete_undo_2() {
  123. let ops = vec![
  124. Insert(0, "123", 0),
  125. Bold(0, Interval::new(0, 3), true),
  126. Delete(0, Interval::new(0, 1)),
  127. AssertDocJson(
  128. 0,
  129. r#"[
  130. {"insert":"23","attributes":{"bold":true}},
  131. {"insert":"\n"}]
  132. "#,
  133. ),
  134. Undo(0),
  135. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  136. ];
  137. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  138. }
  139. #[test]
  140. fn history_delete_undo_with_lagging() {
  141. let ops = vec![
  142. Insert(0, "123", 0),
  143. Wait(RECORD_THRESHOLD),
  144. Bold(0, Interval::new(0, 3), true),
  145. Wait(RECORD_THRESHOLD),
  146. Delete(0, Interval::new(0, 1)),
  147. AssertDocJson(
  148. 0,
  149. r#"[
  150. {"insert":"23","attributes":{"bold":true}},
  151. {"insert":"\n"}]
  152. "#,
  153. ),
  154. Undo(0),
  155. AssertDocJson(
  156. 0,
  157. r#"[
  158. {"insert":"123","attributes":{"bold":true}},
  159. {"insert":"\n"}]
  160. "#,
  161. ),
  162. ];
  163. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  164. }
  165. #[test]
  166. fn history_delete_redo() {
  167. let ops = vec![
  168. Insert(0, "123", 0),
  169. Wait(RECORD_THRESHOLD),
  170. Delete(0, Interval::new(0, 3)),
  171. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  172. Undo(0),
  173. Redo(0),
  174. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  175. ];
  176. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  177. }
  178. #[test]
  179. fn history_replace_undo() {
  180. let ops = vec![
  181. Insert(0, "123", 0),
  182. Bold(0, Interval::new(0, 3), true),
  183. Replace(0, Interval::new(0, 2), "ab"),
  184. AssertDocJson(
  185. 0,
  186. r#"[
  187. {"insert":"ab"},
  188. {"insert":"3","attributes":{"bold":true}},{"insert":"\n"}]
  189. "#,
  190. ),
  191. Undo(0),
  192. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  193. ];
  194. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  195. }
  196. #[test]
  197. fn history_replace_undo_with_lagging() {
  198. let ops = vec![
  199. Insert(0, "123", 0),
  200. Wait(RECORD_THRESHOLD),
  201. Bold(0, Interval::new(0, 3), true),
  202. Wait(RECORD_THRESHOLD),
  203. Replace(0, Interval::new(0, 2), "ab"),
  204. AssertDocJson(
  205. 0,
  206. r#"[
  207. {"insert":"ab"},
  208. {"insert":"3","attributes":{"bold":true}},{"insert":"\n"}]
  209. "#,
  210. ),
  211. Undo(0),
  212. AssertDocJson(
  213. 0,
  214. r#"[{"insert":"123","attributes":{"bold":true}},{"insert":"\n"}]"#,
  215. ),
  216. ];
  217. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  218. }
  219. #[test]
  220. fn history_replace_redo() {
  221. let ops = vec![
  222. Insert(0, "123", 0),
  223. Bold(0, Interval::new(0, 3), true),
  224. Replace(0, Interval::new(0, 2), "ab"),
  225. Undo(0),
  226. Redo(0),
  227. AssertDocJson(
  228. 0,
  229. r#"[
  230. {"insert":"ab"},
  231. {"insert":"3","attributes":{"bold":true}},{"insert":"\n"}]
  232. "#,
  233. ),
  234. ];
  235. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  236. }
  237. #[test]
  238. fn history_header_added_undo() {
  239. let ops = vec![
  240. Insert(0, "123456", 0),
  241. Header(0, Interval::new(0, 6), 1),
  242. Insert(0, "\n", 3),
  243. Insert(0, "\n", 4),
  244. Undo(0),
  245. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  246. Redo(0),
  247. AssertDocJson(
  248. 0,
  249. r#"[{"insert":"123"},{"insert":"\n\n","attributes":{"header":1}},{"insert":"456"},{"insert":"\n","attributes":{"header":1}}]"#,
  250. ),
  251. ];
  252. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  253. }
  254. #[test]
  255. fn history_link_added_undo() {
  256. let site = "https://appflowy.io";
  257. let ops = vec![
  258. Insert(0, site, 0),
  259. Wait(RECORD_THRESHOLD),
  260. Link(0, Interval::new(0, site.len()), site),
  261. Undo(0),
  262. AssertDocJson(0, r#"[{"insert":"https://appflowy.io\n"}]"#),
  263. Redo(0),
  264. AssertDocJson(
  265. 0,
  266. r#"[{"insert":"https://appflowy.io","attributes":{"link":"https://appflowy.io"}},{"insert":"\n"}]"#,
  267. ),
  268. ];
  269. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  270. }
  271. #[test]
  272. fn history_link_auto_format_undo_with_lagging() {
  273. let site = "https://appflowy.io";
  274. let ops = vec![
  275. Insert(0, site, 0),
  276. AssertDocJson(0, r#"[{"insert":"https://appflowy.io\n"}]"#),
  277. Wait(RECORD_THRESHOLD),
  278. Insert(0, WHITESPACE, site.len()),
  279. AssertDocJson(
  280. 0,
  281. r#"[{"insert":"https://appflowy.io","attributes":{"link":"https://appflowy.io/"}},{"insert":" \n"}]"#,
  282. ),
  283. Undo(0),
  284. AssertDocJson(0, r#"[{"insert":"https://appflowy.io\n"}]"#),
  285. ];
  286. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  287. }
  288. #[test]
  289. fn history_bullet_undo() {
  290. let ops = vec![
  291. Insert(0, "1", 0),
  292. Bullet(0, Interval::new(0, 1), true),
  293. Insert(0, NEW_LINE, 1),
  294. Insert(0, "2", 2),
  295. AssertDocJson(
  296. 0,
  297. r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"2"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
  298. ),
  299. Undo(0),
  300. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  301. Redo(0),
  302. AssertDocJson(
  303. 0,
  304. r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"2"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
  305. ),
  306. ];
  307. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  308. }
  309. #[test]
  310. fn history_bullet_undo_with_lagging() {
  311. let ops = vec![
  312. Insert(0, "1", 0),
  313. Bullet(0, Interval::new(0, 1), true),
  314. Wait(RECORD_THRESHOLD),
  315. Insert(0, NEW_LINE, 1),
  316. Insert(0, "2", 2),
  317. Wait(RECORD_THRESHOLD),
  318. AssertDocJson(
  319. 0,
  320. r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"2"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
  321. ),
  322. Undo(0),
  323. AssertDocJson(
  324. 0,
  325. r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
  326. ),
  327. Undo(0),
  328. AssertDocJson(0, r#"[{"insert":"\n"}]"#),
  329. Redo(0),
  330. Redo(0),
  331. AssertDocJson(
  332. 0,
  333. r#"[{"insert":"1"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"2"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
  334. ),
  335. ];
  336. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  337. }
  338. #[test]
  339. fn history_undo_attribute_on_merge_between_line() {
  340. let ops = vec![
  341. Insert(0, "123456", 0),
  342. Bullet(0, Interval::new(0, 6), true),
  343. Wait(RECORD_THRESHOLD),
  344. Insert(0, NEW_LINE, 3),
  345. Wait(RECORD_THRESHOLD),
  346. AssertDocJson(
  347. 0,
  348. r#"[{"insert":"123"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"456"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
  349. ),
  350. Delete(0, Interval::new(3, 4)), // delete the newline
  351. AssertDocJson(
  352. 0,
  353. r#"[{"insert":"123456"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
  354. ),
  355. Undo(0),
  356. AssertDocJson(
  357. 0,
  358. r#"[{"insert":"123"},{"insert":"\n","attributes":{"list":"bullet"}},{"insert":"456"},{"insert":"\n","attributes":{"list":"bullet"}}]"#,
  359. ),
  360. ];
  361. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  362. }