c152567aa555eeafea65b034ad33c9e2a85669ad32c2deb6daf69bc70e631f544685538f97c7c8094fae57678c8d046328c7066f2205e6345ea42a56ae2ab9 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. describe('UndoManager Suite', function () {
  2. let undoManager, items;
  3. function addItem(item) {
  4. items.push(item);
  5. }
  6. function removeItem() {
  7. items.pop();
  8. }
  9. function addItemToUndo(item, groupId) {
  10. undoManager.add({
  11. groupId,
  12. undo: function () {
  13. removeItem();
  14. },
  15. redo: function () {
  16. addItem(item);
  17. },
  18. });
  19. }
  20. beforeEach(function () {
  21. // Always start with a clean slate
  22. items = [];
  23. undoManager = new window.UndoManager();
  24. });
  25. it('Create the undo manager', function () {
  26. undoManager = new UndoManager();
  27. expect(undoManager).not.toBe(null);
  28. expect(undoManager.getCommands().length).toBe(0);
  29. expect(undoManager.getIndex()).toBe(-1);
  30. });
  31. it('Adding a command', function () {
  32. let item = 'A';
  33. addItem(item);
  34. addItemToUndo(item);
  35. expect(undoManager.getCommands().length).toBe(1);
  36. expect(undoManager.getIndex()).toBe(0);
  37. expect(undoManager.hasUndo()).toBe(true);
  38. expect(undoManager.hasRedo()).toBe(false);
  39. });
  40. it('Adding a callback', function () {
  41. let callbackCalled = 0;
  42. addItemToUndo('A');
  43. undoManager.setCallback(function () {
  44. callbackCalled++;
  45. });
  46. undoManager.undo();
  47. undoManager.redo();
  48. expect(callbackCalled).toBe(2);
  49. undoManager.setCallback(undefined);
  50. undoManager.undo();
  51. undoManager.redo();
  52. expect(callbackCalled).toBe(2);
  53. });
  54. it('Calling redo', function () {
  55. let item1 = 'A',
  56. item2 = 'B';
  57. addItem(item1);
  58. addItemToUndo(item1);
  59. addItem(item2);
  60. addItemToUndo(item2);
  61. undoManager.undo();
  62. undoManager.redo();
  63. expect(items.length).toBe(2);
  64. expect(undoManager.hasUndo()).toBe(true);
  65. expect(undoManager.getCommands().length).toBe(2);
  66. expect(undoManager.getIndex()).toBe(1);
  67. });
  68. it('Calling redo that is not a function', function () {
  69. let item1 = 'A',
  70. item2 = 'B';
  71. addItem(item1);
  72. undoManager.add({
  73. undo: function () {
  74. removeItem();
  75. },
  76. redo: undefined,
  77. });
  78. addItem(item2);
  79. undoManager.add({
  80. undo: function () {
  81. removeItem();
  82. },
  83. redo: undefined,
  84. });
  85. undoManager.undo();
  86. undoManager.redo();
  87. expect(items.length).toBe(1);
  88. expect(undoManager.hasUndo()).toBe(true);
  89. expect(undoManager.getCommands().length).toBe(2);
  90. expect(undoManager.getIndex()).toBe(1);
  91. });
  92. it('Calling undo without redo', function () {
  93. addItem('A');
  94. addItem('B');
  95. undoManager.add({
  96. undo: function () {
  97. removeItem();
  98. },
  99. redo: undefined,
  100. });
  101. undoManager.undo();
  102. undoManager.undo();
  103. expect(items.length).toBe(1);
  104. expect(undoManager.hasUndo()).toBe(false);
  105. expect(undoManager.getCommands().length).toBe(1);
  106. expect(undoManager.getIndex()).toBe(-1);
  107. });
  108. it('Calling clear', function () {
  109. addItemToUndo('A');
  110. addItemToUndo('B');
  111. undoManager.clear();
  112. expect(undoManager.getCommands().length).toBe(0);
  113. expect(undoManager.getIndex()).toBe(-1);
  114. expect(undoManager.hasUndo()).toBe(false);
  115. expect(undoManager.hasRedo()).toBe(false);
  116. });
  117. it('Calling undo with limit set', function () {
  118. undoManager.setLimit(5);
  119. addItem('1');
  120. addItemToUndo('1');
  121. addItem('2');
  122. addItemToUndo('2');
  123. addItem('3');
  124. addItemToUndo('3');
  125. addItem('4');
  126. addItemToUndo('4');
  127. addItem('5');
  128. addItemToUndo('5');
  129. addItem('6');
  130. addItemToUndo('6');
  131. addItem('7');
  132. addItemToUndo('7');
  133. undoManager.undo();
  134. undoManager.undo();
  135. undoManager.undo();
  136. undoManager.undo();
  137. undoManager.undo();
  138. expect(undoManager.hasUndo()).toBe(false);
  139. expect(undoManager.hasRedo()).toBe(true);
  140. expect(undoManager.getCommands().length).toBe(5);
  141. });
  142. it('Calling undo with limit set to 1', function () {
  143. undoManager.setLimit(1);
  144. let item1 = 'A',
  145. item2 = 'B',
  146. item3 = 'C';
  147. addItem(item1);
  148. addItemToUndo(item1);
  149. addItem(item2);
  150. addItemToUndo(item2);
  151. addItem(item3);
  152. addItemToUndo(item3);
  153. undoManager.undo();
  154. undoManager.undo();
  155. undoManager.undo();
  156. expect(undoManager.hasUndo()).toBe(false);
  157. expect(undoManager.hasRedo()).toBe(true);
  158. expect(undoManager.getCommands().length).toBe(1);
  159. });
  160. it('Calling undo with limit set to 0', function () {
  161. undoManager.setLimit(0);
  162. let item1 = 'A',
  163. item2 = 'B',
  164. item3 = 'C';
  165. addItem(item1);
  166. addItemToUndo(item1);
  167. addItem(item2);
  168. addItemToUndo(item2);
  169. addItem(item3);
  170. addItemToUndo(item3);
  171. undoManager.undo();
  172. undoManager.undo();
  173. expect(undoManager.hasUndo()).toBe(true);
  174. expect(undoManager.hasRedo()).toBe(true);
  175. expect(undoManager.getCommands().length).toBe(3);
  176. });
  177. it('Calling undo/redo/clear with group ID', function () {
  178. let groupId;
  179. addItem('A');
  180. addItemToUndo('A');
  181. addItem('B');
  182. addItemToUndo('B');
  183. groupId = 'CDE';
  184. addItem('C');
  185. addItemToUndo('C', groupId);
  186. addItem('D');
  187. addItemToUndo('D', groupId);
  188. addItem('E');
  189. addItemToUndo('E', groupId);
  190. addItem('F');
  191. addItemToUndo('F');
  192. // Undo
  193. expect(items.length).toBe(6);
  194. undoManager.undo();
  195. expect(items.length).toBe(5);
  196. undoManager.undo();
  197. expect(items.length).toBe(2);
  198. expect(undoManager.getCommands(groupId).length).toBe(3);
  199. // Redo
  200. undoManager.redo();
  201. expect(items.length).toBe(5);
  202. undoManager.redo();
  203. expect(items.length).toBe(6);
  204. // Clear
  205. undoManager.clear();
  206. expect(undoManager.getCommands(groupId).length).toBe(0);
  207. });
  208. });