invert_test.rs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. pub mod helper;
  2. use crate::helper::{TestOp::*, *};
  3. use flowy_ot::core::{Delta, Interval, OpBuilder};
  4. #[test]
  5. fn delta_invert_no_attribute_delta() {
  6. let mut delta = Delta::default();
  7. delta.add(OpBuilder::insert("123").build());
  8. let mut change = Delta::default();
  9. change.add(OpBuilder::retain(3).build());
  10. change.add(OpBuilder::insert("456").build());
  11. let undo = change.invert(&delta);
  12. let new_delta = delta.compose(&change).unwrap();
  13. let delta_after_undo = new_delta.compose(&undo).unwrap();
  14. assert_eq!(delta_after_undo, delta);
  15. }
  16. #[test]
  17. fn delta_invert_no_attribute_delta2() {
  18. let ops = vec![
  19. Insert(0, "123", 0),
  20. Insert(1, "4567", 0),
  21. Invert(0, 1),
  22. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  23. ];
  24. OpTester::new().run_script(ops);
  25. }
  26. #[test]
  27. fn delta_invert_attribute_delta_with_no_attribute_delta() {
  28. let ops = vec![
  29. Insert(0, "123", 0),
  30. Bold(0, Interval::new(0, 3), true),
  31. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  32. Insert(1, "4567", 0),
  33. Invert(0, 1),
  34. AssertOpsJson(0, r#"[{"insert":"123","attributes":{"bold":"true"}}]"#),
  35. ];
  36. OpTester::new().run_script(ops);
  37. }
  38. #[test]
  39. fn delta_invert_attribute_delta_with_no_attribute_delta2() {
  40. let ops = vec![
  41. Insert(0, "123", 0),
  42. Bold(0, Interval::new(0, 3), true),
  43. Insert(0, "456", 3),
  44. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  45. Italic(0, Interval::new(2, 4), true),
  46. AssertOpsJson(
  47. 0,
  48. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":
  49. {"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"
  50. }}]"#,
  51. ),
  52. Insert(1, "abc", 0),
  53. Invert(0, 1),
  54. AssertOpsJson(
  55. 0,
  56. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":
  57. {"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"
  58. }}]"#,
  59. ),
  60. ];
  61. OpTester::new().run_script(ops);
  62. }
  63. #[test]
  64. fn delta_invert_no_attribute_delta_with_attribute_delta() {
  65. let ops = vec![
  66. Insert(0, "123", 0),
  67. Insert(1, "4567", 0),
  68. Bold(1, Interval::new(0, 3), true),
  69. AssertOpsJson(
  70. 1,
  71. r#"[{"insert":"456","attributes":{"bold":"true"}},{"insert":"7"}]"#,
  72. ),
  73. Invert(0, 1),
  74. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  75. ];
  76. OpTester::new().run_script(ops);
  77. }
  78. #[test]
  79. fn delta_invert_no_attribute_delta_with_attribute_delta2() {
  80. let ops = vec![
  81. Insert(0, "123", 0),
  82. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  83. Insert(1, "abc", 0),
  84. Bold(1, Interval::new(0, 3), true),
  85. Insert(1, "d", 3),
  86. Italic(1, Interval::new(1, 3), true),
  87. AssertOpsJson(
  88. 1,
  89. r#"[{"insert":"a","attributes":{"bold":"true"}},{"insert":"bc","attributes":
  90. {"bold":"true","italic":"true"}},{"insert":"d","attributes":{"bold":"true"
  91. }}]"#,
  92. ),
  93. Invert(0, 1),
  94. AssertOpsJson(0, r#"[{"insert":"123"}]"#),
  95. ];
  96. OpTester::new().run_script(ops);
  97. }
  98. #[test]
  99. fn delta_invert_attribute_delta_with_attribute_delta() {
  100. let ops = vec![
  101. Insert(0, "123", 0),
  102. Bold(0, Interval::new(0, 3), true),
  103. Insert(0, "456", 3),
  104. AssertOpsJson(0, r#"[{"insert":"123456","attributes":{"bold":"true"}}]"#),
  105. Italic(0, Interval::new(2, 4), true),
  106. AssertOpsJson(
  107. 0,
  108. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":
  109. {"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"
  110. }}]"#,
  111. ),
  112. Insert(1, "abc", 0),
  113. Bold(1, Interval::new(0, 3), true),
  114. Insert(1, "d", 3),
  115. Italic(1, Interval::new(1, 3), true),
  116. AssertOpsJson(
  117. 1,
  118. r#"[{"insert":"a","attributes":{"bold":"true"}},{"insert":"bc","attributes":
  119. {"bold":"true","italic":"true"}},{"insert":"d","attributes":{"bold":"true"
  120. }}]"#,
  121. ),
  122. Invert(0, 1),
  123. AssertOpsJson(
  124. 0,
  125. r#"[{"insert":"12","attributes":{"bold":"true"}},{"insert":"34","attributes":
  126. {"bold":"true","italic":"true"}},{"insert":"56","attributes":{"bold":"true"
  127. }}]"#,
  128. ),
  129. ];
  130. OpTester::new().run_script(ops);
  131. }
  132. #[test]
  133. fn delta_get_ops_in_interval_1() {
  134. let mut delta = Delta::default();
  135. let insert_a = OpBuilder::insert("123").build();
  136. let insert_b = OpBuilder::insert("4").build();
  137. delta.add(insert_a.clone());
  138. delta.add(insert_b.clone());
  139. assert_eq!(
  140. delta.ops_in_interval(Interval::new(0, 4)),
  141. vec![delta.ops.last().unwrap().clone()]
  142. );
  143. }
  144. #[test]
  145. fn delta_get_ops_in_interval_2() {
  146. let mut delta = Delta::default();
  147. let insert_a = OpBuilder::insert("123").build();
  148. let insert_b = OpBuilder::insert("4").build();
  149. let insert_c = OpBuilder::insert("5").build();
  150. let retain_a = OpBuilder::retain(3).build();
  151. delta.add(insert_a.clone());
  152. delta.add(retain_a.clone());
  153. delta.add(insert_b.clone());
  154. delta.add(insert_c.clone());
  155. assert_eq!(
  156. delta.ops_in_interval(Interval::new(0, 3)),
  157. vec![insert_a.clone()]
  158. );
  159. assert_eq!(
  160. delta.ops_in_interval(Interval::new(0, 4)),
  161. vec![insert_a.clone(), retain_a.clone()]
  162. );
  163. assert_eq!(
  164. delta.ops_in_interval(Interval::new(0, 7)),
  165. vec![
  166. insert_a.clone(),
  167. retain_a.clone(),
  168. // insert_b and insert_c will be merged into one. insert: "45"
  169. delta.ops.last().unwrap().clone()
  170. ]
  171. );
  172. }