|
212 | 212 | });
|
213 | 213 |
|
214 | 214 | suite('enqueueDebouncer & flush', function() {
|
215 |
| - function testEnqueue(shouldFlush, done) { |
216 |
| - // Longer-running debouncer |
217 |
| - const timeoutCallback = sinon.spy(() => actualCallbacks.push(timeoutCallback)); |
218 |
| - enqueueDebouncer(Debouncer.debounce(null, timeOut, timeoutCallback)); |
219 |
| - // Set of short-running debouncers enqueued in the middle of first set |
220 |
| - const nestedCallbacks = []; |
221 |
| - for (let i=0; i<150; i++) { |
222 |
| - nestedCallbacks.push(sinon.spy(() => |
223 |
| - actualCallbacks.push(nestedCallbacks[i]))); |
224 |
| - } |
225 |
| - // First set of short-running debouncers |
226 |
| - const microtaskCallbacks = []; |
227 |
| - for (let i=0; i<150; i++) { |
228 |
| - microtaskCallbacks.push(sinon.spy(() => { |
229 |
| - actualCallbacks.push(microtaskCallbacks[i]); |
230 |
| - if (i === 125) { |
231 |
| - nestedCallbacks.forEach(cb => |
232 |
| - enqueueDebouncer(Debouncer.debounce(null, microTask, cb))); |
233 |
| - } |
234 |
| - })); |
235 |
| - } |
236 |
| - microtaskCallbacks.forEach(cb => |
237 |
| - enqueueDebouncer(Debouncer.debounce(null, microTask, cb))); |
238 |
| - // Expect short before long |
239 |
| - let expectedCallbacks; |
240 |
| - const actualCallbacks = []; |
241 |
| - const verify = () => { |
242 |
| - actualCallbacks.forEach(cb => assert.isTrue(cb.calledOnce)); |
243 |
| - assert.deepEqual(expectedCallbacks, actualCallbacks); |
244 |
| - done(); |
| 215 | + |
| 216 | + const testEnqueue = (shouldFlush, done) => { |
| 217 | + const actualOrder = []; |
| 218 | + let i=1; |
| 219 | + const enqueue = (type, {db, cb} = {}) => { |
| 220 | + // cb = cb || (() => actualOrder.push(cb)); |
| 221 | + if (!cb) { |
| 222 | + cb = (() => actualOrder.push(cb)); |
| 223 | + Object.defineProperty(cb, 'name', {value: `db${i}`}); i++; |
| 224 | + } |
| 225 | + db = Debouncer.debounce(db, type, cb); |
| 226 | + enqueueDebouncer(db); |
| 227 | + return {db, cb}; |
245 | 228 | };
|
| 229 | + const db1 = enqueue(microTask); |
| 230 | + const db2 = enqueue(microTask); |
| 231 | + const db3 = enqueue(timeOut); |
| 232 | + const db4 = enqueue(microTask); |
| 233 | + enqueue(microTask, db2); |
| 234 | + enqueue(microTask, db1); |
246 | 235 | if (shouldFlush) {
|
247 |
| - expectedCallbacks = [timeoutCallback, ...microtaskCallbacks, ...nestedCallbacks]; |
248 | 236 | flush();
|
249 |
| - // When flushing, order is order of enqueing |
250 |
| - verify(); |
| 237 | + assert.deepEqual(actualOrder, [db1.cb, db2.cb, db3.cb, db4.cb]); |
| 238 | + done(); |
251 | 239 | } else {
|
252 |
| - expectedCallbacks = [...microtaskCallbacks, ...nestedCallbacks, timeoutCallback]; |
253 |
| - timeOut.run(verify); |
| 240 | + timeOut.run(() => { |
| 241 | + assert.deepEqual(actualOrder, [db4.cb, db2.cb, db1.cb, db3.cb]); |
| 242 | + done(); |
| 243 | + }); |
254 | 244 | }
|
255 |
| - } |
| 245 | + }; |
256 | 246 |
|
257 | 247 | test('non-flushed', function(done) {
|
258 | 248 | testEnqueue(false, done);
|
259 | 249 | });
|
260 | 250 |
|
261 |
| - test('flushed', function(done) { |
| 251 | + test.only('flushed', function(done) { |
262 | 252 | testEnqueue(true, done);
|
263 | 253 | });
|
264 | 254 |
|
| 255 | + test('re-enqueued ') |
| 256 | + |
265 | 257 | });
|
266 | 258 | });
|
267 | 259 | </script>
|
|
0 commit comments