|
1 | | -import { mockClock, mockRequestIdleCallback } from '../../test' |
| 1 | +import { mockClock, mockRequestIdleCallback, registerCleanupTask } from '../../test' |
2 | 2 | import { createTaskQueue, MAX_EXECUTION_TIME_ON_TIMEOUT } from './taskQueue' |
3 | 3 |
|
4 | 4 | describe('createTaskQueue', () => { |
@@ -57,4 +57,37 @@ describe('createTaskQueue', () => { |
57 | 57 | expect(task2).toHaveBeenCalled() |
58 | 58 | expect(task3).not.toHaveBeenCalled() |
59 | 59 | }) |
| 60 | + |
| 61 | + it('runs pending tasks when requestIdleCallback invokes the callback with no deadline', () => { |
| 62 | + const clock = mockClock() |
| 63 | + replaceRequestIdleCallbackWithPolyfillShim() |
| 64 | + |
| 65 | + const taskQueue = createTaskQueue() |
| 66 | + const task1 = jasmine.createSpy('task1') |
| 67 | + const task2 = jasmine.createSpy('task2') |
| 68 | + const task3 = jasmine.createSpy('task3') |
| 69 | + |
| 70 | + taskQueue.push(task1) |
| 71 | + taskQueue.push(task2) |
| 72 | + taskQueue.push(task3) |
| 73 | + |
| 74 | + clock.tick(0) |
| 75 | + |
| 76 | + expect(task1).toHaveBeenCalled() |
| 77 | + expect(task2).toHaveBeenCalled() |
| 78 | + expect(task3).toHaveBeenCalled() |
| 79 | + }) |
60 | 80 | }) |
| 81 | + |
| 82 | +function replaceRequestIdleCallbackWithPolyfillShim() { |
| 83 | + const originalRequestIdleCallback = window.requestIdleCallback |
| 84 | + const originalCancelIdleCallback = window.cancelIdleCallback |
| 85 | + // Reproduces `(cb) => setTimeout(cb, 0)` β invokes the callback with no argument. |
| 86 | + window.requestIdleCallback = ((cb: () => void) => |
| 87 | + setTimeout(() => cb(), 0) as unknown as number) as typeof window.requestIdleCallback |
| 88 | + window.cancelIdleCallback = ((id: number) => clearTimeout(id)) as typeof window.cancelIdleCallback |
| 89 | + registerCleanupTask(() => { |
| 90 | + window.requestIdleCallback = originalRequestIdleCallback |
| 91 | + window.cancelIdleCallback = originalCancelIdleCallback |
| 92 | + }) |
| 93 | +} |
0 commit comments