diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 7ef23418..50db1ce3 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -8518,58 +8518,53 @@ getJasmineRequireObj().Runner = function(j$) { }); this.currentlyExecutingSuites_.push(this.topSuite_); + await processor.execute(); - return new Promise(resolve => { - processor.execute(() => { - (async () => { - if (this.topSuite_.hadBeforeAllFailure) { - await this.reportChildrenOfBeforeAllFailure_(this.topSuite_); - } + if (this.topSuite_.hadBeforeAllFailure) { + await this.reportChildrenOfBeforeAllFailure_(this.topSuite_); + } - this.runableResources_.clearForRunable(this.topSuite_.id); - this.currentlyExecutingSuites_.pop(); - let overallStatus, incompleteReason; + this.runableResources_.clearForRunable(this.topSuite_.id); + this.currentlyExecutingSuites_.pop(); + let overallStatus, incompleteReason; - if ( - this.hasFailures || - this.topSuite_.result.failedExpectations.length > 0 - ) { - overallStatus = 'failed'; - } else if (this.focusedRunables_().length > 0) { - overallStatus = 'incomplete'; - incompleteReason = 'fit() or fdescribe() was found'; - } else if (totalSpecsDefined === 0) { - overallStatus = 'incomplete'; - incompleteReason = 'No specs found'; - } else { - overallStatus = 'passed'; - } + if ( + this.hasFailures || + this.topSuite_.result.failedExpectations.length > 0 + ) { + overallStatus = 'failed'; + } else if (this.focusedRunables_().length > 0) { + overallStatus = 'incomplete'; + incompleteReason = 'fit() or fdescribe() was found'; + } else if (totalSpecsDefined === 0) { + overallStatus = 'incomplete'; + incompleteReason = 'No specs found'; + } else { + overallStatus = 'passed'; + } - /** - * Information passed to the {@link Reporter#jasmineDone} event. - * @typedef JasmineDoneInfo - * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'. - * @property {Int} totalTime - The total time (in ms) that it took to execute the suite - * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete. - * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. - * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level. - * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level. - * @since 2.4.0 - */ - const jasmineDoneInfo = { - overallStatus: overallStatus, - totalTime: jasmineTimer.elapsed(), - incompleteReason: incompleteReason, - order: order, - failedExpectations: this.topSuite_.result.failedExpectations, - deprecationWarnings: this.topSuite_.result.deprecationWarnings - }; - this.topSuite_.reportedDone = true; - await this.reporter_.jasmineDone(jasmineDoneInfo); - resolve(jasmineDoneInfo); - })(); - }); - }); + /** + * Information passed to the {@link Reporter#jasmineDone} event. + * @typedef JasmineDoneInfo + * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'. + * @property {Int} totalTime - The total time (in ms) that it took to execute the suite + * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete. + * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. + * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level. + * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level. + * @since 2.4.0 + */ + const jasmineDoneInfo = { + overallStatus: overallStatus, + totalTime: jasmineTimer.elapsed(), + incompleteReason: incompleteReason, + order: order, + failedExpectations: this.topSuite_.result.failedExpectations, + deprecationWarnings: this.topSuite_.result.deprecationWarnings + }; + this.topSuite_.reportedDone = true; + await this.reporter_.jasmineDone(jasmineDoneInfo); + return jasmineDoneInfo; } reportSuiteDone_(suite, result, next) { @@ -10190,7 +10185,7 @@ getJasmineRequireObj().TreeProcessor = function() { return stats; }; - this.execute = function(done) { + this.execute = async function() { if (!processed) { this.processTree(); } @@ -10201,16 +10196,18 @@ getJasmineRequireObj().TreeProcessor = function() { const childFns = wrapChildren(tree, 0); - queueRunnerFactory({ - queueableFns: childFns, - userContext: tree.sharedUserContext(), - onException: function() { - tree.handleException.apply(tree, arguments); - }, - onComplete: done, - onMultipleDone: tree.onMultipleDone - ? tree.onMultipleDone.bind(tree) - : null + await new Promise(function(resolve) { + queueRunnerFactory({ + queueableFns: childFns, + userContext: tree.sharedUserContext(), + onException: function() { + tree.handleException.apply(tree, arguments); + }, + onComplete: resolve, + onMultipleDone: tree.onMultipleDone + ? tree.onMultipleDone.bind(tree) + : null + }); }); }; diff --git a/spec/core/TreeProcessorSpec.js b/spec/core/TreeProcessorSpec.js index 25e955e6..dc03dc18 100644 --- a/spec/core/TreeProcessorSpec.js +++ b/spec/core/TreeProcessorSpec.js @@ -274,7 +274,7 @@ describe('TreeProcessor', function() { expect(result.valid).toBe(true); }); - it('runs a single leaf', function() { + it('runs a single leaf', async function() { const leaf = new Leaf(), node = new Node({ children: [leaf], userContext: { root: 'context' } }), queueRunner = jasmine.createSpy('queueRunner'), @@ -282,25 +282,27 @@ describe('TreeProcessor', function() { tree: node, runnableIds: [leaf.id], queueRunnerFactory: queueRunner - }), - treeComplete = jasmine.createSpy('treeComplete'); + }); - processor.execute(treeComplete); + const promise = processor.execute(); expect(queueRunner).toHaveBeenCalledWith({ - onComplete: treeComplete, + onComplete: jasmine.any(Function), onException: jasmine.any(Function), userContext: { root: 'context' }, queueableFns: [{ fn: jasmine.any(Function) }], onMultipleDone: null }); - queueRunner.calls.mostRecent().args[0].queueableFns[0].fn('foo'); - + const queueRunnerArgs = queueRunner.calls.mostRecent().args[0]; + queueRunnerArgs.queueableFns[0].fn('foo'); expect(leaf.execute).toHaveBeenCalledWith(queueRunner, 'foo', false, false); + + queueRunnerArgs.onComplete(); + await expectAsync(promise).toBeResolvedTo(undefined); }); - it('runs a node with no children', function() { + it('runs a node with no children', async function() { const node = new Node({ userContext: { node: 'context' } }), root = new Node({ children: [node], userContext: { root: 'context' } }), nodeStart = jasmine.createSpy('nodeStart'), @@ -313,21 +315,20 @@ describe('TreeProcessor', function() { nodeComplete: nodeComplete, queueRunnerFactory: queueRunner }), - treeComplete = jasmine.createSpy('treeComplete'), nodeDone = jasmine.createSpy('nodeDone'); - processor.execute(treeComplete); + const promise = processor.execute(); expect(queueRunner).toHaveBeenCalledWith({ - onComplete: treeComplete, + onComplete: jasmine.any(Function), onException: jasmine.any(Function), userContext: { root: 'context' }, queueableFns: [{ fn: jasmine.any(Function) }], onMultipleDone: null }); - queueRunner.calls.mostRecent().args[0].queueableFns[0].fn(nodeDone); - + const queueRunnerArgs = queueRunner.calls.mostRecent().args[0]; + queueRunnerArgs.queueableFns[0].fn(nodeDone); expect(queueRunner).toHaveBeenCalledWith({ onComplete: jasmine.any(Function), onMultipleDone: null, @@ -348,6 +349,9 @@ describe('TreeProcessor', function() { { my: 'result' }, jasmine.any(Function) ); + + queueRunnerArgs.onComplete(); + await expectAsync(promise).toBeResolvedTo(undefined); }); it('runs a node with children', function() { diff --git a/src/core/Runner.js b/src/core/Runner.js index c9e1c70f..5fa2af1f 100644 --- a/src/core/Runner.js +++ b/src/core/Runner.js @@ -136,58 +136,53 @@ getJasmineRequireObj().Runner = function(j$) { }); this.currentlyExecutingSuites_.push(this.topSuite_); + await processor.execute(); - return new Promise(resolve => { - processor.execute(() => { - (async () => { - if (this.topSuite_.hadBeforeAllFailure) { - await this.reportChildrenOfBeforeAllFailure_(this.topSuite_); - } + if (this.topSuite_.hadBeforeAllFailure) { + await this.reportChildrenOfBeforeAllFailure_(this.topSuite_); + } - this.runableResources_.clearForRunable(this.topSuite_.id); - this.currentlyExecutingSuites_.pop(); - let overallStatus, incompleteReason; + this.runableResources_.clearForRunable(this.topSuite_.id); + this.currentlyExecutingSuites_.pop(); + let overallStatus, incompleteReason; - if ( - this.hasFailures || - this.topSuite_.result.failedExpectations.length > 0 - ) { - overallStatus = 'failed'; - } else if (this.focusedRunables_().length > 0) { - overallStatus = 'incomplete'; - incompleteReason = 'fit() or fdescribe() was found'; - } else if (totalSpecsDefined === 0) { - overallStatus = 'incomplete'; - incompleteReason = 'No specs found'; - } else { - overallStatus = 'passed'; - } + if ( + this.hasFailures || + this.topSuite_.result.failedExpectations.length > 0 + ) { + overallStatus = 'failed'; + } else if (this.focusedRunables_().length > 0) { + overallStatus = 'incomplete'; + incompleteReason = 'fit() or fdescribe() was found'; + } else if (totalSpecsDefined === 0) { + overallStatus = 'incomplete'; + incompleteReason = 'No specs found'; + } else { + overallStatus = 'passed'; + } - /** - * Information passed to the {@link Reporter#jasmineDone} event. - * @typedef JasmineDoneInfo - * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'. - * @property {Int} totalTime - The total time (in ms) that it took to execute the suite - * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete. - * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. - * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level. - * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level. - * @since 2.4.0 - */ - const jasmineDoneInfo = { - overallStatus: overallStatus, - totalTime: jasmineTimer.elapsed(), - incompleteReason: incompleteReason, - order: order, - failedExpectations: this.topSuite_.result.failedExpectations, - deprecationWarnings: this.topSuite_.result.deprecationWarnings - }; - this.topSuite_.reportedDone = true; - await this.reporter_.jasmineDone(jasmineDoneInfo); - resolve(jasmineDoneInfo); - })(); - }); - }); + /** + * Information passed to the {@link Reporter#jasmineDone} event. + * @typedef JasmineDoneInfo + * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'. + * @property {Int} totalTime - The total time (in ms) that it took to execute the suite + * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete. + * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. + * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level. + * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level. + * @since 2.4.0 + */ + const jasmineDoneInfo = { + overallStatus: overallStatus, + totalTime: jasmineTimer.elapsed(), + incompleteReason: incompleteReason, + order: order, + failedExpectations: this.topSuite_.result.failedExpectations, + deprecationWarnings: this.topSuite_.result.deprecationWarnings + }; + this.topSuite_.reportedDone = true; + await this.reporter_.jasmineDone(jasmineDoneInfo); + return jasmineDoneInfo; } reportSuiteDone_(suite, result, next) { diff --git a/src/core/TreeProcessor.js b/src/core/TreeProcessor.js index 97be7108..2349dcd3 100644 --- a/src/core/TreeProcessor.js +++ b/src/core/TreeProcessor.js @@ -27,7 +27,7 @@ getJasmineRequireObj().TreeProcessor = function() { return stats; }; - this.execute = function(done) { + this.execute = async function() { if (!processed) { this.processTree(); } @@ -38,16 +38,18 @@ getJasmineRequireObj().TreeProcessor = function() { const childFns = wrapChildren(tree, 0); - queueRunnerFactory({ - queueableFns: childFns, - userContext: tree.sharedUserContext(), - onException: function() { - tree.handleException.apply(tree, arguments); - }, - onComplete: done, - onMultipleDone: tree.onMultipleDone - ? tree.onMultipleDone.bind(tree) - : null + await new Promise(function(resolve) { + queueRunnerFactory({ + queueableFns: childFns, + userContext: tree.sharedUserContext(), + onException: function() { + tree.handleException.apply(tree, arguments); + }, + onComplete: resolve, + onMultipleDone: tree.onMultipleDone + ? tree.onMultipleDone.bind(tree) + : null + }); }); };