op_test.rs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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. assert_eq!(
  14. delta.ops_in_interval(Interval::new(0, 4)),
  15. vec![delta.ops.last().unwrap().clone()]
  16. );
  17. }
  18. #[test]
  19. fn delta_get_ops_in_interval_2() {
  20. let mut delta = Delta::default();
  21. let insert_a = Builder::insert("123").build();
  22. let insert_b = Builder::insert("4").build();
  23. let insert_c = Builder::insert("5").build();
  24. let retain_a = Builder::retain(3).build();
  25. delta.add(insert_a.clone());
  26. delta.add(retain_a.clone());
  27. delta.add(insert_b.clone());
  28. delta.add(insert_c.clone());
  29. assert_eq!(
  30. delta.ops_in_interval(Interval::new(0, 2)),
  31. vec![Builder::insert("12").build()]
  32. );
  33. assert_eq!(
  34. delta.ops_in_interval(Interval::new(0, 3)),
  35. vec![insert_a.clone()]
  36. );
  37. assert_eq!(
  38. delta.ops_in_interval(Interval::new(0, 4)),
  39. vec![insert_a.clone(), Builder::retain(1).build()]
  40. );
  41. assert_eq!(
  42. delta.ops_in_interval(Interval::new(0, 6)),
  43. vec![insert_a.clone(), retain_a.clone()]
  44. );
  45. assert_eq!(
  46. delta.ops_in_interval(Interval::new(0, 7)),
  47. vec![insert_a.clone(), retain_a.clone(), insert_b.clone()]
  48. );
  49. }
  50. #[test]
  51. fn delta_get_ops_in_interval_3() {
  52. let mut delta = Delta::default();
  53. let insert_a = Builder::insert("123456").build();
  54. delta.add(insert_a.clone());
  55. assert_eq!(
  56. delta.ops_in_interval(Interval::new(3, 5)),
  57. vec![Builder::insert("45").build()]
  58. );
  59. }
  60. #[test]
  61. fn delta_get_ops_in_interval_4() {
  62. let mut delta = Delta::default();
  63. let insert_a = Builder::insert("12").build();
  64. let insert_b = Builder::insert("34").build();
  65. let insert_c = Builder::insert("56").build();
  66. delta.ops.push(insert_a.clone());
  67. delta.ops.push(insert_b.clone());
  68. delta.ops.push(insert_c.clone());
  69. assert_eq!(delta.ops_in_interval(Interval::new(0, 2)), vec![insert_a]);
  70. assert_eq!(delta.ops_in_interval(Interval::new(2, 4)), vec![insert_b]);
  71. assert_eq!(delta.ops_in_interval(Interval::new(4, 6)), vec![insert_c]);
  72. assert_eq!(
  73. delta.ops_in_interval(Interval::new(2, 5)),
  74. vec![Builder::insert("34").build(), Builder::insert("5").build()]
  75. );
  76. }
  77. #[test]
  78. fn delta_get_ops_in_interval_5() {
  79. let mut delta = Delta::default();
  80. let insert_a = Builder::insert("123456").build();
  81. let insert_b = Builder::insert("789").build();
  82. delta.ops.push(insert_a.clone());
  83. delta.ops.push(insert_b.clone());
  84. assert_eq!(
  85. delta.ops_in_interval(Interval::new(4, 8)),
  86. vec![Builder::insert("56").build(), Builder::insert("78").build()]
  87. );
  88. assert_eq!(
  89. delta.ops_in_interval(Interval::new(8, 9)),
  90. vec![Builder::insert("9").build()]
  91. );
  92. }
  93. #[test]
  94. fn delta_get_ops_in_interval_6() {
  95. let mut delta = Delta::default();
  96. let insert_a = Builder::insert("12345678").build();
  97. delta.add(insert_a.clone());
  98. assert_eq!(
  99. delta.ops_in_interval(Interval::new(4, 6)),
  100. vec![Builder::insert("56").build()]
  101. );
  102. }
  103. #[test]
  104. fn lengths() {
  105. let mut delta = Delta::default();
  106. assert_eq!(delta.base_len, 0);
  107. assert_eq!(delta.target_len, 0);
  108. delta.retain(5, Attributes::Empty);
  109. assert_eq!(delta.base_len, 5);
  110. assert_eq!(delta.target_len, 5);
  111. delta.insert("abc", Attributes::Empty);
  112. assert_eq!(delta.base_len, 5);
  113. assert_eq!(delta.target_len, 8);
  114. delta.retain(2, Attributes::Empty);
  115. assert_eq!(delta.base_len, 7);
  116. assert_eq!(delta.target_len, 10);
  117. delta.delete(2);
  118. assert_eq!(delta.base_len, 9);
  119. assert_eq!(delta.target_len, 10);
  120. }
  121. #[test]
  122. fn sequence() {
  123. let mut delta = Delta::default();
  124. delta.retain(5, Attributes::Empty);
  125. delta.retain(0, Attributes::Empty);
  126. delta.insert("appflowy", Attributes::Empty);
  127. delta.insert("", Attributes::Empty);
  128. delta.delete(3);
  129. delta.delete(0);
  130. assert_eq!(delta.ops.len(), 3);
  131. }
  132. #[test]
  133. fn apply_1000() {
  134. for _ in 0..1000 {
  135. let mut rng = Rng::default();
  136. let s = rng.gen_string(50);
  137. let delta = rng.gen_delta(&s);
  138. assert_eq!(num_chars(s.as_bytes()), delta.base_len);
  139. assert_eq!(delta.apply(&s).unwrap().chars().count(), delta.target_len);
  140. }
  141. }
  142. #[test]
  143. fn apply() {
  144. let s = "hello world,".to_owned();
  145. let mut delta_a = Delta::default();
  146. delta_a.insert(&s, Attributes::Empty);
  147. let mut delta_b = Delta::default();
  148. delta_b.retain(s.len(), Attributes::Empty);
  149. delta_b.insert("appflowy", Attributes::Empty);
  150. let after_a = delta_a.apply("").unwrap();
  151. let after_b = delta_b.apply(&after_a).unwrap();
  152. assert_eq!("hello world,appflowy", &after_b);
  153. }
  154. #[test]
  155. fn base_len_test() {
  156. let mut delta_a = Delta::default();
  157. delta_a.insert("a", Attributes::Empty);
  158. delta_a.insert("b", Attributes::Empty);
  159. delta_a.insert("c", Attributes::Empty);
  160. let s = "hello world,".to_owned();
  161. delta_a.delete(s.len());
  162. let after_a = delta_a.apply(&s).unwrap();
  163. delta_a.insert("d", Attributes::Empty);
  164. assert_eq!("abc", &after_a);
  165. }
  166. #[test]
  167. fn invert() {
  168. for _ in 0..1000 {
  169. let mut rng = Rng::default();
  170. let s = rng.gen_string(50);
  171. let delta_a = rng.gen_delta(&s);
  172. let delta_b = delta_a.invert_str(&s);
  173. assert_eq!(delta_a.base_len, delta_b.target_len);
  174. assert_eq!(delta_a.target_len, delta_b.base_len);
  175. assert_eq!(delta_b.apply(&delta_a.apply(&s).unwrap()).unwrap(), s);
  176. }
  177. }
  178. #[test]
  179. fn empty_ops() {
  180. let mut delta = Delta::default();
  181. delta.retain(0, Attributes::Empty);
  182. delta.insert("", Attributes::Empty);
  183. delta.delete(0);
  184. assert_eq!(delta.ops.len(), 0);
  185. }
  186. #[test]
  187. fn eq() {
  188. let mut delta_a = Delta::default();
  189. delta_a.delete(1);
  190. delta_a.insert("lo", Attributes::Empty);
  191. delta_a.retain(2, Attributes::Empty);
  192. delta_a.retain(3, Attributes::Empty);
  193. let mut delta_b = Delta::default();
  194. delta_b.delete(1);
  195. delta_b.insert("l", Attributes::Empty);
  196. delta_b.insert("o", Attributes::Empty);
  197. delta_b.retain(5, Attributes::Empty);
  198. assert_eq!(delta_a, delta_b);
  199. delta_a.delete(1);
  200. delta_b.retain(1, Attributes::Empty);
  201. assert_ne!(delta_a, delta_b);
  202. }
  203. #[test]
  204. fn ops_merging() {
  205. let mut delta = Delta::default();
  206. assert_eq!(delta.ops.len(), 0);
  207. delta.retain(2, Attributes::Empty);
  208. assert_eq!(delta.ops.len(), 1);
  209. assert_eq!(delta.ops.last(), Some(&Builder::retain(2).build()));
  210. delta.retain(3, Attributes::Empty);
  211. assert_eq!(delta.ops.len(), 1);
  212. assert_eq!(delta.ops.last(), Some(&Builder::retain(5).build()));
  213. delta.insert("abc", Attributes::Empty);
  214. assert_eq!(delta.ops.len(), 2);
  215. assert_eq!(delta.ops.last(), Some(&Builder::insert("abc").build()));
  216. delta.insert("xyz", Attributes::Empty);
  217. assert_eq!(delta.ops.len(), 2);
  218. assert_eq!(delta.ops.last(), Some(&Builder::insert("abcxyz").build()));
  219. delta.delete(1);
  220. assert_eq!(delta.ops.len(), 3);
  221. assert_eq!(delta.ops.last(), Some(&Builder::delete(1).build()));
  222. delta.delete(1);
  223. assert_eq!(delta.ops.len(), 3);
  224. assert_eq!(delta.ops.last(), Some(&Builder::delete(2).build()));
  225. }
  226. #[test]
  227. fn is_noop() {
  228. let mut delta = Delta::default();
  229. assert!(delta.is_noop());
  230. delta.retain(5, Attributes::Empty);
  231. assert!(delta.is_noop());
  232. delta.retain(3, Attributes::Empty);
  233. assert!(delta.is_noop());
  234. delta.insert("lorem", Attributes::Empty);
  235. assert!(!delta.is_noop());
  236. }
  237. #[test]
  238. fn compose() {
  239. for _ in 0..1000 {
  240. let mut rng = Rng::default();
  241. let s = rng.gen_string(20);
  242. let a = rng.gen_delta(&s);
  243. let after_a = a.apply(&s).unwrap();
  244. assert_eq!(a.target_len, num_chars(after_a.as_bytes()));
  245. let b = rng.gen_delta(&after_a);
  246. let after_b = b.apply(&after_a).unwrap();
  247. assert_eq!(b.target_len, num_chars(after_b.as_bytes()));
  248. let ab = a.compose(&b).unwrap();
  249. assert_eq!(ab.target_len, b.target_len);
  250. let after_ab = ab.apply(&s).unwrap();
  251. assert_eq!(after_b, after_ab);
  252. }
  253. }
  254. #[test]
  255. fn transform() {
  256. for _ in 0..1000 {
  257. let mut rng = Rng::default();
  258. let s = rng.gen_string(20);
  259. let a = rng.gen_delta(&s);
  260. let b = rng.gen_delta(&s);
  261. let (a_prime, b_prime) = a.transform(&b).unwrap();
  262. let ab_prime = a.compose(&b_prime).unwrap();
  263. let ba_prime = b.compose(&a_prime).unwrap();
  264. assert_eq!(ab_prime, ba_prime);
  265. let after_ab_prime = ab_prime.apply(&s).unwrap();
  266. let after_ba_prime = ba_prime.apply(&s).unwrap();
  267. assert_eq!(after_ab_prime, after_ba_prime);
  268. }
  269. }
  270. #[test]
  271. fn transform2() {
  272. let ops = vec![
  273. Insert(0, "123", 0),
  274. Insert(1, "456", 0),
  275. Transform(0, 1),
  276. AssertOpsJson(0, r#"[{"insert":"123456"}]"#),
  277. AssertOpsJson(1, r#"[{"insert":"123456"}]"#),
  278. ];
  279. OpTester::new().run_script(ops);
  280. }
  281. #[test]
  282. fn delta_transform_test() {
  283. let mut a = Delta::default();
  284. let mut a_s = String::new();
  285. a.insert("123", AttrsBuilder::new().bold(true).build());
  286. a_s = a.apply(&a_s).unwrap();
  287. assert_eq!(&a_s, "123");
  288. let mut b = Delta::default();
  289. let mut b_s = String::new();
  290. b.insert("456", Attributes::Empty);
  291. b_s = b.apply(&b_s).unwrap();
  292. assert_eq!(&b_s, "456");
  293. let (a_prime, b_prime) = a.transform(&b).unwrap();
  294. assert_eq!(
  295. r#"[{"insert":"123","attributes":{"bold":"true"}},{"retain":3}]"#,
  296. serde_json::to_string(&a_prime).unwrap()
  297. );
  298. assert_eq!(
  299. r#"[{"retain":3,"attributes":{"bold":"true"}},{"insert":"456"}]"#,
  300. serde_json::to_string(&b_prime).unwrap()
  301. );
  302. }