diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 7e91e3ec..f5eb6b5c 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -781,9 +781,7 @@ getJasmineRequireObj().Spec = function(j$) { #throwOnExpectationFailure; #timer; #metadata; - // TODO: better naming. Don't make 'excluded' mean two things. - #dynamicallyExcluded; - #requireExpectations; + #executionState; constructor(attrs) { this.expectationFactory = attrs.expectationFactory; @@ -815,23 +813,23 @@ getJasmineRequireObj().Spec = function(j$) { this.#throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; this.#timer = attrs.timer || new j$.Timer(); + this.reset(); + if (!this.queueableFn.fn) { this.exclude(); } - - this.reset(); } addExpectationResult(passed, data, isError) { const expectationResult = j$.private.buildExpectationResult(data); if (passed) { - this.result.passedExpectations.push(expectationResult); + this.#executionState.passedExpectations.push(expectationResult); } else { if (this.reportedDone) { this.onLateError(expectationResult); } else { - this.result.failedExpectations.push(expectationResult); + this.#executionState.failedExpectations.push(expectationResult); } if (this.#throwOnExpectationFailure && !isError) { @@ -841,8 +839,8 @@ getJasmineRequireObj().Spec = function(j$) { } getSpecProperty(key) { - this.result.properties = this.result.properties || {}; - return this.result.properties[key]; + this.#executionState.properties = this.#executionState.properties || {}; + return this.#executionState.properties[key]; } setSpecProperty(key, value) { @@ -851,8 +849,8 @@ getJasmineRequireObj().Spec = function(j$) { // Throw a better one now. j$.private.util.assertReporterCloneable(key, 'Key'); j$.private.util.assertReporterCloneable(value, 'Value'); - this.result.properties = this.result.properties || {}; - this.result.properties[key] = value; + this.#executionState.properties = this.#executionState.properties || {}; + this.#executionState.properties[key] = value; } executionStarted() { @@ -860,17 +858,17 @@ getJasmineRequireObj().Spec = function(j$) { } executionFinished(excluded, failSpecWithNoExp) { - this.#dynamicallyExcluded = excluded; - this.#requireExpectations = failSpecWithNoExp; + this.#executionState.dynamicallyExcluded = excluded; + this.#executionState.requireExpectations = failSpecWithNoExp; if (this.#autoCleanClosures) { this.queueableFn.fn = null; } - this.result.duration = this.#timer.elapsed(); + this.#executionState.duration = this.#timer.elapsed(); if (this.status() !== 'failed') { - this.result.debugLogs = null; + this.#executionState.debugLogs = null; } } @@ -889,24 +887,20 @@ getJasmineRequireObj().Spec = function(j$) { } reset() { - this.result = { - id: this.id, - description: this.description, - fullName: this.getFullName(), - parentSuiteId: this.parentSuiteId, - filename: this.filename, + this.#executionState = { failedExpectations: [], passedExpectations: [], deprecationWarnings: [], pendingReason: this.excludeMessage || '', duration: null, properties: null, - debugLogs: null + debugLogs: null, + // TODO: better naming. Don't make 'excluded' mean two things. + dynamicallyExcluded: false, + requireExpectations: false, + markedPending: this.markedExcluding }; - this.markedPending = this.markedExcluding; this.reportedDone = false; - this.#dynamicallyExcluded = false; - this.#requireExpectations = false; } startedEvent() { @@ -965,7 +959,7 @@ getJasmineRequireObj().Spec = function(j$) { ]; for (const k of toCopy) { - event[k] = this.result[k]; + event[k] = this.#executionState[k]; } return event; @@ -1003,12 +997,16 @@ getJasmineRequireObj().Spec = function(j$) { } pend(message) { - this.markedPending = true; + this.#executionState.markedPending = true; if (message) { - this.result.pendingReason = message; + this.#executionState.pendingReason = message; } } + get markedPending() { + return this.#executionState.markedPending; + } + // Like pend(), but pending state will survive reset(). // Useful for fit, xit, where pending state remains. exclude(message) { @@ -1019,15 +1017,8 @@ getJasmineRequireObj().Spec = function(j$) { this.pend(message); } - // TODO: ensure that all access to result goes through .getResult() - // so that the status is correct. - // Step 1: fix things so getResult() always returns correct status - getResult() { - return this.result; - } - status() { - if (this.#dynamicallyExcluded) { + if (this.#executionState.dynamicallyExcluded) { return 'excluded'; } @@ -1036,10 +1027,10 @@ getJasmineRequireObj().Spec = function(j$) { } if ( - this.result.failedExpectations.length > 0 || - (this.#requireExpectations && - this.result.failedExpectations.length + - this.result.passedExpectations.length === + this.#executionState.failedExpectations.length > 0 || + (this.#executionState.requireExpectations && + this.#executionState.failedExpectations.length + + this.#executionState.passedExpectations.length === 0) ) { return 'failed'; @@ -1056,14 +1047,14 @@ getJasmineRequireObj().Spec = function(j$) { if (typeof deprecation === 'string') { deprecation = { message: deprecation }; } - this.result.deprecationWarnings.push( + this.#executionState.deprecationWarnings.push( j$.private.buildExpectationResult(deprecation) ); } debugLog(msg) { - if (!this.result.debugLogs) { - this.result.debugLogs = []; + if (!this.#executionState.debugLogs) { + this.#executionState.debugLogs = []; } /** @@ -1072,7 +1063,7 @@ getJasmineRequireObj().Spec = function(j$) { * @property {number} timestamp - The time when the entry was added, in * milliseconds from the spec's start time */ - this.result.debugLogs.push({ + this.#executionState.debugLogs.push({ message: msg, timestamp: this.#timer.elapsed() }); diff --git a/spec/core/SpecSpec.js b/spec/core/SpecSpec.js index a15cf9d9..8969acf0 100644 --- a/spec/core/SpecSpec.js +++ b/spec/core/SpecSpec.js @@ -85,7 +85,7 @@ describe('Spec', function() { spec.setSpecProperty('a', 4); - expect(spec.result.properties).toEqual({ a: 4 }); + expect(spec.doneEvent().properties).toEqual({ a: 4 }); }); it('replace the property result when it was previously set', function() { @@ -97,7 +97,7 @@ describe('Spec', function() { spec.setSpecProperty('b', 'original-value'); spec.setSpecProperty('a', 'new-value'); - expect(spec.result.properties).toEqual({ + expect(spec.doneEvent().properties).toEqual({ a: 'new-value', b: 'original-value' }); @@ -272,10 +272,10 @@ describe('Spec', function() { spec.addExpectationResult(true, { message: 'expectation1' }); spec.addExpectationResult(false, { message: 'expectation2' }); - expect(spec.result.passedExpectations).toEqual([ + expect(spec.doneEvent().passedExpectations).toEqual([ jasmine.objectContaining({ message: 'expectation1' }) ]); - expect(spec.result.failedExpectations).toEqual([ + expect(spec.doneEvent().failedExpectations).toEqual([ jasmine.objectContaining({ message: 'expectation2' }) ]); }); @@ -292,7 +292,7 @@ describe('Spec', function() { spec.addExpectationResult(false, { message: 'failed' }); }).toThrowError(jasmineUnderTest.private.errors.ExpectationFailed); - expect(spec.result.failedExpectations).toEqual([ + expect(spec.doneEvent().failedExpectations).toEqual([ jasmine.objectContaining({ message: 'failed' }) ]); }); @@ -306,7 +306,7 @@ describe('Spec', function() { spec.addExpectationResult(false, { message: 'failed' }); - expect(spec.result.failedExpectations).toEqual([ + expect(spec.doneEvent().failedExpectations).toEqual([ jasmine.objectContaining({ message: 'failed' }) ]); }); @@ -335,7 +335,7 @@ describe('Spec', function() { message: jasmine.stringMatching(/^Error: nope/) }) ); - expect(spec.result.failedExpectations).toEqual([]); + expect(spec.doneEvent().failedExpectations).toEqual([]); }); it('does not forward non-late expectation failures to onLateError', function() { @@ -372,7 +372,7 @@ describe('Spec', function() { message: jasmine.stringMatching(/^Error: oops/) }) ); - expect(spec.result.failedExpectations).toEqual([]); + expect(spec.doneEvent().failedExpectations).toEqual([]); }); it('does not forward non-late handleException calls to onLateError', function() { @@ -386,7 +386,7 @@ describe('Spec', function() { spec.handleException(error); expect(onLateError).not.toHaveBeenCalled(); - expect(spec.result.failedExpectations.length).toEqual(1); + expect(spec.doneEvent().failedExpectations.length).toEqual(1); }); it('clears the reportedDone flag when reset', function() { @@ -449,7 +449,7 @@ describe('Spec', function() { spec.handleException('foo'); - expect(spec.result.failedExpectations).toEqual([ + expect(spec.doneEvent().failedExpectations).toEqual([ { message: 'foo thrown', matcherName: '', @@ -469,7 +469,7 @@ describe('Spec', function() { new jasmineUnderTest.private.errors.ExpectationFailed() ); - expect(spec.result.failedExpectations).toEqual([]); + expect(spec.doneEvent().failedExpectations).toEqual([]); }); }); @@ -483,15 +483,15 @@ describe('Spec', function() { const t1 = 123; const t2 = 456; - expect(spec.result.debugLogs).toBeNull(); + expect(spec.doneEvent().debugLogs).toBeNull(); timer.elapsed.and.returnValue(t1); spec.debugLog('msg 1'); - expect(spec.result.debugLogs).toEqual([ + expect(spec.doneEvent().debugLogs).toEqual([ { message: 'msg 1', timestamp: t1 } ]); timer.elapsed.and.returnValue(t2); spec.debugLog('msg 2'); - expect(spec.result.debugLogs).toEqual([ + expect(spec.doneEvent().debugLogs).toEqual([ { message: 'msg 1', timestamp: t1 }, { message: 'msg 2', timestamp: t2 } ]); @@ -506,7 +506,7 @@ describe('Spec', function() { spec.debugLog('msg'); spec.executionFinished(); - expect(spec.result.debugLogs).toBeNull(); + expect(spec.doneEvent().debugLogs).toBeNull(); }); }); @@ -525,7 +525,7 @@ describe('Spec', function() { spec.handleException(new Error('nope')); spec.executionFinished(); - expect(spec.result.debugLogs).toEqual([ + expect(spec.doneEvent().debugLogs).toEqual([ { message: 'msg', timestamp: timestamp } ]); }); diff --git a/spec/core/TreeRunnerSpec.js b/spec/core/TreeRunnerSpec.js index 6241b9e2..fa8677ef 100644 --- a/spec/core/TreeRunnerSpec.js +++ b/spec/core/TreeRunnerSpec.js @@ -64,7 +64,7 @@ describe('TreeRunner', function() { expect(currentRunableTracker.currentSpec()).toBeFalsy(); expect(runableResources.clearForRunable).toHaveBeenCalledWith(spec.id); expect(reportDispatcher.specDone).toHaveBeenCalledWith(spec.doneEvent()); - expect(spec.result.duration).toEqual('the elapsed time'); + expect(spec.doneEvent().duration).toEqual('the elapsed time'); expect(spec.reportedDone).toEqual(true); await Promise.resolve(); await Promise.resolve(); diff --git a/src/core/Spec.js b/src/core/Spec.js index 618cff3e..02fc561c 100644 --- a/src/core/Spec.js +++ b/src/core/Spec.js @@ -4,9 +4,7 @@ getJasmineRequireObj().Spec = function(j$) { #throwOnExpectationFailure; #timer; #metadata; - // TODO: better naming. Don't make 'excluded' mean two things. - #dynamicallyExcluded; - #requireExpectations; + #executionState; constructor(attrs) { this.expectationFactory = attrs.expectationFactory; @@ -38,23 +36,23 @@ getJasmineRequireObj().Spec = function(j$) { this.#throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; this.#timer = attrs.timer || new j$.Timer(); + this.reset(); + if (!this.queueableFn.fn) { this.exclude(); } - - this.reset(); } addExpectationResult(passed, data, isError) { const expectationResult = j$.private.buildExpectationResult(data); if (passed) { - this.result.passedExpectations.push(expectationResult); + this.#executionState.passedExpectations.push(expectationResult); } else { if (this.reportedDone) { this.onLateError(expectationResult); } else { - this.result.failedExpectations.push(expectationResult); + this.#executionState.failedExpectations.push(expectationResult); } if (this.#throwOnExpectationFailure && !isError) { @@ -64,8 +62,8 @@ getJasmineRequireObj().Spec = function(j$) { } getSpecProperty(key) { - this.result.properties = this.result.properties || {}; - return this.result.properties[key]; + this.#executionState.properties = this.#executionState.properties || {}; + return this.#executionState.properties[key]; } setSpecProperty(key, value) { @@ -74,8 +72,8 @@ getJasmineRequireObj().Spec = function(j$) { // Throw a better one now. j$.private.util.assertReporterCloneable(key, 'Key'); j$.private.util.assertReporterCloneable(value, 'Value'); - this.result.properties = this.result.properties || {}; - this.result.properties[key] = value; + this.#executionState.properties = this.#executionState.properties || {}; + this.#executionState.properties[key] = value; } executionStarted() { @@ -83,17 +81,17 @@ getJasmineRequireObj().Spec = function(j$) { } executionFinished(excluded, failSpecWithNoExp) { - this.#dynamicallyExcluded = excluded; - this.#requireExpectations = failSpecWithNoExp; + this.#executionState.dynamicallyExcluded = excluded; + this.#executionState.requireExpectations = failSpecWithNoExp; if (this.#autoCleanClosures) { this.queueableFn.fn = null; } - this.result.duration = this.#timer.elapsed(); + this.#executionState.duration = this.#timer.elapsed(); if (this.status() !== 'failed') { - this.result.debugLogs = null; + this.#executionState.debugLogs = null; } } @@ -112,24 +110,20 @@ getJasmineRequireObj().Spec = function(j$) { } reset() { - this.result = { - id: this.id, - description: this.description, - fullName: this.getFullName(), - parentSuiteId: this.parentSuiteId, - filename: this.filename, + this.#executionState = { failedExpectations: [], passedExpectations: [], deprecationWarnings: [], pendingReason: this.excludeMessage || '', duration: null, properties: null, - debugLogs: null + debugLogs: null, + // TODO: better naming. Don't make 'excluded' mean two things. + dynamicallyExcluded: false, + requireExpectations: false, + markedPending: this.markedExcluding }; - this.markedPending = this.markedExcluding; this.reportedDone = false; - this.#dynamicallyExcluded = false; - this.#requireExpectations = false; } startedEvent() { @@ -188,7 +182,7 @@ getJasmineRequireObj().Spec = function(j$) { ]; for (const k of toCopy) { - event[k] = this.result[k]; + event[k] = this.#executionState[k]; } return event; @@ -226,12 +220,16 @@ getJasmineRequireObj().Spec = function(j$) { } pend(message) { - this.markedPending = true; + this.#executionState.markedPending = true; if (message) { - this.result.pendingReason = message; + this.#executionState.pendingReason = message; } } + get markedPending() { + return this.#executionState.markedPending; + } + // Like pend(), but pending state will survive reset(). // Useful for fit, xit, where pending state remains. exclude(message) { @@ -242,15 +240,8 @@ getJasmineRequireObj().Spec = function(j$) { this.pend(message); } - // TODO: ensure that all access to result goes through .getResult() - // so that the status is correct. - // Step 1: fix things so getResult() always returns correct status - getResult() { - return this.result; - } - status() { - if (this.#dynamicallyExcluded) { + if (this.#executionState.dynamicallyExcluded) { return 'excluded'; } @@ -259,10 +250,10 @@ getJasmineRequireObj().Spec = function(j$) { } if ( - this.result.failedExpectations.length > 0 || - (this.#requireExpectations && - this.result.failedExpectations.length + - this.result.passedExpectations.length === + this.#executionState.failedExpectations.length > 0 || + (this.#executionState.requireExpectations && + this.#executionState.failedExpectations.length + + this.#executionState.passedExpectations.length === 0) ) { return 'failed'; @@ -279,14 +270,14 @@ getJasmineRequireObj().Spec = function(j$) { if (typeof deprecation === 'string') { deprecation = { message: deprecation }; } - this.result.deprecationWarnings.push( + this.#executionState.deprecationWarnings.push( j$.private.buildExpectationResult(deprecation) ); } debugLog(msg) { - if (!this.result.debugLogs) { - this.result.debugLogs = []; + if (!this.#executionState.debugLogs) { + this.#executionState.debugLogs = []; } /** @@ -295,7 +286,7 @@ getJasmineRequireObj().Spec = function(j$) { * @property {number} timestamp - The time when the entry was added, in * milliseconds from the spec's start time */ - this.result.debugLogs.push({ + this.#executionState.debugLogs.push({ message: msg, timestamp: this.#timer.elapsed() });