op_test.rs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. pub mod helper;
  2. use crate::helper::TestOp::*;
  3. use bytecount::num_chars;
  4. use flowy_ot::core::*;
  5. use helper::*;
  6. #[test]
  7. fn delta_get_ops_in_interval_1() {
  8. let mut delta = Delta::default();
  9. let insert_a = Builder::insert("123").build();
  10. let insert_b = Builder::insert("4").build();
  11. delta.add(insert_a.clone());
  12. delta.add(insert_b.clone());
  13. let mut iterator = DeltaIter::from_interval(&delta, Interval::new(0, 4));
  14. assert_eq!(iterator.ops(), delta.ops);
  15. }
  16. #[test]
  17. fn delta_get_ops_in_interval_2() {
  18. let mut delta = Delta::default();
  19. let insert_a = Builder::insert("123").build();
  20. let insert_b = Builder::insert("4").build();
  21. let insert_c = Builder::insert("5").build();
  22. let retain_a = Builder::retain(3).build();
  23. delta.add(insert_a.clone());
  24. delta.add(retain_a.clone());
  25. delta.add(insert_b.clone());
  26. delta.add(insert_c.clone());
  27. assert_eq!(
  28. DeltaIter::from_interval(&delta, Interval::new(0, 2)).ops(),
  29. vec![Builder::insert("12").build()]
  30. );
  31. assert_eq!(
  32. DeltaIter::from_interval(&delta, Interval::new(1, 3)).ops(),
  33. vec![Builder::insert("23").build()]
  34. );
  35. assert_eq!(
  36. DeltaIter::from_interval(&delta, Interval::new(0, 3)).ops(),
  37. vec![insert_a.clone()]
  38. );
  39. assert_eq!(
  40. DeltaIter::from_interval(&delta, Interval::new(0, 4)).ops(),
  41. vec![insert_a.clone(), Builder::retain(1).build()]
  42. );
  43. assert_eq!(
  44. DeltaIter::from_interval(&delta, Interval::new(0, 6)).ops(),
  45. vec![insert_a.clone(), retain_a.clone()]
  46. );
  47. assert_eq!(
  48. DeltaIter::from_interval(&delta, Interval::new(0, 7)).ops(),
  49. vec![insert_a.clone(), retain_a.clone(), insert_b.clone()]
  50. );
  51. }
  52. #[test]
  53. fn delta_get_ops_in_interval_3() {
  54. let mut delta = Delta::default();
  55. let insert_a = Builder::insert("123456").build();
  56. delta.add(insert_a.clone());
  57. assert_eq!(
  58. DeltaIter::from_interval(&delta, Interval::new(3, 5)).ops(),
  59. vec![Builder::insert("45").build()]
  60. );
  61. }
  62. #[test]
  63. fn delta_get_ops_in_interval_4() {
  64. let mut delta = Delta::default();
  65. let insert_a = Builder::insert("12").build();
  66. let insert_b = Builder::insert("34").build();
  67. let insert_c = Builder::insert("56").build();
  68. delta.ops.push(insert_a.clone());
  69. delta.ops.push(insert_b.clone());
  70. delta.ops.push(insert_c.clone());
  71. assert_eq!(
  72. DeltaIter::from_interval(&delta, Interval::new(0, 2)).ops(),
  73. vec![insert_a]
  74. );
  75. assert_eq!(
  76. DeltaIter::from_interval(&delta, Interval::new(2, 4)).ops(),
  77. vec![insert_b]
  78. );
  79. assert_eq!(
  80. DeltaIter::from_interval(&delta, Interval::new(4, 6)).ops(),
  81. vec![insert_c]
  82. );
  83. assert_eq!(
  84. DeltaIter::from_interval(&delta, Interval::new(2, 5)).ops(),
  85. vec![Builder::insert("34").build(), Builder::insert("5").build()]
  86. );
  87. }
  88. #[test]
  89. fn delta_get_ops_in_interval_5() {
  90. let mut delta = Delta::default();
  91. let insert_a = Builder::insert("123456").build();
  92. let insert_b = Builder::insert("789").build();
  93. delta.ops.push(insert_a.clone());
  94. delta.ops.push(insert_b.clone());
  95. assert_eq!(
  96. DeltaIter::from_interval(&delta, Interval::new(4, 8)).ops(),
  97. vec![Builder::insert("56").build(), Builder::insert("78").build()]
  98. );
  99. // assert_eq!(
  100. // DeltaIter::from_interval(&delta, Interval::new(8, 9)).ops(),
  101. // vec![Builder::insert("9").build()]
  102. // );
  103. }
  104. #[test]
  105. fn delta_get_ops_in_interval_6() {
  106. let mut delta = Delta::default();
  107. let insert_a = Builder::insert("12345678").build();
  108. delta.add(insert_a.clone());
  109. assert_eq!(
  110. DeltaIter::from_interval(&delta, Interval::new(4, 6)).ops(),
  111. vec![Builder::insert("56").build()]
  112. );
  113. }
  114. #[test]
  115. fn delta_get_ops_in_interval_7() {
  116. let mut delta = Delta::default();
  117. let insert_a = Builder::insert("12345").build();
  118. let retain_a = Builder::retain(3).build();
  119. delta.add(insert_a.clone());
  120. delta.add(retain_a.clone());
  121. let mut iter_1 = DeltaIter::new(&delta);
  122. iter_1.seek::<CharMetric>(2).unwrap();
  123. assert_eq!(iter_1.next_op().unwrap(), Builder::insert("345").build());
  124. assert_eq!(iter_1.next_op().unwrap(), Builder::retain(3).build());
  125. let mut iter_2 = DeltaIter::new(&delta);
  126. assert_eq!(
  127. iter_2.next_op_with_len(2).unwrap(),
  128. Builder::insert("12").build()
  129. );
  130. assert_eq!(iter_2.next_op().unwrap(), Builder::insert("345").build());
  131. assert_eq!(iter_2.next_op().unwrap(), Builder::retain(3).build());
  132. }
  133. #[test]
  134. fn delta_seek_1() {
  135. let mut delta = Delta::default();
  136. let insert_a = Builder::insert("12345").build();
  137. let retain_a = Builder::retain(3).build();
  138. delta.add(insert_a.clone());
  139. delta.add(retain_a.clone());
  140. let mut iter = DeltaIter::new(&delta);
  141. iter.seek::<OpMetric>(1).unwrap();
  142. assert_eq!(iter.next_op().unwrap(), Builder::retain(3).build());
  143. }
  144. #[test]
  145. fn delta_seek_2() {
  146. let mut delta = Delta::default();
  147. delta.add(Builder::insert("12345").build());
  148. let mut iter = DeltaIter::new(&delta);
  149. assert_eq!(
  150. iter.next_op_with_len(1).unwrap(),
  151. Builder::insert("1").build()
  152. );
  153. }
  154. #[test]
  155. fn delta_seek_3() {
  156. let mut delta = Delta::default();
  157. delta.add(Builder::insert("12345").build());
  158. let mut iter = DeltaIter::new(&delta);
  159. assert_eq!(
  160. iter.next_op_with_len(2).unwrap(),
  161. Builder::insert("12").build()
  162. );
  163. assert_eq!(
  164. iter.next_op_with_len(2).unwrap(),
  165. Builder::insert("34").build()
  166. );
  167. assert_eq!(
  168. iter.next_op_with_len(2).unwrap(),
  169. Builder::insert("5").build()
  170. );
  171. assert_eq!(iter.next_op_with_len(1), None);
  172. }
  173. #[test]
  174. fn delta_seek_4() {
  175. let mut delta = Delta::default();
  176. delta.add(Builder::insert("12345").build());
  177. let mut iter = DeltaIter::new(&delta);
  178. iter.seek::<CharMetric>(3);
  179. assert_eq!(
  180. iter.next_op_with_len(2).unwrap(),
  181. Builder::insert("45").build()
  182. );
  183. }
  184. #[test]
  185. fn delta_next_op_len_test() {
  186. let mut delta = Delta::default();
  187. delta.add(Builder::insert("12345").build());
  188. let mut iter = DeltaIter::new(&delta);
  189. iter.seek::<CharMetric>(3);
  190. assert_eq!(iter.next_op_len(), 2);
  191. assert_eq!(
  192. iter.next_op_with_len(1).unwrap(),
  193. Builder::insert("4").build()
  194. );
  195. assert_eq!(iter.next_op_len(), 1);
  196. assert_eq!(iter.next_op().unwrap(), Builder::insert("5").build());
  197. }
  198. #[test]
  199. fn lengths() {
  200. let mut delta = Delta::default();
  201. assert_eq!(delta.base_len, 0);
  202. assert_eq!(delta.target_len, 0);
  203. delta.retain(5, Attributes::default());
  204. assert_eq!(delta.base_len, 5);
  205. assert_eq!(delta.target_len, 5);
  206. delta.insert("abc", Attributes::default());
  207. assert_eq!(delta.base_len, 5);
  208. assert_eq!(delta.target_len, 8);
  209. delta.retain(2, Attributes::default());
  210. assert_eq!(delta.base_len, 7);
  211. assert_eq!(delta.target_len, 10);
  212. delta.delete(2);
  213. assert_eq!(delta.base_len, 9);
  214. assert_eq!(delta.target_len, 10);
  215. }
  216. #[test]
  217. fn sequence() {
  218. let mut delta = Delta::default();
  219. delta.retain(5, Attributes::default());
  220. delta.retain(0, Attributes::default());
  221. delta.insert("appflowy", Attributes::default());
  222. delta.insert("", Attributes::default());
  223. delta.delete(3);
  224. delta.delete(0);
  225. assert_eq!(delta.ops.len(), 3);
  226. }
  227. #[test]
  228. fn apply_1000() {
  229. for _ in 0..1000 {
  230. let mut rng = Rng::default();
  231. let s = rng.gen_string(50);
  232. let delta = rng.gen_delta(&s);
  233. assert_eq!(num_chars(s.as_bytes()), delta.base_len);
  234. assert_eq!(delta.apply(&s).unwrap().chars().count(), delta.target_len);
  235. }
  236. }
  237. #[test]
  238. fn apply() {
  239. let s = "hello world,".to_owned();
  240. let mut delta_a = Delta::default();
  241. delta_a.insert(&s, Attributes::default());
  242. let mut delta_b = Delta::default();
  243. delta_b.retain(s.len(), Attributes::default());
  244. delta_b.insert("appflowy", Attributes::default());
  245. let after_a = delta_a.apply("").unwrap();
  246. let after_b = delta_b.apply(&after_a).unwrap();
  247. assert_eq!("hello world,appflowy", &after_b);
  248. }
  249. #[test]
  250. fn base_len_test() {
  251. let mut delta_a = Delta::default();
  252. delta_a.insert("a", Attributes::default());
  253. delta_a.insert("b", Attributes::default());
  254. delta_a.insert("c", Attributes::default());
  255. let s = "hello world,".to_owned();
  256. delta_a.delete(s.len());
  257. let after_a = delta_a.apply(&s).unwrap();
  258. delta_a.insert("d", Attributes::default());
  259. assert_eq!("abc", &after_a);
  260. }
  261. #[test]
  262. fn invert() {
  263. for _ in 0..1000 {
  264. let mut rng = Rng::default();
  265. let s = rng.gen_string(50);
  266. let delta_a = rng.gen_delta(&s);
  267. let delta_b = delta_a.invert_str(&s);
  268. assert_eq!(delta_a.base_len, delta_b.target_len);
  269. assert_eq!(delta_a.target_len, delta_b.base_len);
  270. assert_eq!(delta_b.apply(&delta_a.apply(&s).unwrap()).unwrap(), s);
  271. }
  272. }
  273. #[test]
  274. fn empty_ops() {
  275. let mut delta = Delta::default();
  276. delta.retain(0, Attributes::default());
  277. delta.insert("", Attributes::default());
  278. delta.delete(0);
  279. assert_eq!(delta.ops.len(), 0);
  280. }
  281. #[test]
  282. fn eq() {
  283. let mut delta_a = Delta::default();
  284. delta_a.delete(1);
  285. delta_a.insert("lo", Attributes::default());
  286. delta_a.retain(2, Attributes::default());
  287. delta_a.retain(3, Attributes::default());
  288. let mut delta_b = Delta::default();
  289. delta_b.delete(1);
  290. delta_b.insert("l", Attributes::default());
  291. delta_b.insert("o", Attributes::default());
  292. delta_b.retain(5, Attributes::default());
  293. assert_eq!(delta_a, delta_b);
  294. delta_a.delete(1);
  295. delta_b.retain(1, Attributes::default());
  296. assert_ne!(delta_a, delta_b);
  297. }
  298. #[test]
  299. fn ops_merging() {
  300. let mut delta = Delta::default();
  301. assert_eq!(delta.ops.len(), 0);
  302. delta.retain(2, Attributes::default());
  303. assert_eq!(delta.ops.len(), 1);
  304. assert_eq!(delta.ops.last(), Some(&Builder::retain(2).build()));
  305. delta.retain(3, Attributes::default());
  306. assert_eq!(delta.ops.len(), 1);
  307. assert_eq!(delta.ops.last(), Some(&Builder::retain(5).build()));
  308. delta.insert("abc", Attributes::default());
  309. assert_eq!(delta.ops.len(), 2);
  310. assert_eq!(delta.ops.last(), Some(&Builder::insert("abc").build()));
  311. delta.insert("xyz", Attributes::default());
  312. assert_eq!(delta.ops.len(), 2);
  313. assert_eq!(delta.ops.last(), Some(&Builder::insert("abcxyz").build()));
  314. delta.delete(1);
  315. assert_eq!(delta.ops.len(), 3);
  316. assert_eq!(delta.ops.last(), Some(&Builder::delete(1).build()));
  317. delta.delete(1);
  318. assert_eq!(delta.ops.len(), 3);
  319. assert_eq!(delta.ops.last(), Some(&Builder::delete(2).build()));
  320. }
  321. #[test]
  322. fn is_noop() {
  323. let mut delta = Delta::default();
  324. assert!(delta.is_noop());
  325. delta.retain(5, Attributes::default());
  326. assert!(delta.is_noop());
  327. delta.retain(3, Attributes::default());
  328. assert!(delta.is_noop());
  329. delta.insert("lorem", Attributes::default());
  330. assert!(!delta.is_noop());
  331. }
  332. #[test]
  333. fn compose() {
  334. for _ in 0..1000 {
  335. let mut rng = Rng::default();
  336. let s = rng.gen_string(20);
  337. let a = rng.gen_delta(&s);
  338. let after_a = a.apply(&s).unwrap();
  339. assert_eq!(a.target_len, num_chars(after_a.as_bytes()));
  340. let b = rng.gen_delta(&after_a);
  341. let after_b = b.apply(&after_a).unwrap();
  342. assert_eq!(b.target_len, num_chars(after_b.as_bytes()));
  343. let ab = a.compose(&b).unwrap();
  344. assert_eq!(ab.target_len, b.target_len);
  345. let after_ab = ab.apply(&s).unwrap();
  346. assert_eq!(after_b, after_ab);
  347. }
  348. }
  349. #[test]
  350. fn transform() {
  351. for _ in 0..1000 {
  352. let mut rng = Rng::default();
  353. let s = rng.gen_string(20);
  354. let a = rng.gen_delta(&s);
  355. let b = rng.gen_delta(&s);
  356. let (a_prime, b_prime) = a.transform(&b).unwrap();
  357. let ab_prime = a.compose(&b_prime).unwrap();
  358. let ba_prime = b.compose(&a_prime).unwrap();
  359. assert_eq!(ab_prime, ba_prime);
  360. let after_ab_prime = ab_prime.apply(&s).unwrap();
  361. let after_ba_prime = ba_prime.apply(&s).unwrap();
  362. assert_eq!(after_ab_prime, after_ba_prime);
  363. }
  364. }
  365. #[test]
  366. fn transform2() {
  367. let ops = vec![
  368. Insert(0, "123", 0),
  369. Insert(1, "456", 0),
  370. Transform(0, 1),
  371. AssertOpsJson(0, r#"[{"insert":"123456"}]"#),
  372. AssertOpsJson(1, r#"[{"insert":"123456"}]"#),
  373. ];
  374. OpTester::new().run_script(ops);
  375. }
  376. #[test]
  377. fn delta_transform_test() {
  378. let mut a = Delta::default();
  379. let mut a_s = String::new();
  380. a.insert("123", AttrsBuilder::new().bold(true).build());
  381. a_s = a.apply(&a_s).unwrap();
  382. assert_eq!(&a_s, "123");
  383. let mut b = Delta::default();
  384. let mut b_s = String::new();
  385. b.insert("456", Attributes::default());
  386. b_s = b.apply(&b_s).unwrap();
  387. assert_eq!(&b_s, "456");
  388. let (a_prime, b_prime) = a.transform(&b).unwrap();
  389. assert_eq!(
  390. r#"[{"insert":"123","attributes":{"bold":"true"}},{"retain":3}]"#,
  391. serde_json::to_string(&a_prime).unwrap()
  392. );
  393. assert_eq!(
  394. r#"[{"retain":3,"attributes":{"bold":"true"}},{"insert":"456"}]"#,
  395. serde_json::to_string(&b_prime).unwrap()
  396. );
  397. }
  398. #[test]
  399. fn delta_invert_no_attribute_delta() {
  400. let mut delta = Delta::default();
  401. delta.add(Builder::insert("123").build());
  402. let mut change = Delta::default();
  403. change.add(Builder::retain(3).build());
  404. change.add(Builder::insert("456").build());
  405. let undo = change.invert(&delta);
  406. let new_delta = delta.compose(&change).unwrap();
  407. let delta_after_undo = new_delta.compose(&undo).unwrap();
  408. assert_eq!(delta_after_undo, delta);
  409. }
  410. #[test]
  411. fn delta_invert_no_attribute_delta2() {
  412. let ops = vec![
  413. Insert(0, "123", 0),
  414. Insert(1, "4567", 0),
  415. Invert(0, 1),
  416. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  417. ];
  418. OpTester::new().run_script(ops);
  419. }
  420. #[test]
  421. fn delta_invert_attribute_delta_with_no_attribute_delta() {
  422. let ops = vec![
  423. Insert(0, "123", 0),
  424. Bold(0, Interval::new(0, 3), true),
  425. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  426. Insert(1, "4567", 0),
  427. Invert(0, 1),
  428. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  429. ];
  430. OpTester::new().run_script(ops);
  431. }
  432. #[test]
  433. fn delta_invert_attribute_delta_with_no_attribute_delta2() {
  434. let ops = vec![
  435. Insert(0, "123", 0),
  436. Bold(0, Interval::new(0, 3), true),
  437. Insert(0, "456", 3),
  438. AssertOpsJson(
  439. 0,
  440. r#"[
  441. {"insert":"123456","attributes":{"bold":"true"}}]
  442. "#,
  443. ),
  444. Italic(0, Interval::new(2, 4), true),
  445. AssertOpsJson(
  446. 0,
  447. r#"[
  448. {"insert":"12","attributes":{"bold":"true"}},
  449. {"insert":"34","attributes":{"bold":"true","italic":"true"}},
  450. {"insert":"56","attributes":{"bold":"true"}}
  451. ]"#,
  452. ),
  453. Insert(1, "abc", 0),
  454. Invert(0, 1),
  455. AssertOpsJson(
  456. 0,
  457. r#"[
  458. {"insert":"12","attributes":{"bold":"true"}},
  459. {"insert":"34","attributes":{"bold":"true","italic":"true"}},
  460. {"insert":"56","attributes":{"bold":"true"}}
  461. ]"#,
  462. ),
  463. ];
  464. OpTester::new().run_script(ops);
  465. }
  466. #[test]
  467. fn delta_invert_no_attribute_delta_with_attribute_delta() {
  468. let ops = vec![
  469. Insert(0, "123", 0),
  470. Insert(1, "4567", 0),
  471. Bold(1, Interval::new(0, 3), true),
  472. AssertOpsJson(
  473. 1,
  474. r#"[{"insert":"456","attributes":{"bold":"true"}},{"insert":"7"}]"#,
  475. ),
  476. Invert(0, 1),
  477. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  478. ];
  479. OpTester::new().run_script(ops);
  480. }
  481. #[test]
  482. fn delta_invert_no_attribute_delta_with_attribute_delta2() {
  483. let ops = vec![
  484. Insert(0, "123", 0),
  485. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  486. Insert(1, "abc", 0),
  487. Bold(1, Interval::new(0, 3), true),
  488. Insert(1, "d", 3),
  489. Italic(1, Interval::new(1, 3), true),
  490. AssertOpsJson(
  491. 1,
  492. r#"[{"insert":"a","attributes":{"bold":"true"}},{"insert":"bc","attributes":
  493. {"bold":"true","italic":"true"}},{"insert":"d","attributes":{"bold":"true"
  494. }}]"#,
  495. ),
  496. Invert(0, 1),
  497. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  498. ];
  499. OpTester::new().run_script(ops);
  500. }
  501. #[test]
  502. fn delta_invert_attribute_delta_with_attribute_delta() {
  503. let ops = vec![
  504. Insert(0, "123", 0),
  505. Bold(0, Interval::new(0, 3), true),
  506. Insert(0, "456", 3),
  507. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  508. Italic(0, Interval::new(2, 4), true),
  509. AssertOpsJson(
  510. 0,
  511. r#"[
  512. {"insert":"12","attributes":{"bold":"true"}},
  513. {"insert":"34","attributes":{"bold":"true","italic":"true"}},
  514. {"insert":"56","attributes":{"bold":"true"}}
  515. ]"#,
  516. ),
  517. Insert(1, "abc", 0),
  518. Bold(1, Interval::new(0, 3), true),
  519. Insert(1, "d", 3),
  520. Italic(1, Interval::new(1, 3), true),
  521. AssertOpsJson(
  522. 1,
  523. r#"[
  524. {"insert":"a","attributes":{"bold":"true"}},
  525. {"insert":"bc","attributes":{"bold":"true","italic":"true"}},
  526. {"insert":"d","attributes":{"bold":"true"}}
  527. ]"#,
  528. ),
  529. Invert(0, 1),
  530. AssertOpsJson(
  531. 0,
  532. r#"[
  533. {"insert":"12","attributes":{"bold":"true"}},
  534. {"insert":"34","attributes":{"bold":"true","italic":"true"}},
  535. {"insert":"56","attributes":{"bold":"true"}}
  536. ]"#,
  537. ),
  538. ];
  539. OpTester::new().run_script(ops);
  540. }