UndoManagerSpec.js 5.7 KB

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