Mercurial > hg > dml-open-vis
comparison src/DML/MainVisBundle/Resources/assets/jasmine/marionette/[t]ContextModule.30-StateHistory.js @ 0:493bcb69166c
added public content
author | Daniel Wolff |
---|---|
date | Tue, 09 Feb 2016 20:54:02 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:493bcb69166c |
---|---|
1 "use strict"; | |
2 | |
3 describe("ContextModule.StateHistory", function() { | |
4 | |
5 it("is promptly created", function() { | |
6 var testedStateHistory = new App.ContextModule.StateHistory(); | |
7 | |
8 expect(testedStateHistory).not.toBe(null); | |
9 expect(testedStateHistory.get("maxStackSize")).toEqual(50); | |
10 expect(testedStateHistory.get("currentSerializedState")).toEqual(undefined); | |
11 expect(testedStateHistory.get("compoundChangeDetector")).toEqual(undefined); | |
12 }); | |
13 | |
14 it("is promptly created with attributes", function() { | |
15 var testedStateHistory = new App.ContextModule.StateHistory({ | |
16 maxStackSize: 40, | |
17 currentSerializedState: 42, | |
18 compoundChangeDetector: function() {} | |
19 }); | |
20 | |
21 expect(testedStateHistory).not.toBe(null); | |
22 expect(testedStateHistory.get("maxStackSize")).toEqual(40); | |
23 expect(testedStateHistory.get("currentSerializedState")).toEqual(42); | |
24 expect(typeof testedStateHistory.get("compoundChangeDetector")).toEqual("function"); | |
25 }); | |
26 | |
27 it("undoes and redoes", function() { | |
28 var testedStateHistory = new App.ContextModule.StateHistory({ | |
29 currentSerializedState: {"a": 42}, | |
30 }); | |
31 expect(testedStateHistory.canUndo()).toBe(false); | |
32 expect(testedStateHistory.canRedo()).toBe(false); | |
33 | |
34 testedStateHistory.set("currentSerializedState", {"a": 42}); | |
35 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 42}); | |
36 expect(testedStateHistory.canUndo()).toBe(false); | |
37 expect(testedStateHistory.canRedo()).toBe(false); | |
38 expect(function() { | |
39 testedStateHistory.undo(); | |
40 }).toThrow(); | |
41 expect(function() { | |
42 testedStateHistory.redo(); | |
43 }).toThrow(); | |
44 | |
45 testedStateHistory.set("currentSerializedState", {"a": 43, "b": 44}); | |
46 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 43, "b": 44}); | |
47 expect(testedStateHistory.canUndo()).toBe(true); | |
48 expect(testedStateHistory.canRedo()).toBe(false); | |
49 | |
50 // The same object does not create a new state in the undo stack | |
51 testedStateHistory.set("currentSerializedState", {"a": 42}); | |
52 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 42}); | |
53 expect(testedStateHistory.canUndo()).toBe(true); | |
54 expect(testedStateHistory.canRedo()).toBe(false); | |
55 | |
56 testedStateHistory.undo(); | |
57 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 43, "b": 44}); | |
58 expect(testedStateHistory.canUndo()).toBe(true); | |
59 expect(testedStateHistory.canRedo()).toBe(true); | |
60 | |
61 testedStateHistory.undo(); | |
62 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 42}); | |
63 expect(testedStateHistory.canUndo()).toBe(false); | |
64 expect(testedStateHistory.canRedo()).toBe(true); | |
65 | |
66 expect(function() { | |
67 testedStateHistory.undo(); | |
68 }).toThrow(); | |
69 | |
70 testedStateHistory.redo(); | |
71 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 43, "b": 44}); | |
72 expect(testedStateHistory.canUndo()).toBe(true); | |
73 expect(testedStateHistory.canRedo()).toBe(true); | |
74 | |
75 testedStateHistory.redo(); | |
76 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 42}); | |
77 expect(testedStateHistory.canUndo()).toBe(true); | |
78 expect(testedStateHistory.canRedo()).toBe(false); | |
79 | |
80 testedStateHistory.undo(); | |
81 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 43, "b": 44}); | |
82 | |
83 // In current implementation redo stack is wasted even | |
84 // if the new state is exactly the same as the first element there | |
85 testedStateHistory.set("currentSerializedState", {"a": 42}); | |
86 expect(testedStateHistory.get("currentSerializedState")).toEqual({"a": 42}); | |
87 expect(testedStateHistory.canUndo()).toBe(true); | |
88 expect(testedStateHistory.canRedo()).toBe(false); | |
89 | |
90 }); | |
91 it("resets", function() { | |
92 var testedStateHistory = new App.ContextModule.StateHistory({ | |
93 currentSerializedState: {"a": 42}, | |
94 }); | |
95 testedStateHistory.set("currentSerializedState", {"a": 43, "b": 44}); | |
96 testedStateHistory.set("currentSerializedState", {"a": 43, "b": 45}); | |
97 | |
98 testedStateHistory.undo(); | |
99 expect(testedStateHistory.canUndo()).toBe(true); | |
100 expect(testedStateHistory.canRedo()).toBe(true); | |
101 | |
102 testedStateHistory.reset(); | |
103 | |
104 expect(testedStateHistory.canUndo()).toBe(false); | |
105 expect(testedStateHistory.canRedo()).toBe(false); | |
106 | |
107 }); | |
108 | |
109 it("trims undo and redo stacks", function() { | |
110 var testedStateHistory = new App.ContextModule.StateHistory({ | |
111 maxStackSize: 10, | |
112 }); | |
113 for (var i = 20; i >= 0; --i) { | |
114 testedStateHistory.set("currentSerializedState", {"x": i}); | |
115 } | |
116 for (var i = 1; i <= 10; i++) { | |
117 testedStateHistory.undo(); | |
118 expect(testedStateHistory.get("currentSerializedState")).toEqual({"x": i}); | |
119 } | |
120 expect(testedStateHistory.canUndo()).toBe(false); | |
121 expect(testedStateHistory.canRedo()).toBe(true); | |
122 expect(testedStateHistory.get("currentSerializedState")).toEqual({"x": 10}); | |
123 | |
124 testedStateHistory.set("maxStackSize", 5); | |
125 for (var i = 9; i >= 5; --i) { | |
126 testedStateHistory.redo(); | |
127 expect(testedStateHistory.get("currentSerializedState")).toEqual({"x": i}); | |
128 } | |
129 | |
130 expect(testedStateHistory.canUndo()).toBe(true); | |
131 expect(testedStateHistory.canRedo()).toBe(false); | |
132 | |
133 testedStateHistory.set("maxStackSize", 1); | |
134 testedStateHistory.undo(); | |
135 expect(testedStateHistory.canUndo()).toBe(false); | |
136 testedStateHistory.redo(); | |
137 expect(testedStateHistory.canRedo()).toBe(false); | |
138 | |
139 testedStateHistory.set("maxStackSize", 3); | |
140 testedStateHistory.set("currentSerializedState", {"x": 100}); | |
141 testedStateHistory.set("currentSerializedState", {"x": 200}); | |
142 testedStateHistory.set("currentSerializedState", {"x": 300}); | |
143 testedStateHistory.undo(); | |
144 testedStateHistory.undo(); | |
145 testedStateHistory.undo(); | |
146 expect(testedStateHistory.canUndo()).toBe(false); | |
147 }); | |
148 | |
149 it("triggers change:currentSerializedState when needed", function() { | |
150 var spyNames = [ | |
151 "change", | |
152 "change:currentSerializedState", | |
153 ]; | |
154 var spy = jasmine.createSpyObj("listener", spyNames); | |
155 var expectSpyCallCount = function() { | |
156 _.each(arguments, function(arg, i) { | |
157 //console.log("___", i, "--->", spy[spyNames[i]].calls.count(), arg); | |
158 expect(spy[spyNames[i]].calls.count()).toEqual(arg); | |
159 }); | |
160 for (var i = arguments.length; i < spyNames.length; i++) { | |
161 expect(spy[spyNames[i]].calls.count()).toEqual(0); | |
162 } | |
163 }; | |
164 var resetSpyCallCount = function() { | |
165 _.each(spyNames, function(spyName) { | |
166 spy[spyName].calls.reset(); | |
167 }); | |
168 }; | |
169 var expectSpyCallCountAndReset = function() { | |
170 expectSpyCallCount.apply(null, arguments); | |
171 resetSpyCallCount(); | |
172 }; | |
173 | |
174 var testedStateHistory = new App.ContextModule.StateHistory({ | |
175 maxStackSize: 10, | |
176 }); | |
177 | |
178 _.each(spyNames, function(spyName) { | |
179 testedStateHistory.on(spyName, spy[spyName]); | |
180 }); | |
181 | |
182 testedStateHistory.set("currentSerializedState", {"test": true}); | |
183 expectSpyCallCountAndReset(1, 1); | |
184 | |
185 testedStateHistory.set("currentSerializedState", {"test": true}); | |
186 expectSpyCallCountAndReset(0, 0); | |
187 | |
188 testedStateHistory.set("currentSerializedState", {"test": false}); | |
189 expectSpyCallCountAndReset(1, 1); | |
190 | |
191 testedStateHistory.undo(); | |
192 testedStateHistory.undo(); | |
193 expectSpyCallCountAndReset(2, 2); | |
194 | |
195 testedStateHistory.redo(); | |
196 testedStateHistory.redo(); | |
197 expectSpyCallCountAndReset(2, 2); | |
198 | |
199 testedStateHistory.undo(); | |
200 expectSpyCallCountAndReset(1, 1); | |
201 | |
202 testedStateHistory.set("currentSerializedState", {"test": true}); | |
203 expectSpyCallCountAndReset(0, 0); | |
204 | |
205 testedStateHistory.reset(); | |
206 expectSpyCallCountAndReset(1, 0); | |
207 testedStateHistory.reset(); | |
208 expectSpyCallCountAndReset(0, 0); | |
209 | |
210 }); | |
211 }); |