delta_test.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import 'package:flutter_test/flutter_test.dart';
  2. import 'package:flowy_editor/document/text_delta.dart';
  3. void main() {
  4. TestWidgetsFlutterBinding.ensureInitialized();
  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, {
  75. 'color': 'blue'
  76. });
  77. final b = Delta().insert('B');
  78. final expected = Delta().insert('B').retain(1, {
  79. 'color': 'blue',
  80. });
  81. expect(a.compose(b), expected);
  82. });
  83. test('retain + retain', () {
  84. final a = Delta().retain(1, {
  85. 'color': 'blue',
  86. });
  87. final b = Delta().retain(1, {
  88. 'bold': true,
  89. 'color': 'red',
  90. });
  91. final expected = Delta().retain(1, {
  92. 'bold': true,
  93. 'color': 'red',
  94. });
  95. expect(a.compose(b), expected);
  96. });
  97. test('retain + delete', () {
  98. final a = Delta().retain(1, {
  99. 'color': 'blue',
  100. });
  101. final b = Delta().delete(1);
  102. final expected = Delta().delete(1);
  103. expect(a.compose(b), expected);
  104. });
  105. test('insert in middle of text', () {
  106. final a = Delta().insert('Hello');
  107. final b = Delta().retain(3).insert('X');
  108. final expected = Delta().insert('HelXlo');
  109. expect(a.compose(b), expected);
  110. });
  111. test('insert and delete ordering', () {
  112. final a = Delta().insert('Hello');
  113. final b = Delta().insert('Hello');
  114. final insertFirst = Delta().retain(3).insert('X').delete(1);
  115. final deleteFirst = Delta().retain(3).delete(1).insert('X');
  116. final expected = Delta().insert('HelXo');
  117. expect(a.compose(insertFirst), expected);
  118. expect(b.compose(deleteFirst), expected);
  119. });
  120. test('delete entire text', () {
  121. final a = Delta().retain(4).insert('Hello');
  122. final b = Delta().delete(9);
  123. final expected = Delta().delete(4);
  124. expect(a.compose(b), expected);
  125. });
  126. test('retain more than length of text', () {
  127. final a = Delta().insert('Hello');
  128. final b = Delta().retain(10);
  129. final expected = Delta().insert('Hello');
  130. expect(a.compose(b), expected);
  131. });
  132. test('retain start optimization', () {
  133. final a = Delta()
  134. .insert('A', {'bold': true})
  135. .insert('B')
  136. .insert('C', {'bold': true})
  137. .delete(1);
  138. final b = Delta().retain(3).insert('D');
  139. final expected = Delta()
  140. .insert('A', {'bold': true})
  141. .insert('B')
  142. .insert('C', {'bold': true})
  143. .insert('D')
  144. .delete(1);
  145. expect(a.compose(b), expected);
  146. });
  147. test('retain end optimization', () {
  148. final a = Delta()
  149. .insert('A', {'bold': true})
  150. .insert('B')
  151. .insert('C', {'bold': true});
  152. final b = Delta().delete(1);
  153. final expected = Delta().insert('B').insert('C', {'bold': true});
  154. expect(a.compose(b), expected);
  155. });
  156. test('retain end optimization join', () {
  157. final a = Delta()
  158. .insert('A', {'bold': true})
  159. .insert('B')
  160. .insert('C', {'bold': true})
  161. .insert('D')
  162. .insert('E', {'bold': true})
  163. .insert('F');
  164. final b = Delta().retain(1).delete(1);
  165. final expected = Delta()
  166. .insert('AC', {'bold': true})
  167. .insert('D')
  168. .insert('E', {'bold': true})
  169. .insert('F');
  170. expect(a.compose(b), expected);
  171. });
  172. }