op_test.rs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. #![allow(clippy::all)]
  2. use crate::editor::{Rng, TestBuilder, TestOp::*};
  3. use flowy_client_sync::client_document::{EmptyDocument, NewlineDocument};
  4. use lib_ot::text_delta::DeltaTextOperationBuilder;
  5. use lib_ot::{core::Interval, core::*, text_delta::DeltaTextOperations};
  6. #[test]
  7. fn attributes_insert_text() {
  8. let ops = vec![
  9. Insert(0, "123", 0),
  10. Insert(0, "456", 3),
  11. AssertDocJson(0, r#"[{"insert":"123456"}]"#),
  12. ];
  13. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  14. }
  15. #[test]
  16. fn attributes_insert_text_at_head() {
  17. let ops = vec![
  18. Insert(0, "123", 0),
  19. Insert(0, "456", 0),
  20. AssertDocJson(0, r#"[{"insert":"456123"}]"#),
  21. ];
  22. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  23. }
  24. #[test]
  25. fn attributes_insert_text_at_middle() {
  26. let ops = vec![
  27. Insert(0, "123", 0),
  28. Insert(0, "456", 1),
  29. AssertDocJson(0, r#"[{"insert":"145623"}]"#),
  30. ];
  31. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  32. }
  33. #[test]
  34. fn delta_get_ops_in_interval_1() {
  35. let delta = DeltaTextOperationBuilder::new()
  36. .insert("123")
  37. .insert("4")
  38. .build();
  39. let mut iterator = OperationIterator::from_interval(&delta, Interval::new(0, 4));
  40. assert_eq!(iterator.ops(), delta.ops);
  41. }
  42. #[test]
  43. fn delta_get_ops_in_interval_2() {
  44. let mut delta = DeltaTextOperations::default();
  45. let insert_a = DeltaOperation::insert("123");
  46. let insert_b = DeltaOperation::insert("4");
  47. let insert_c = DeltaOperation::insert("5");
  48. let retain_a = DeltaOperation::retain(3);
  49. delta.add(insert_a.clone());
  50. delta.add(retain_a.clone());
  51. delta.add(insert_b.clone());
  52. delta.add(insert_c.clone());
  53. assert_eq!(
  54. OperationIterator::from_interval(&delta, Interval::new(0, 2)).ops(),
  55. vec![DeltaOperation::insert("12")]
  56. );
  57. assert_eq!(
  58. OperationIterator::from_interval(&delta, Interval::new(1, 3)).ops(),
  59. vec![DeltaOperation::insert("23")]
  60. );
  61. assert_eq!(
  62. OperationIterator::from_interval(&delta, Interval::new(0, 3)).ops(),
  63. vec![insert_a.clone()]
  64. );
  65. assert_eq!(
  66. OperationIterator::from_interval(&delta, Interval::new(0, 4)).ops(),
  67. vec![insert_a.clone(), DeltaOperation::retain(1)]
  68. );
  69. assert_eq!(
  70. OperationIterator::from_interval(&delta, Interval::new(0, 6)).ops(),
  71. vec![insert_a.clone(), retain_a.clone()]
  72. );
  73. assert_eq!(
  74. OperationIterator::from_interval(&delta, Interval::new(0, 7)).ops(),
  75. vec![insert_a.clone(), retain_a.clone(), insert_b.clone()]
  76. );
  77. }
  78. #[test]
  79. fn delta_get_ops_in_interval_3() {
  80. let mut delta = DeltaTextOperations::default();
  81. let insert_a = DeltaOperation::insert("123456");
  82. delta.add(insert_a.clone());
  83. assert_eq!(
  84. OperationIterator::from_interval(&delta, Interval::new(3, 5)).ops(),
  85. vec![DeltaOperation::insert("45")]
  86. );
  87. }
  88. #[test]
  89. fn delta_get_ops_in_interval_4() {
  90. let mut delta = DeltaTextOperations::default();
  91. let insert_a = DeltaOperation::insert("12");
  92. let insert_b = DeltaOperation::insert("34");
  93. let insert_c = DeltaOperation::insert("56");
  94. delta.ops.push(insert_a.clone());
  95. delta.ops.push(insert_b.clone());
  96. delta.ops.push(insert_c.clone());
  97. assert_eq!(
  98. OperationIterator::from_interval(&delta, Interval::new(0, 2)).ops(),
  99. vec![insert_a]
  100. );
  101. assert_eq!(
  102. OperationIterator::from_interval(&delta, Interval::new(2, 4)).ops(),
  103. vec![insert_b]
  104. );
  105. assert_eq!(
  106. OperationIterator::from_interval(&delta, Interval::new(4, 6)).ops(),
  107. vec![insert_c]
  108. );
  109. assert_eq!(
  110. OperationIterator::from_interval(&delta, Interval::new(2, 5)).ops(),
  111. vec![DeltaOperation::insert("34"), DeltaOperation::insert("5")]
  112. );
  113. }
  114. #[test]
  115. fn delta_get_ops_in_interval_5() {
  116. let mut delta = DeltaTextOperations::default();
  117. let insert_a = DeltaOperation::insert("123456");
  118. let insert_b = DeltaOperation::insert("789");
  119. delta.ops.push(insert_a.clone());
  120. delta.ops.push(insert_b.clone());
  121. assert_eq!(
  122. OperationIterator::from_interval(&delta, Interval::new(4, 8)).ops(),
  123. vec![DeltaOperation::insert("56"), DeltaOperation::insert("78")]
  124. );
  125. // assert_eq!(
  126. // DeltaIter::from_interval(&delta, Interval::new(8, 9)).ops(),
  127. // vec![Builder::insert("9")]
  128. // );
  129. }
  130. #[test]
  131. fn delta_get_ops_in_interval_6() {
  132. let mut delta = DeltaTextOperations::default();
  133. let insert_a = DeltaOperation::insert("12345678");
  134. delta.add(insert_a.clone());
  135. assert_eq!(
  136. OperationIterator::from_interval(&delta, Interval::new(4, 6)).ops(),
  137. vec![DeltaOperation::insert("56")]
  138. );
  139. }
  140. #[test]
  141. fn delta_get_ops_in_interval_7() {
  142. let mut delta = DeltaTextOperations::default();
  143. let insert_a = DeltaOperation::insert("12345");
  144. let retain_a = DeltaOperation::retain(3);
  145. delta.add(insert_a.clone());
  146. delta.add(retain_a.clone());
  147. let mut iter_1 = OperationIterator::from_offset(&delta, 2);
  148. assert_eq!(iter_1.next_op().unwrap(), DeltaOperation::insert("345"));
  149. assert_eq!(iter_1.next_op().unwrap(), DeltaOperation::retain(3));
  150. let mut iter_2 = OperationIterator::new(&delta);
  151. assert_eq!(
  152. iter_2.next_op_with_len(2).unwrap(),
  153. DeltaOperation::insert("12")
  154. );
  155. assert_eq!(iter_2.next_op().unwrap(), DeltaOperation::insert("345"));
  156. assert_eq!(iter_2.next_op().unwrap(), DeltaOperation::retain(3));
  157. }
  158. #[test]
  159. fn delta_op_seek() {
  160. let mut delta = DeltaTextOperations::default();
  161. let insert_a = DeltaOperation::insert("12345");
  162. let retain_a = DeltaOperation::retain(3);
  163. delta.add(insert_a.clone());
  164. delta.add(retain_a.clone());
  165. let mut iter = OperationIterator::new(&delta);
  166. iter.seek::<OpMetric>(1);
  167. assert_eq!(iter.next_op().unwrap(), retain_a);
  168. }
  169. #[test]
  170. fn delta_utf16_code_unit_seek() {
  171. let mut delta = DeltaTextOperations::default();
  172. delta.add(DeltaOperation::insert("12345"));
  173. let mut iter = OperationIterator::new(&delta);
  174. iter.seek::<Utf16CodeUnitMetric>(3);
  175. assert_eq!(
  176. iter.next_op_with_len(2).unwrap(),
  177. DeltaOperation::insert("45")
  178. );
  179. }
  180. #[test]
  181. fn delta_utf16_code_unit_seek_with_attributes() {
  182. let mut delta = DeltaTextOperations::default();
  183. let attributes = AttributeBuilder::new()
  184. .insert("bold", true)
  185. .insert("italic", true)
  186. .build();
  187. delta.add(DeltaOperation::insert_with_attributes(
  188. "1234",
  189. attributes.clone(),
  190. ));
  191. delta.add(DeltaOperation::insert("\n"));
  192. let mut iter = OperationIterator::new(&delta);
  193. iter.seek::<Utf16CodeUnitMetric>(0);
  194. assert_eq!(
  195. iter.next_op_with_len(4).unwrap(),
  196. DeltaOperation::insert_with_attributes("1234", attributes),
  197. );
  198. }
  199. #[test]
  200. fn delta_next_op_len() {
  201. let mut delta = DeltaTextOperations::default();
  202. delta.add(DeltaOperation::insert("12345"));
  203. let mut iter = OperationIterator::new(&delta);
  204. assert_eq!(
  205. iter.next_op_with_len(2).unwrap(),
  206. DeltaOperation::insert("12")
  207. );
  208. assert_eq!(
  209. iter.next_op_with_len(2).unwrap(),
  210. DeltaOperation::insert("34")
  211. );
  212. assert_eq!(
  213. iter.next_op_with_len(2).unwrap(),
  214. DeltaOperation::insert("5")
  215. );
  216. assert_eq!(iter.next_op_with_len(1), None);
  217. }
  218. #[test]
  219. fn delta_next_op_len_with_chinese() {
  220. let mut delta = DeltaTextOperations::default();
  221. delta.add(DeltaOperation::insert("你好"));
  222. let mut iter = OperationIterator::new(&delta);
  223. assert_eq!(iter.next_op_len().unwrap(), 2);
  224. assert_eq!(
  225. iter.next_op_with_len(2).unwrap(),
  226. DeltaOperation::insert("你好")
  227. );
  228. }
  229. #[test]
  230. fn delta_next_op_len_with_english() {
  231. let mut delta = DeltaTextOperations::default();
  232. delta.add(DeltaOperation::insert("ab"));
  233. let mut iter = OperationIterator::new(&delta);
  234. assert_eq!(iter.next_op_len().unwrap(), 2);
  235. assert_eq!(
  236. iter.next_op_with_len(2).unwrap(),
  237. DeltaOperation::insert("ab")
  238. );
  239. }
  240. #[test]
  241. fn delta_next_op_len_after_seek() {
  242. let mut delta = DeltaTextOperations::default();
  243. delta.add(DeltaOperation::insert("12345"));
  244. let mut iter = OperationIterator::new(&delta);
  245. assert_eq!(iter.next_op_len().unwrap(), 5);
  246. iter.seek::<Utf16CodeUnitMetric>(3);
  247. assert_eq!(iter.next_op_len().unwrap(), 2);
  248. assert_eq!(
  249. iter.next_op_with_len(1).unwrap(),
  250. DeltaOperation::insert("4")
  251. );
  252. assert_eq!(iter.next_op_len().unwrap(), 1);
  253. assert_eq!(iter.next_op().unwrap(), DeltaOperation::insert("5"));
  254. }
  255. #[test]
  256. fn delta_next_op_len_none() {
  257. let mut delta = DeltaTextOperations::default();
  258. delta.add(DeltaOperation::insert("12345"));
  259. let mut iter = OperationIterator::new(&delta);
  260. assert_eq!(iter.next_op_len().unwrap(), 5);
  261. assert_eq!(
  262. iter.next_op_with_len(5).unwrap(),
  263. DeltaOperation::insert("12345")
  264. );
  265. assert_eq!(iter.next_op_len(), None);
  266. }
  267. #[test]
  268. fn delta_next_op_with_len_zero() {
  269. let mut delta = DeltaTextOperations::default();
  270. delta.add(DeltaOperation::insert("12345"));
  271. let mut iter = OperationIterator::new(&delta);
  272. assert_eq!(iter.next_op_with_len(0), None,);
  273. assert_eq!(iter.next_op_len().unwrap(), 5);
  274. }
  275. #[test]
  276. fn delta_next_op_with_len_cross_op_return_last() {
  277. let mut delta = DeltaTextOperations::default();
  278. delta.add(DeltaOperation::insert("12345"));
  279. delta.add(DeltaOperation::retain(1));
  280. delta.add(DeltaOperation::insert("678"));
  281. let mut iter = OperationIterator::new(&delta);
  282. iter.seek::<Utf16CodeUnitMetric>(4);
  283. assert_eq!(iter.next_op_len().unwrap(), 1);
  284. assert_eq!(iter.next_op_with_len(2).unwrap(), DeltaOperation::retain(1));
  285. }
  286. #[test]
  287. fn lengths() {
  288. let mut delta = DeltaTextOperations::default();
  289. assert_eq!(delta.utf16_base_len, 0);
  290. assert_eq!(delta.utf16_target_len, 0);
  291. delta.retain(5, AttributeHashMap::default());
  292. assert_eq!(delta.utf16_base_len, 5);
  293. assert_eq!(delta.utf16_target_len, 5);
  294. delta.insert("abc", AttributeHashMap::default());
  295. assert_eq!(delta.utf16_base_len, 5);
  296. assert_eq!(delta.utf16_target_len, 8);
  297. delta.retain(2, AttributeHashMap::default());
  298. assert_eq!(delta.utf16_base_len, 7);
  299. assert_eq!(delta.utf16_target_len, 10);
  300. delta.delete(2);
  301. assert_eq!(delta.utf16_base_len, 9);
  302. assert_eq!(delta.utf16_target_len, 10);
  303. }
  304. #[test]
  305. fn sequence() {
  306. let mut delta = DeltaTextOperations::default();
  307. delta.retain(5, AttributeHashMap::default());
  308. delta.retain(0, AttributeHashMap::default());
  309. delta.insert("appflowy", AttributeHashMap::default());
  310. delta.insert("", AttributeHashMap::default());
  311. delta.delete(3);
  312. delta.delete(0);
  313. assert_eq!(delta.ops.len(), 3);
  314. }
  315. #[test]
  316. fn apply_1000() {
  317. for _ in 0..1 {
  318. let mut rng = Rng::default();
  319. let s: OTString = rng.gen_string(50).into();
  320. let delta = rng.gen_delta(&s);
  321. assert_eq!(s.utf16_len(), delta.utf16_base_len);
  322. }
  323. }
  324. #[test]
  325. fn apply_test() {
  326. let s = "hello";
  327. let delta_a = DeltaBuilder::new().insert(s).build();
  328. let delta_b = DeltaBuilder::new()
  329. .retain(s.len())
  330. .insert(", AppFlowy")
  331. .build();
  332. let after_a = delta_a.content().unwrap();
  333. let after_b = delta_b.apply(&after_a).unwrap();
  334. assert_eq!("hello, AppFlowy", &after_b);
  335. }
  336. #[test]
  337. fn base_len_test() {
  338. let mut delta_a = DeltaTextOperations::default();
  339. delta_a.insert("a", AttributeHashMap::default());
  340. delta_a.insert("b", AttributeHashMap::default());
  341. delta_a.insert("c", AttributeHashMap::default());
  342. let s = "hello world,".to_owned();
  343. delta_a.delete(s.len());
  344. let after_a = delta_a.apply(&s).unwrap();
  345. delta_a.insert("d", AttributeHashMap::default());
  346. assert_eq!("abc", &after_a);
  347. }
  348. #[test]
  349. fn invert() {
  350. for _ in 0..1000 {
  351. let mut rng = Rng::default();
  352. let s = rng.gen_string(50);
  353. let delta_a = rng.gen_delta(&s);
  354. let delta_b = delta_a.invert_str(&s);
  355. assert_eq!(delta_a.utf16_base_len, delta_b.utf16_target_len);
  356. assert_eq!(delta_a.utf16_target_len, delta_b.utf16_base_len);
  357. assert_eq!(delta_b.apply(&delta_a.apply(&s).unwrap()).unwrap(), s);
  358. }
  359. }
  360. #[test]
  361. fn invert_test() {
  362. let s = "hello world";
  363. let delta = DeltaBuilder::new().insert(s).build();
  364. let invert_delta = delta.invert_str("");
  365. assert_eq!(delta.utf16_base_len, invert_delta.utf16_target_len);
  366. assert_eq!(delta.utf16_target_len, invert_delta.utf16_base_len);
  367. assert_eq!(invert_delta.apply(s).unwrap(), "")
  368. }
  369. #[test]
  370. fn empty_ops() {
  371. let mut delta = DeltaTextOperations::default();
  372. delta.retain(0, AttributeHashMap::default());
  373. delta.insert("", AttributeHashMap::default());
  374. delta.delete(0);
  375. assert_eq!(delta.ops.len(), 0);
  376. }
  377. #[test]
  378. fn eq() {
  379. let mut delta_a = DeltaTextOperations::default();
  380. delta_a.delete(1);
  381. delta_a.insert("lo", AttributeHashMap::default());
  382. delta_a.retain(2, AttributeHashMap::default());
  383. delta_a.retain(3, AttributeHashMap::default());
  384. let mut delta_b = DeltaTextOperations::default();
  385. delta_b.delete(1);
  386. delta_b.insert("l", AttributeHashMap::default());
  387. delta_b.insert("o", AttributeHashMap::default());
  388. delta_b.retain(5, AttributeHashMap::default());
  389. assert_eq!(delta_a, delta_b);
  390. delta_a.delete(1);
  391. delta_b.retain(1, AttributeHashMap::default());
  392. assert_ne!(delta_a, delta_b);
  393. }
  394. #[test]
  395. fn ops_merging() {
  396. let mut delta = DeltaTextOperations::default();
  397. assert_eq!(delta.ops.len(), 0);
  398. delta.retain(2, AttributeHashMap::default());
  399. assert_eq!(delta.ops.len(), 1);
  400. assert_eq!(delta.ops.last(), Some(&DeltaOperation::retain(2)));
  401. delta.retain(3, AttributeHashMap::default());
  402. assert_eq!(delta.ops.len(), 1);
  403. assert_eq!(delta.ops.last(), Some(&DeltaOperation::retain(5)));
  404. delta.insert("abc", AttributeHashMap::default());
  405. assert_eq!(delta.ops.len(), 2);
  406. assert_eq!(delta.ops.last(), Some(&DeltaOperation::insert("abc")));
  407. delta.insert("xyz", AttributeHashMap::default());
  408. assert_eq!(delta.ops.len(), 2);
  409. assert_eq!(delta.ops.last(), Some(&DeltaOperation::insert("abcxyz")));
  410. delta.delete(1);
  411. assert_eq!(delta.ops.len(), 3);
  412. assert_eq!(delta.ops.last(), Some(&DeltaOperation::delete(1)));
  413. delta.delete(1);
  414. assert_eq!(delta.ops.len(), 3);
  415. assert_eq!(delta.ops.last(), Some(&DeltaOperation::delete(2)));
  416. }
  417. #[test]
  418. fn is_noop() {
  419. let mut delta = DeltaTextOperations::default();
  420. assert!(delta.is_noop());
  421. delta.retain(5, AttributeHashMap::default());
  422. assert!(delta.is_noop());
  423. delta.retain(3, AttributeHashMap::default());
  424. assert!(delta.is_noop());
  425. delta.insert("lorem", AttributeHashMap::default());
  426. assert!(!delta.is_noop());
  427. }
  428. #[test]
  429. fn compose() {
  430. for _ in 0..1000 {
  431. let mut rng = Rng::default();
  432. let s = rng.gen_string(20);
  433. let a = rng.gen_delta(&s);
  434. let after_a: OTString = a.apply(&s).unwrap().into();
  435. assert_eq!(a.utf16_target_len, after_a.utf16_len());
  436. let b = rng.gen_delta(&after_a);
  437. let after_b: OTString = b.apply(&after_a).unwrap().into();
  438. assert_eq!(b.utf16_target_len, after_b.utf16_len());
  439. let ab = a.compose(&b).unwrap();
  440. assert_eq!(ab.utf16_target_len, b.utf16_target_len);
  441. let after_ab: OTString = ab.apply(&s).unwrap().into();
  442. assert_eq!(after_b, after_ab);
  443. }
  444. }
  445. #[test]
  446. fn transform_random_delta() {
  447. for _ in 0..1000 {
  448. let mut rng = Rng::default();
  449. let s = rng.gen_string(20);
  450. let a = rng.gen_delta(&s);
  451. let b = rng.gen_delta(&s);
  452. let (a_prime, b_prime) = a.transform(&b).unwrap();
  453. let ab_prime = a.compose(&b_prime).unwrap();
  454. let ba_prime = b.compose(&a_prime).unwrap();
  455. assert_eq!(ab_prime, ba_prime);
  456. let after_ab_prime = ab_prime.apply(&s).unwrap();
  457. let after_ba_prime = ba_prime.apply(&s).unwrap();
  458. assert_eq!(after_ab_prime, after_ba_prime);
  459. }
  460. }
  461. #[test]
  462. fn transform_with_two_delta() {
  463. let mut a = DeltaTextOperations::default();
  464. let mut a_s = String::new();
  465. a.insert("123", AttributeBuilder::new().insert("bold", true).build());
  466. a_s = a.apply(&a_s).unwrap();
  467. assert_eq!(&a_s, "123");
  468. let mut b = DeltaTextOperations::default();
  469. let mut b_s = String::new();
  470. b.insert("456", AttributeHashMap::default());
  471. b_s = b.apply(&b_s).unwrap();
  472. assert_eq!(&b_s, "456");
  473. let (a_prime, b_prime) = a.transform(&b).unwrap();
  474. assert_eq!(
  475. r#"[{"insert":"123","attributes":{"bold":true}},{"retain":3}]"#,
  476. serde_json::to_string(&a_prime).unwrap()
  477. );
  478. assert_eq!(
  479. r#"[{"retain":3,"attributes":{"bold":true}},{"insert":"456"}]"#,
  480. serde_json::to_string(&b_prime).unwrap()
  481. );
  482. let new_a = a.compose(&b_prime).unwrap();
  483. let new_b = b.compose(&a_prime).unwrap();
  484. assert_eq!(
  485. r#"[{"insert":"123","attributes":{"bold":true}},{"insert":"456"}]"#,
  486. serde_json::to_string(&new_a).unwrap()
  487. );
  488. assert_eq!(
  489. r#"[{"insert":"123","attributes":{"bold":true}},{"insert":"456"}]"#,
  490. serde_json::to_string(&new_b).unwrap()
  491. );
  492. }
  493. #[test]
  494. fn transform_two_plain_delta() {
  495. let ops = vec![
  496. Insert(0, "123", 0),
  497. Insert(1, "456", 0),
  498. Transform(0, 1),
  499. AssertDocJson(0, r#"[{"insert":"123456"}]"#),
  500. AssertDocJson(1, r#"[{"insert":"123456"}]"#),
  501. ];
  502. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  503. }
  504. #[test]
  505. fn transform_two_plain_delta2() {
  506. let ops = vec![
  507. Insert(0, "123", 0),
  508. Insert(1, "456", 0),
  509. TransformPrime(0, 1),
  510. DocComposePrime(0, 1),
  511. DocComposePrime(1, 0),
  512. AssertDocJson(0, r#"[{"insert":"123456"}]"#),
  513. AssertDocJson(1, r#"[{"insert":"123456"}]"#),
  514. ];
  515. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  516. }
  517. #[test]
  518. fn transform_two_non_seq_delta() {
  519. let ops = vec![
  520. Insert(0, "123", 0),
  521. Insert(1, "456", 0),
  522. TransformPrime(0, 1),
  523. AssertPrimeJson(0, r#"[{"insert":"123"},{"retain":3}]"#),
  524. AssertPrimeJson(1, r#"[{"retain":3},{"insert":"456"}]"#),
  525. DocComposePrime(0, 1),
  526. Insert(1, "78", 3),
  527. Insert(1, "9", 5),
  528. DocComposePrime(1, 0),
  529. AssertDocJson(0, r#"[{"insert":"123456"}]"#),
  530. AssertDocJson(1, r#"[{"insert":"123456789"}]"#),
  531. ];
  532. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  533. }
  534. #[test]
  535. fn transform_two_conflict_non_seq_delta() {
  536. let ops = vec![
  537. Insert(0, "123", 0),
  538. Insert(1, "456", 0),
  539. TransformPrime(0, 1),
  540. DocComposePrime(0, 1),
  541. Insert(1, "78", 0),
  542. DocComposePrime(1, 0),
  543. AssertDocJson(0, r#"[{"insert":"123456"}]"#),
  544. AssertDocJson(1, r#"[{"insert":"12378456"}]"#),
  545. ];
  546. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  547. }
  548. #[test]
  549. fn delta_invert_no_attribute_delta() {
  550. let mut delta = DeltaTextOperations::default();
  551. delta.add(DeltaOperation::insert("123"));
  552. let mut change = DeltaTextOperations::default();
  553. change.add(DeltaOperation::retain(3));
  554. change.add(DeltaOperation::insert("456"));
  555. let undo = change.invert(&delta);
  556. let new_delta = delta.compose(&change).unwrap();
  557. let delta_after_undo = new_delta.compose(&undo).unwrap();
  558. assert_eq!(delta_after_undo, delta);
  559. }
  560. #[test]
  561. fn delta_invert_no_attribute_delta2() {
  562. let ops = vec![
  563. Insert(0, "123", 0),
  564. Insert(1, "4567", 0),
  565. Invert(0, 1),
  566. AssertDocJson(0, r#"[{"insert":"123"}]"#),
  567. ];
  568. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  569. }
  570. #[test]
  571. fn delta_invert_attribute_delta_with_no_attribute_delta() {
  572. let ops = vec![
  573. Insert(0, "123", 0),
  574. Bold(0, Interval::new(0, 3), true),
  575. AssertDocJson(0, r#"[{"insert":"123","attributes":{"bold":true}}]"#),
  576. Insert(1, "4567", 0),
  577. Invert(0, 1),
  578. AssertDocJson(0, r#"[{"insert":"123","attributes":{"bold":true}}]"#),
  579. ];
  580. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  581. }
  582. #[test]
  583. fn delta_invert_attribute_delta_with_no_attribute_delta2() {
  584. let ops = vec![
  585. Insert(0, "123", 0),
  586. Bold(0, Interval::new(0, 3), true),
  587. Insert(0, "456", 3),
  588. AssertDocJson(
  589. 0,
  590. r#"[
  591. {"insert":"123456","attributes":{"bold":true}}]
  592. "#,
  593. ),
  594. Italic(0, Interval::new(2, 4), true),
  595. AssertDocJson(
  596. 0,
  597. r#"[
  598. {"insert":"12","attributes":{"bold":true}},
  599. {"insert":"34","attributes":{"bold":true,"italic":true}},
  600. {"insert":"56","attributes":{"bold":true}}
  601. ]"#,
  602. ),
  603. Insert(1, "abc", 0),
  604. Invert(0, 1),
  605. AssertDocJson(
  606. 0,
  607. r#"[
  608. {"insert":"12","attributes":{"bold":true}},
  609. {"insert":"34","attributes":{"bold":true,"italic":true}},
  610. {"insert":"56","attributes":{"bold":true}}
  611. ]"#,
  612. ),
  613. ];
  614. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  615. }
  616. #[test]
  617. fn delta_invert_no_attribute_delta_with_attribute_delta() {
  618. let ops = vec![
  619. Insert(0, "123", 0),
  620. Insert(1, "4567", 0),
  621. Bold(1, Interval::new(0, 3), true),
  622. AssertDocJson(
  623. 1,
  624. r#"[{"insert":"456","attributes":{"bold":true}},{"insert":"7"}]"#,
  625. ),
  626. Invert(0, 1),
  627. AssertDocJson(0, r#"[{"insert":"123"}]"#),
  628. ];
  629. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  630. }
  631. #[test]
  632. fn delta_invert_no_attribute_delta_with_attribute_delta2() {
  633. let ops = vec![
  634. Insert(0, "123", 0),
  635. AssertDocJson(0, r#"[{"insert":"123"}]"#),
  636. Insert(1, "abc", 0),
  637. Bold(1, Interval::new(0, 3), true),
  638. Insert(1, "d", 3),
  639. Italic(1, Interval::new(1, 3), true),
  640. AssertDocJson(
  641. 1,
  642. r#"[{"insert":"a","attributes":{"bold":true}},{"insert":"bc","attributes":{"bold":true,"italic":true}},{"insert":"d","attributes":{"bold":true}}]"#,
  643. ),
  644. Invert(0, 1),
  645. AssertDocJson(0, r#"[{"insert":"123"}]"#),
  646. ];
  647. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  648. }
  649. #[test]
  650. fn delta_invert_attribute_delta_with_attribute_delta() {
  651. let ops = vec![
  652. Insert(0, "123", 0),
  653. Bold(0, Interval::new(0, 3), true),
  654. Insert(0, "456", 3),
  655. AssertDocJson(0, r#"[{"insert":"123456","attributes":{"bold":true}}]"#),
  656. Italic(0, Interval::new(2, 4), true),
  657. AssertDocJson(
  658. 0,
  659. r#"[
  660. {"insert":"12","attributes":{"bold":true}},
  661. {"insert":"34","attributes":{"bold":true,"italic":true}},
  662. {"insert":"56","attributes":{"bold":true}}
  663. ]"#,
  664. ),
  665. Insert(1, "abc", 0),
  666. Bold(1, Interval::new(0, 3), true),
  667. Insert(1, "d", 3),
  668. Italic(1, Interval::new(1, 3), true),
  669. AssertDocJson(
  670. 1,
  671. r#"[
  672. {"insert":"a","attributes":{"bold":true}},
  673. {"insert":"bc","attributes":{"bold":true,"italic":true}},
  674. {"insert":"d","attributes":{"bold":true}}
  675. ]"#,
  676. ),
  677. Invert(0, 1),
  678. AssertDocJson(
  679. 0,
  680. r#"[
  681. {"insert":"12","attributes":{"bold":true}},
  682. {"insert":"34","attributes":{"bold":true,"italic":true}},
  683. {"insert":"56","attributes":{"bold":true}}
  684. ]"#,
  685. ),
  686. ];
  687. TestBuilder::new().run_scripts::<EmptyDocument>(ops);
  688. }
  689. #[test]
  690. fn delta_compose_str() {
  691. let ops = vec![
  692. Insert(0, "1", 0),
  693. Insert(0, "2", 1),
  694. AssertDocJson(0, r#"[{"insert":"12\n"}]"#),
  695. ];
  696. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  697. }
  698. #[test]
  699. #[should_panic]
  700. fn delta_compose_with_missing_delta() {
  701. let ops = vec![
  702. Insert(0, "123", 0),
  703. Insert(0, "4", 3),
  704. DocComposeDelta(1, 0),
  705. AssertDocJson(0, r#"[{"insert":"1234\n"}]"#),
  706. AssertStr(1, r#"4\n"#),
  707. ];
  708. TestBuilder::new().run_scripts::<NewlineDocument>(ops);
  709. }