op_test.rs 24 KB

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