op_test.rs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. pub mod helper;
  2. use crate::helper::MergeTestOp::*;
  3. use bytecount::num_chars;
  4. use flowy_ot::{
  5. attributes::*,
  6. delta::Delta,
  7. operation::{OpBuilder, Operation},
  8. };
  9. use helper::*;
  10. use std::str::FromStr;
  11. #[test]
  12. fn lengths() {
  13. let mut delta = Delta::default();
  14. assert_eq!(delta.base_len, 0);
  15. assert_eq!(delta.target_len, 0);
  16. delta.retain(5, None);
  17. assert_eq!(delta.base_len, 5);
  18. assert_eq!(delta.target_len, 5);
  19. delta.insert("abc", None);
  20. assert_eq!(delta.base_len, 5);
  21. assert_eq!(delta.target_len, 8);
  22. delta.retain(2, None);
  23. assert_eq!(delta.base_len, 7);
  24. assert_eq!(delta.target_len, 10);
  25. delta.delete(2);
  26. assert_eq!(delta.base_len, 9);
  27. assert_eq!(delta.target_len, 10);
  28. }
  29. #[test]
  30. fn sequence() {
  31. let mut delta = Delta::default();
  32. delta.retain(5, None);
  33. delta.retain(0, None);
  34. delta.insert("appflowy", None);
  35. delta.insert("", None);
  36. delta.delete(3);
  37. delta.delete(0);
  38. assert_eq!(delta.ops.len(), 3);
  39. }
  40. #[test]
  41. fn apply_1000() {
  42. for _ in 0..1000 {
  43. let mut rng = Rng::default();
  44. let s = rng.gen_string(50);
  45. let delta = rng.gen_delta(&s);
  46. assert_eq!(num_chars(s.as_bytes()), delta.base_len);
  47. assert_eq!(delta.apply(&s).unwrap().chars().count(), delta.target_len);
  48. }
  49. }
  50. #[test]
  51. fn apply() {
  52. let s = "hello world,".to_owned();
  53. let mut delta_a = Delta::default();
  54. delta_a.insert(&s, None);
  55. let mut delta_b = Delta::default();
  56. delta_b.retain(s.len() as u64, None);
  57. delta_b.insert("appflowy", None);
  58. let after_a = delta_a.apply("").unwrap();
  59. let after_b = delta_b.apply(&after_a).unwrap();
  60. assert_eq!("hello world,appflowy", &after_b);
  61. }
  62. #[test]
  63. fn base_len_test() {
  64. let mut delta_a = Delta::default();
  65. delta_a.insert("a", None);
  66. delta_a.insert("b", None);
  67. delta_a.insert("c", None);
  68. let s = "hello world,".to_owned();
  69. delta_a.delete(s.len() as u64);
  70. let after_a = delta_a.apply(&s).unwrap();
  71. delta_a.insert("d", None);
  72. assert_eq!("abc", &after_a);
  73. }
  74. #[test]
  75. fn invert() {
  76. for _ in 0..1000 {
  77. let mut rng = Rng::default();
  78. let s = rng.gen_string(50);
  79. let delta_a = rng.gen_delta(&s);
  80. let delta_b = delta_a.invert(&s);
  81. assert_eq!(delta_a.base_len, delta_b.target_len);
  82. assert_eq!(delta_a.target_len, delta_b.base_len);
  83. assert_eq!(delta_b.apply(&delta_a.apply(&s).unwrap()).unwrap(), s);
  84. }
  85. }
  86. #[test]
  87. fn empty_ops() {
  88. let mut delta = Delta::default();
  89. delta.retain(0, None);
  90. delta.insert("", None);
  91. delta.delete(0);
  92. assert_eq!(delta.ops.len(), 0);
  93. }
  94. #[test]
  95. fn eq() {
  96. let mut delta_a = Delta::default();
  97. delta_a.delete(1);
  98. delta_a.insert("lo", None);
  99. delta_a.retain(2, None);
  100. delta_a.retain(3, None);
  101. let mut delta_b = Delta::default();
  102. delta_b.delete(1);
  103. delta_b.insert("l", None);
  104. delta_b.insert("o", None);
  105. delta_b.retain(5, None);
  106. assert_eq!(delta_a, delta_b);
  107. delta_a.delete(1);
  108. delta_b.retain(1, None);
  109. assert_ne!(delta_a, delta_b);
  110. }
  111. #[test]
  112. fn ops_merging() {
  113. let mut delta = Delta::default();
  114. assert_eq!(delta.ops.len(), 0);
  115. delta.retain(2, None);
  116. assert_eq!(delta.ops.len(), 1);
  117. assert_eq!(delta.ops.last(), Some(&OpBuilder::retain(2).build()));
  118. delta.retain(3, None);
  119. assert_eq!(delta.ops.len(), 1);
  120. assert_eq!(delta.ops.last(), Some(&OpBuilder::retain(5).build()));
  121. delta.insert("abc", None);
  122. assert_eq!(delta.ops.len(), 2);
  123. assert_eq!(delta.ops.last(), Some(&OpBuilder::insert("abc").build()));
  124. delta.insert("xyz", None);
  125. assert_eq!(delta.ops.len(), 2);
  126. assert_eq!(delta.ops.last(), Some(&OpBuilder::insert("abcxyz").build()));
  127. delta.delete(1);
  128. assert_eq!(delta.ops.len(), 3);
  129. assert_eq!(delta.ops.last(), Some(&OpBuilder::delete(1).build()));
  130. delta.delete(1);
  131. assert_eq!(delta.ops.len(), 3);
  132. assert_eq!(delta.ops.last(), Some(&OpBuilder::delete(2).build()));
  133. }
  134. #[test]
  135. fn is_noop() {
  136. let mut delta = Delta::default();
  137. assert!(delta.is_noop());
  138. delta.retain(5, None);
  139. assert!(delta.is_noop());
  140. delta.retain(3, None);
  141. assert!(delta.is_noop());
  142. delta.insert("lorem", None);
  143. assert!(!delta.is_noop());
  144. }
  145. #[test]
  146. fn compose() {
  147. for _ in 0..1000 {
  148. let mut rng = Rng::default();
  149. let s = rng.gen_string(20);
  150. let a = rng.gen_delta(&s);
  151. let after_a = a.apply(&s).unwrap();
  152. assert_eq!(a.target_len, num_chars(after_a.as_bytes()));
  153. let b = rng.gen_delta(&after_a);
  154. let after_b = b.apply(&after_a).unwrap();
  155. assert_eq!(b.target_len, num_chars(after_b.as_bytes()));
  156. let ab = a.compose(&b).unwrap();
  157. assert_eq!(ab.target_len, b.target_len);
  158. let after_ab = ab.apply(&s).unwrap();
  159. assert_eq!(after_b, after_ab);
  160. }
  161. }
  162. #[test]
  163. fn transform() {
  164. for _ in 0..1000 {
  165. let mut rng = Rng::default();
  166. let s = rng.gen_string(20);
  167. let a = rng.gen_delta(&s);
  168. let b = rng.gen_delta(&s);
  169. let (a_prime, b_prime) = a.transform(&b).unwrap();
  170. let ab_prime = a.compose(&b_prime).unwrap();
  171. let ba_prime = b.compose(&a_prime).unwrap();
  172. assert_eq!(ab_prime, ba_prime);
  173. // let after_ab_prime = ab_prime.apply(&s).unwrap();
  174. // let after_ba_prime = ba_prime.apply(&s).unwrap();
  175. // assert_eq!(after_ab_prime, after_ba_prime);
  176. }
  177. }
  178. #[test]
  179. fn transform2() {
  180. let ops = vec![
  181. Insert(0, "123"),
  182. Insert(1, "456"),
  183. Transform(0, 1),
  184. AssertStr(0, "123456"),
  185. AssertStr(1, "123456"),
  186. AssertOpsJson(0, r#"[{"insert":"123456"}]"#),
  187. AssertOpsJson(1, r#"[{"insert":"123456"}]"#),
  188. ];
  189. MergeTest::new().run_script(ops);
  190. }
  191. #[test]
  192. fn delta_transform_test() {
  193. let mut a = Delta::default();
  194. let mut a_s = String::new();
  195. a.insert("123", Some(AttrsBuilder::new().bold(true).build()));
  196. a_s = a.apply(&a_s).unwrap();
  197. assert_eq!(&a_s, "123");
  198. let mut b = Delta::default();
  199. let mut b_s = String::new();
  200. b.insert("456", None);
  201. b_s = b.apply(&b_s).unwrap();
  202. assert_eq!(&b_s, "456");
  203. let (a_prime, b_prime) = a.transform(&b).unwrap();
  204. assert_eq!(
  205. r#"[{"insert":"123","attributes":{"bold":"true"}},{"retain":3}]"#,
  206. serde_json::to_string(&a_prime).unwrap()
  207. );
  208. assert_eq!(
  209. r#"[{"retain":3,"attributes":{"bold":"true"}},{"insert":"456"}]"#,
  210. serde_json::to_string(&b_prime).unwrap()
  211. );
  212. }