mod.rs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. use flowy_ot::{
  2. attributes::{Attributes, AttributesData, AttrsBuilder},
  3. delta::Delta,
  4. interval::Interval,
  5. operation::{OpBuilder, Operation},
  6. };
  7. use rand::{prelude::*, Rng as WrappedRng};
  8. use std::sync::Once;
  9. #[derive(Clone, Debug)]
  10. pub enum MergeTestOp {
  11. Insert(usize, &'static str),
  12. // delta_i, s, start, length,
  13. InsertBold(usize, &'static str, Interval),
  14. // delta_i, start, length, enable
  15. Bold(usize, Interval, bool),
  16. Delete(usize, Interval),
  17. Italic(usize, Interval, bool),
  18. Transform(usize, usize),
  19. AssertStr(usize, &'static str),
  20. AssertOpsJson(usize, &'static str),
  21. }
  22. pub struct MergeTest {
  23. deltas: Vec<Delta>,
  24. }
  25. impl MergeTest {
  26. pub fn new() -> Self {
  27. static INIT: Once = Once::new();
  28. INIT.call_once(|| {
  29. std::env::set_var("RUST_LOG", "info");
  30. env_logger::init();
  31. });
  32. let mut deltas = Vec::with_capacity(2);
  33. for _ in 0..2 {
  34. let delta = Delta::default();
  35. deltas.push(delta);
  36. }
  37. Self { deltas }
  38. }
  39. pub fn run_op(&mut self, op: &MergeTestOp) {
  40. match op {
  41. MergeTestOp::Insert(delta_i, s) => {
  42. let delta = &mut self.deltas[*delta_i];
  43. delta.insert(s, Attributes::Follow);
  44. },
  45. MergeTestOp::Delete(delta_i, interval) => {
  46. //
  47. self.update_delta_with_delete(*delta_i, interval);
  48. },
  49. MergeTestOp::InsertBold(delta_i, s, _interval) => {
  50. let attrs = AttrsBuilder::new().bold(true).build();
  51. let delta = &mut self.deltas[*delta_i];
  52. delta.insert(s, attrs);
  53. },
  54. MergeTestOp::Bold(delta_i, interval, enable) => {
  55. let attrs = AttrsBuilder::new().bold(*enable).build();
  56. self.update_delta_with_attribute(*delta_i, attrs, interval);
  57. },
  58. MergeTestOp::Italic(delta_i, interval, enable) => {
  59. let attrs = AttrsBuilder::new().italic(*enable).build();
  60. self.update_delta_with_attribute(*delta_i, attrs, interval);
  61. },
  62. MergeTestOp::Transform(delta_a_i, delta_b_i) => {
  63. let delta_a = &self.deltas[*delta_a_i];
  64. let delta_b = &self.deltas[*delta_b_i];
  65. let (a_prime, b_prime) = delta_a.transform(delta_b).unwrap();
  66. log::trace!("a:{:?},b:{:?}", a_prime, b_prime);
  67. let new_delta_a = delta_a.compose(&b_prime).unwrap();
  68. let new_delta_b = delta_b.compose(&a_prime).unwrap();
  69. self.deltas[*delta_a_i] = new_delta_a;
  70. self.deltas[*delta_b_i] = new_delta_b;
  71. },
  72. MergeTestOp::AssertStr(delta_i, expected) => {
  73. let s = self.deltas[*delta_i].apply("").unwrap();
  74. assert_eq!(&s, expected);
  75. },
  76. MergeTestOp::AssertOpsJson(delta_i, expected) => {
  77. let delta_i_json = serde_json::to_string(&self.deltas[*delta_i]).unwrap();
  78. let expected_delta: Delta = serde_json::from_str(expected).unwrap();
  79. let target_delta: Delta = serde_json::from_str(&delta_i_json).unwrap();
  80. if expected_delta != target_delta {
  81. log::error!("✅ {}", expected);
  82. log::error!("❌ {}", delta_i_json);
  83. }
  84. assert_eq!(target_delta, expected_delta);
  85. },
  86. }
  87. }
  88. pub fn run_script(&mut self, script: Vec<MergeTestOp>) {
  89. for (_i, op) in script.iter().enumerate() {
  90. self.run_op(op);
  91. }
  92. }
  93. pub fn update_delta_with_attribute(
  94. &mut self,
  95. delta_index: usize,
  96. attributes: Attributes,
  97. interval: &Interval,
  98. ) {
  99. let old_delta = &self.deltas[delta_index];
  100. let retain = OpBuilder::retain(interval.size() as u64)
  101. .attributes(attributes)
  102. .build();
  103. let new_delta = make_delta_with_op(old_delta, retain, interval);
  104. self.deltas[delta_index] = new_delta;
  105. }
  106. pub fn update_delta_with_delete(&mut self, delta_index: usize, interval: &Interval) {
  107. let old_delta = &self.deltas[delta_index];
  108. let delete = OpBuilder::delete(interval.size() as u64).build();
  109. let new_delta = make_delta_with_op(old_delta, delete, interval);
  110. self.deltas[delta_index] = new_delta;
  111. }
  112. }
  113. pub fn make_delta_with_op(delta: &Delta, op: Operation, interval: &Interval) -> Delta {
  114. let mut new_delta = Delta::default();
  115. let (prefix, suffix) = length_split_with_interval(delta.target_len, interval);
  116. // prefix
  117. if prefix.is_empty() == false && prefix != *interval {
  118. let size = prefix.size();
  119. let attrs = attributes_in_interval(delta, &prefix);
  120. new_delta.retain(size as u64, attrs);
  121. }
  122. new_delta.add(op);
  123. // suffix
  124. if suffix.is_empty() == false {
  125. let size = suffix.size();
  126. let attrs = attributes_in_interval(delta, &suffix);
  127. new_delta.retain(size as u64, attrs);
  128. }
  129. delta.compose(&new_delta).unwrap()
  130. }
  131. pub fn length_split_with_interval(length: usize, interval: &Interval) -> (Interval, Interval) {
  132. let original_interval = Interval::new(0, length);
  133. let prefix = original_interval.prefix(*interval);
  134. let suffix = original_interval.suffix(*interval);
  135. (prefix, suffix)
  136. }
  137. pub fn debug_print_delta(delta: &Delta) {
  138. log::debug!("😁 {}", serde_json::to_string(delta).unwrap());
  139. }
  140. pub fn attributes_in_interval(delta: &Delta, interval: &Interval) -> Attributes {
  141. let mut attributes_data = AttributesData::new();
  142. let mut offset = 0;
  143. delta.ops.iter().for_each(|op| match op {
  144. Operation::Delete(_n) => {},
  145. Operation::Retain(retain) => {
  146. if interval.contains(retain.num as usize) {
  147. match &retain.attributes {
  148. Attributes::Follow => {},
  149. Attributes::Custom(data) => {
  150. attributes_data.extend(data.clone());
  151. },
  152. Attributes::Empty => {},
  153. }
  154. }
  155. },
  156. Operation::Insert(insert) => match &insert.attributes {
  157. Attributes::Follow => {},
  158. Attributes::Custom(data) => {
  159. if interval.start >= offset && insert.num_chars() > (interval.end as u64 - 1) {
  160. attributes_data.extend(data.clone());
  161. }
  162. offset += insert.num_chars() as usize;
  163. },
  164. Attributes::Empty => {},
  165. },
  166. });
  167. if attributes_data.is_plain() {
  168. Attributes::Empty
  169. } else {
  170. Attributes::Custom(attributes_data)
  171. }
  172. }
  173. pub struct Rng(StdRng);
  174. impl Default for Rng {
  175. fn default() -> Self { Rng(StdRng::from_rng(thread_rng()).unwrap()) }
  176. }
  177. impl Rng {
  178. pub fn from_seed(seed: [u8; 32]) -> Self { Rng(StdRng::from_seed(seed)) }
  179. pub fn gen_string(&mut self, len: usize) -> String {
  180. (0..len).map(|_| self.0.gen::<char>()).collect()
  181. }
  182. pub fn gen_delta(&mut self, s: &str) -> Delta {
  183. let mut delta = Delta::default();
  184. loop {
  185. let left = s.chars().count() - delta.base_len();
  186. if left == 0 {
  187. break;
  188. }
  189. let i = if left == 1 {
  190. 1
  191. } else {
  192. 1 + self.0.gen_range(0, std::cmp::min(left - 1, 20))
  193. };
  194. match self.0.gen_range(0.0, 1.0) {
  195. f if f < 0.2 => {
  196. delta.insert(&self.gen_string(i), Attributes::Empty);
  197. },
  198. f if f < 0.4 => {
  199. delta.delete(i as u64);
  200. },
  201. _ => {
  202. delta.retain(i as u64, Attributes::Empty);
  203. },
  204. }
  205. }
  206. if self.0.gen_range(0.0, 1.0) < 0.3 {
  207. delta.insert(&("1".to_owned() + &self.gen_string(10)), Attributes::Empty);
  208. }
  209. delta
  210. }
  211. }