delta_test.dart 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. import 'package:flutter_test/flutter_test.dart';
  2. import 'package:flowy_editor/document/text_delta.dart';
  3. void main() {
  4. group('compose', () {
  5. test('test delta', () {
  6. final delta = Delta(<TextOperation>[
  7. TextInsert('Gandalf', {
  8. 'bold': true,
  9. }),
  10. TextInsert(' the '),
  11. TextInsert('Grey', {
  12. 'color': '#ccc',
  13. })
  14. ]);
  15. final death = Delta().retain(12).insert("White", {
  16. 'color': '#fff',
  17. }).delete(4);
  18. final restores = delta.compose(death);
  19. expect(restores.operations, <TextOperation>[
  20. TextInsert('Gandalf', {'bold': true}),
  21. TextInsert(' the '),
  22. TextInsert('White', {'color': '#fff'}),
  23. ]);
  24. });
  25. test('compose()', () {
  26. final a = Delta().insert('A');
  27. final b = Delta().insert('B');
  28. final expected = Delta().insert('B').insert('A');
  29. expect(a.compose(b), expected);
  30. });
  31. test('insert + retain', () {
  32. final a = Delta().insert('A');
  33. final b = Delta().retain(1, {
  34. 'bold': true,
  35. 'color': 'red',
  36. });
  37. final expected = Delta().insert('A', {
  38. 'bold': true,
  39. 'color': 'red',
  40. });
  41. expect(a.compose(b), expected);
  42. });
  43. test('insert + delete', () {
  44. final a = Delta().insert('A');
  45. final b = Delta().delete(1);
  46. final expected = Delta();
  47. expect(a.compose(b), expected);
  48. });
  49. test('delete + insert', () {
  50. final a = Delta().delete(1);
  51. final b = Delta().insert('B');
  52. final expected = Delta().insert('B').delete(1);
  53. expect(a.compose(b), expected);
  54. });
  55. test('delete + retain', () {
  56. final a = Delta().delete(1);
  57. final b = Delta().retain(1, {
  58. 'bold': true,
  59. 'color': 'red',
  60. });
  61. final expected = Delta().delete(1).retain(1, {
  62. 'bold': true,
  63. 'color': 'red',
  64. });
  65. expect(a.compose(b), expected);
  66. });
  67. test('delete + delete', () {
  68. final a = Delta().delete(1);
  69. final b = Delta().delete(1);
  70. final expected = Delta().delete(2);
  71. expect(a.compose(b), expected);
  72. });
  73. test('retain + insert', () {
  74. final a = Delta().retain(1, {'color': 'blue'});
  75. final b = Delta().insert('B');
  76. final expected = Delta().insert('B').retain(1, {
  77. 'color': 'blue',
  78. });
  79. expect(a.compose(b), expected);
  80. });
  81. test('retain + retain', () {
  82. final a = Delta().retain(1, {
  83. 'color': 'blue',
  84. });
  85. final b = Delta().retain(1, {
  86. 'bold': true,
  87. 'color': 'red',
  88. });
  89. final expected = Delta().retain(1, {
  90. 'bold': true,
  91. 'color': 'red',
  92. });
  93. expect(a.compose(b), expected);
  94. });
  95. test('retain + delete', () {
  96. final a = Delta().retain(1, {
  97. 'color': 'blue',
  98. });
  99. final b = Delta().delete(1);
  100. final expected = Delta().delete(1);
  101. expect(a.compose(b), expected);
  102. });
  103. test('insert in middle of text', () {
  104. final a = Delta().insert('Hello');
  105. final b = Delta().retain(3).insert('X');
  106. final expected = Delta().insert('HelXlo');
  107. expect(a.compose(b), expected);
  108. });
  109. test('insert and delete ordering', () {
  110. final a = Delta().insert('Hello');
  111. final b = Delta().insert('Hello');
  112. final insertFirst = Delta().retain(3).insert('X').delete(1);
  113. final deleteFirst = Delta().retain(3).delete(1).insert('X');
  114. final expected = Delta().insert('HelXo');
  115. expect(a.compose(insertFirst), expected);
  116. expect(b.compose(deleteFirst), expected);
  117. });
  118. test('delete entire text', () {
  119. final a = Delta().retain(4).insert('Hello');
  120. final b = Delta().delete(9);
  121. final expected = Delta().delete(4);
  122. expect(a.compose(b), expected);
  123. });
  124. test('retain more than length of text', () {
  125. final a = Delta().insert('Hello');
  126. final b = Delta().retain(10);
  127. final expected = Delta().insert('Hello');
  128. expect(a.compose(b), expected);
  129. });
  130. test('retain start optimization', () {
  131. final a = Delta()
  132. .insert('A', {'bold': true})
  133. .insert('B')
  134. .insert('C', {'bold': true})
  135. .delete(1);
  136. final b = Delta().retain(3).insert('D');
  137. final expected = Delta()
  138. .insert('A', {'bold': true})
  139. .insert('B')
  140. .insert('C', {'bold': true})
  141. .insert('D')
  142. .delete(1);
  143. expect(a.compose(b), expected);
  144. });
  145. test('retain end optimization', () {
  146. final a = Delta()
  147. .insert('A', {'bold': true})
  148. .insert('B')
  149. .insert('C', {'bold': true});
  150. final b = Delta().delete(1);
  151. final expected = Delta().insert('B').insert('C', {'bold': true});
  152. expect(a.compose(b), expected);
  153. });
  154. test('retain end optimization join', () {
  155. final a = Delta()
  156. .insert('A', {'bold': true})
  157. .insert('B')
  158. .insert('C', {'bold': true})
  159. .insert('D')
  160. .insert('E', {'bold': true})
  161. .insert('F');
  162. final b = Delta().retain(1).delete(1);
  163. final expected = Delta()
  164. .insert('AC', {'bold': true})
  165. .insert('D')
  166. .insert('E', {'bold': true})
  167. .insert('F');
  168. expect(a.compose(b), expected);
  169. });
  170. });
  171. group('invert', () {
  172. test('insert', () {
  173. final delta = Delta().retain(2).insert('A');
  174. final base = Delta().insert('12346');
  175. final expected = Delta().retain(2).delete(1);
  176. final inverted = delta.invert(base);
  177. expect(expected, inverted);
  178. expect(base.compose(delta).compose(inverted), base);
  179. });
  180. test('delete', () {
  181. final delta = Delta().retain(2).delete(3);
  182. final base = Delta().insert('123456');
  183. final expected = Delta().retain(2).insert('345');
  184. final inverted = delta.invert(base);
  185. expect(expected, inverted);
  186. expect(base.compose(delta).compose(inverted), base);
  187. });
  188. // test('retain', () {
  189. // final delta = Delta().retain(2).retain(3, {'bold': true});
  190. // final base = Delta().insert('123456');
  191. // final expected = Delta().retain(2).retain(3, {'bold': null});
  192. // final inverted = delta.invert(base);
  193. // expect(expected, inverted);
  194. // expect(base.compose(delta).compose(inverted), base);
  195. // });
  196. });
  197. group('json', () {
  198. test('toJson()', () {
  199. final delta = Delta().retain(2).insert('A').delete(3);
  200. expect(delta.toJson(), [
  201. {'retain': 2},
  202. {'insert': 'A'},
  203. {'delete': 3}
  204. ]);
  205. });
  206. test('attributes', () {
  207. final delta =
  208. Delta().retain(2, {'bold': true}).insert('A', {'italic': true});
  209. expect(delta.toJson(), [
  210. {
  211. 'retain': 2,
  212. 'attributes': {'bold': true},
  213. },
  214. {
  215. 'insert': 'A',
  216. 'attributes': {'italic': true},
  217. },
  218. ]);
  219. });
  220. test('fromJson()', () {
  221. final delta = Delta.fromJson([
  222. {'retain': 2},
  223. {'insert': 'A'},
  224. {'delete': 3},
  225. ]);
  226. final expected = Delta().retain(2).insert('A').delete(3);
  227. expect(delta, expected);
  228. });
  229. });
  230. }