op_test.rs 20 KB

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