delta_test.dart 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. import 'package:flutter_test/flutter_test.dart';
  2. import 'package:flowy_editor/src/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()
  16. ..retain(12)
  17. ..insert("White", {
  18. 'color': '#fff',
  19. })
  20. ..delete(4);
  21. final restores = delta.compose(death);
  22. expect(restores.toList(), <TextOperation>[
  23. TextInsert('Gandalf', {'bold': true}),
  24. TextInsert(' the '),
  25. TextInsert('White', {'color': '#fff'}),
  26. ]);
  27. });
  28. test('compose()', () {
  29. final a = Delta()..insert('A');
  30. final b = Delta()..insert('B');
  31. final expected = Delta()
  32. ..insert('B')
  33. ..insert('A');
  34. expect(a.compose(b), expected);
  35. });
  36. test('insert + retain', () {
  37. final a = Delta()..insert('A');
  38. final b = Delta()
  39. ..retain(1, {
  40. 'bold': true,
  41. 'color': 'red',
  42. });
  43. final expected = Delta()
  44. ..insert('A', {
  45. 'bold': true,
  46. 'color': 'red',
  47. });
  48. expect(a.compose(b), expected);
  49. });
  50. test('insert + delete', () {
  51. final a = Delta()..insert('A');
  52. final b = Delta()..delete(1);
  53. final expected = Delta();
  54. expect(a.compose(b), expected);
  55. });
  56. test('delete + insert', () {
  57. final a = Delta()..delete(1);
  58. final b = Delta()..insert('B');
  59. final expected = Delta()
  60. ..insert('B')
  61. ..delete(1);
  62. expect(a.compose(b), expected);
  63. });
  64. test('delete + retain', () {
  65. final a = Delta()..delete(1);
  66. final b = Delta()
  67. ..retain(1, {
  68. 'bold': true,
  69. 'color': 'red',
  70. });
  71. final expected = Delta()
  72. ..delete(1)
  73. ..retain(1, {
  74. 'bold': true,
  75. 'color': 'red',
  76. });
  77. expect(a.compose(b), expected);
  78. });
  79. test('delete + delete', () {
  80. final a = Delta()..delete(1);
  81. final b = Delta()..delete(1);
  82. final expected = Delta()..delete(2);
  83. expect(a.compose(b), expected);
  84. });
  85. test('retain + insert', () {
  86. final a = Delta()..retain(1, {'color': 'blue'});
  87. final b = Delta()..insert('B');
  88. final expected = Delta()
  89. ..insert('B')
  90. ..retain(1, {
  91. 'color': 'blue',
  92. });
  93. expect(a.compose(b), expected);
  94. });
  95. test('retain + retain', () {
  96. final a = Delta()
  97. ..retain(1, {
  98. 'color': 'blue',
  99. });
  100. final b = Delta()
  101. ..retain(1, {
  102. 'bold': true,
  103. 'color': 'red',
  104. });
  105. final expected = Delta()
  106. ..retain(1, {
  107. 'bold': true,
  108. 'color': 'red',
  109. });
  110. expect(a.compose(b), expected);
  111. });
  112. test('retain + delete', () {
  113. final a = Delta()
  114. ..retain(1, {
  115. 'color': 'blue',
  116. });
  117. final b = Delta()..delete(1);
  118. final expected = Delta()..delete(1);
  119. expect(a.compose(b), expected);
  120. });
  121. test('insert in middle of text', () {
  122. final a = Delta()..insert('Hello');
  123. final b = Delta()
  124. ..retain(3)
  125. ..insert('X');
  126. final expected = Delta()..insert('HelXlo');
  127. expect(a.compose(b), expected);
  128. });
  129. test('insert and delete ordering', () {
  130. final a = Delta()..insert('Hello');
  131. final b = Delta()..insert('Hello');
  132. final insertFirst = Delta()
  133. ..retain(3)
  134. ..insert('X')
  135. ..delete(1);
  136. final deleteFirst = Delta()
  137. ..retain(3)
  138. ..delete(1)
  139. ..insert('X');
  140. final expected = Delta()..insert('HelXo');
  141. expect(a.compose(insertFirst), expected);
  142. expect(b.compose(deleteFirst), expected);
  143. });
  144. test('delete entire text', () {
  145. final a = Delta()
  146. ..retain(4)
  147. ..insert('Hello');
  148. final b = Delta()..delete(9);
  149. final expected = Delta()..delete(4);
  150. expect(a.compose(b), expected);
  151. });
  152. test('retain more than length of text', () {
  153. final a = Delta()..insert('Hello');
  154. final b = Delta()..retain(10);
  155. final expected = Delta()..insert('Hello');
  156. expect(a.compose(b), expected);
  157. });
  158. test('retain start optimization', () {
  159. final a = Delta()
  160. ..insert('A', {'bold': true})
  161. ..insert('B')
  162. ..insert('C', {'bold': true})
  163. ..delete(1);
  164. final b = Delta()
  165. ..retain(3)
  166. ..insert('D');
  167. final expected = Delta()
  168. ..insert('A', {'bold': true})
  169. ..insert('B')
  170. ..insert('C', {'bold': true})
  171. ..insert('D')
  172. ..delete(1);
  173. expect(a.compose(b), expected);
  174. });
  175. test('retain end optimization', () {
  176. final a = Delta()
  177. ..insert('A', {'bold': true})
  178. ..insert('B')
  179. ..insert('C', {'bold': true});
  180. final b = Delta()..delete(1);
  181. final expected = Delta()
  182. ..insert('B')
  183. ..insert('C', {'bold': true});
  184. expect(a.compose(b), expected);
  185. });
  186. test('retain end optimization join', () {
  187. final a = Delta()
  188. ..insert('A', {'bold': true})
  189. ..insert('B')
  190. ..insert('C', {'bold': true})
  191. ..insert('D')
  192. ..insert('E', {'bold': true})
  193. ..insert('F');
  194. final b = Delta()
  195. ..retain(1)
  196. ..delete(1);
  197. final expected = Delta()
  198. ..insert('AC', {'bold': true})
  199. ..insert('D')
  200. ..insert('E', {'bold': true})
  201. ..insert('F');
  202. expect(a.compose(b), expected);
  203. });
  204. });
  205. group('invert', () {
  206. test('insert', () {
  207. final delta = Delta()
  208. ..retain(2)
  209. ..insert('A');
  210. final base = Delta()..insert('12346');
  211. final expected = Delta()
  212. ..retain(2)
  213. ..delete(1);
  214. final inverted = delta.invert(base);
  215. expect(expected, inverted);
  216. expect(base.compose(delta).compose(inverted), base);
  217. });
  218. test('delete', () {
  219. final delta = Delta()
  220. ..retain(2)
  221. ..delete(3);
  222. final base = Delta()..insert('123456');
  223. final expected = Delta()
  224. ..retain(2)
  225. ..insert('345');
  226. final inverted = delta.invert(base);
  227. expect(expected, inverted);
  228. expect(base.compose(delta).compose(inverted), base);
  229. });
  230. // test('retain', () {
  231. // final delta = Delta().retain(2).retain(3, {'bold': true});
  232. // final base = Delta().insert('123456');
  233. // final expected = Delta().retain(2).retain(3, {'bold': null});
  234. // final inverted = delta.invert(base);
  235. // expect(expected, inverted);
  236. // expect(base.compose(delta).compose(inverted), base);
  237. // });
  238. });
  239. group('json', () {
  240. test('toJson()', () {
  241. final delta = Delta()
  242. ..retain(2)
  243. ..insert('A')
  244. ..delete(3);
  245. expect(delta.toJson(), [
  246. {'retain': 2},
  247. {'insert': 'A'},
  248. {'delete': 3}
  249. ]);
  250. });
  251. test('attributes', () {
  252. final delta = Delta()
  253. ..retain(2, {'bold': true})
  254. ..insert('A', {'italic': true});
  255. expect(delta.toJson(), [
  256. {
  257. 'retain': 2,
  258. 'attributes': {'bold': true},
  259. },
  260. {
  261. 'insert': 'A',
  262. 'attributes': {'italic': true},
  263. },
  264. ]);
  265. });
  266. test('fromJson()', () {
  267. final delta = Delta.fromJson([
  268. {'retain': 2},
  269. {'insert': 'A'},
  270. {'delete': 3},
  271. ]);
  272. final expected = Delta()
  273. ..retain(2)
  274. ..insert('A')
  275. ..delete(3);
  276. expect(delta, expected);
  277. });
  278. });
  279. group('runes', () {
  280. test("stringIndexes", () {
  281. final indexes = stringIndexes('😊');
  282. expect(indexes[0], 0);
  283. expect(indexes[1], 0);
  284. });
  285. test("next rune 1", () {
  286. final delta = Delta()..insert('😊');
  287. expect(delta.nextRunePosition(0), 2);
  288. });
  289. test("next rune 2", () {
  290. final delta = Delta()..insert('😊a');
  291. expect(delta.nextRunePosition(0), 2);
  292. });
  293. test("next rune 3", () {
  294. final delta = Delta()..insert('😊陈');
  295. expect(delta.nextRunePosition(2), 3);
  296. });
  297. test("prev rune 1", () {
  298. final delta = Delta()..insert('😊陈');
  299. expect(delta.prevRunePosition(2), 0);
  300. });
  301. test("prev rune 2", () {
  302. final delta = Delta()..insert('😊');
  303. expect(delta.prevRunePosition(2), 0);
  304. });
  305. test("prev rune 3", () {
  306. final delta = Delta()..insert('😊');
  307. expect(delta.prevRunePosition(0), -1);
  308. });
  309. });
  310. }