diff --git a/addon/@ember/test-waiters/build-waiter.ts b/addon/@ember/test-waiters/build-waiter.ts index 4d26c502..613056c7 100644 --- a/addon/@ember/test-waiters/build-waiter.ts +++ b/addon/@ember/test-waiters/build-waiter.ts @@ -89,9 +89,11 @@ class TestWaiterImpl implements TestWaiter private _getCompletedOperations(token: T) { let type = typeof token; - return token !== null || (type !== 'function' && type !== 'object') - ? this.completedOperationsForPrimitives - : this.completedOperationsForTokens; + let isFunction = type === 'function'; + let isObject = token !== null && type === 'object'; + let isPrimitive = !isFunction && !isObject; + + return isPrimitive ? this.completedOperationsForPrimitives : this.completedOperationsForTokens; } } diff --git a/tests/unit/build-waiter-test.ts b/tests/unit/build-waiter-test.ts index 5b176bcb..4e7816ca 100644 --- a/tests/unit/build-waiter-test.ts +++ b/tests/unit/build-waiter-test.ts @@ -276,4 +276,16 @@ module('build-waiter', function(hooks) { assert.equal((waiter as any).items.size, 0); }); + + test('completed operations tracking does not leak non-primitive tokens', function(assert) { + let waiter = buildWaiter('@ember/test-waiters:my-waiter'); + + const tokens = [undefined, {}, function() {}, Promise.resolve()]; + + for (let token of tokens) { + waiter.endAsync(waiter.beginAsync(token)); + } + + assert.equal((waiter as any).completedOperationsForPrimitives.size, 0); + }); });