undo_redo_test.rs 10 KB

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