From fd30786ac52f96d2b2d5c87ffdce4e7dfcb23b0d Mon Sep 17 00:00:00 2001 From: "Joshua A. Horton" Date: Tue, 27 Feb 2024 13:16:33 +0700 Subject: [PATCH] feat(web): an extra unit test --- .../asyncClosureDispatchQueue.spec.ts | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/common/web/gesture-recognizer/src/test/auto/headless/asyncClosureDispatchQueue.spec.ts b/common/web/gesture-recognizer/src/test/auto/headless/asyncClosureDispatchQueue.spec.ts index 860f5134ae..1e1a864a08 100644 --- a/common/web/gesture-recognizer/src/test/auto/headless/asyncClosureDispatchQueue.spec.ts +++ b/common/web/gesture-recognizer/src/test/auto/headless/asyncClosureDispatchQueue.spec.ts @@ -63,6 +63,44 @@ describe('AsyncClosureDispatchQueue', () => { assert.isTrue(fake.called); }); + it('non-empty queue, default configuration, simple closure', async () => { + const queue = new AsyncClosureDispatchQueue(); + + const fakeTimers = sinon.useFakeTimers(); + + const lock = new ManagedPromise(); + queue.runAsync(() => lock.corePromise); + + const fake = sinon.fake(); + queue.runAsync(() => { + fake(queue.ready); + }); + + try { + assert.isFalse(queue.ready); + assert.isFalse(fake.called); + + // Doesn't matter how long we wait; there's still a pending entry in front of `fake`. + await fakeTimers.tickAsync(50); + + assert.isFalse(queue.ready); + assert.isFalse(fake.called); + + // Allow that pending entry to resolve; `fake` should be able to resolve afterward with little issue. + lock.resolve(); + await fakeTimers.tickAsync(50); + + assert.isTrue(queue.ready); + assert.isTrue(fake.called); + + // During the actual closure call, the queue is still awaiting async completion of the closure. + // Default wait: a macroqueue task + assert.isFalse(fake.firstCall.args[0]); + } finally { + fakeTimers.restore(); + } + }); + it('complex case 1 - all queued at the same time', async () => { // Uses the default timeout between events; just making it extra-explicit here. const queue = new AsyncClosureDispatchQueue(() => { return timedPromise(0) });