diff --git a/lib/jasmine-core/jasmine-html.js b/lib/jasmine-core/jasmine-html.js index 39c2c7c3..9a24248e 100644 --- a/lib/jasmine-core/jasmine-html.js +++ b/lib/jasmine-core/jasmine-html.js @@ -1102,7 +1102,9 @@ jasmineRequire.HtmlReporterV2 = function(j$) { jasmineStarted(options) { this.#stateBuilder.jasmineStarted(options); - this.#progress.start(options.totalSpecsDefined); + this.#progress.start( + options.totalSpecsDefined - options.numExcludedSpecs + ); } suiteStarted(result) { @@ -1218,7 +1220,9 @@ jasmineRequire.HtmlReporterV2 = function(j$) { } specDone(result) { - this.rootEl.value = this.rootEl.value + 1; + if (result.status !== 'excluded') { + this.rootEl.value = this.rootEl.value + 1; + } if (result.status === 'failed') { this.rootEl.classList.add('failed'); diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 79fffdca..8c64b348 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -9862,7 +9862,8 @@ getJasmineRequireObj().Runner = function(j$) { /** * Information passed to the {@link Reporter#jasmineStarted} event. * @typedef JasmineStartedInfo - * @property {Int} totalSpecsDefined - The total number of specs defined in this suite. Note that this property is not present when Jasmine is run in parallel mode. + * @property {int} totalSpecsDefined - The total number of specs defined in this suite. Note that this property is not present when Jasmine is run in parallel mode. + * @property {int} numExcludedSpecs - The number of specs that will be excluded from execution. Note that this property is not present when Jasmine is run in parallel mode. * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. Note that this property is not present when Jasmine is run in parallel mode. * @property {Boolean} parallel - Whether Jasmine is being run in parallel mode. * @since 2.0.0 @@ -9871,6 +9872,7 @@ getJasmineRequireObj().Runner = function(j$) { // In parallel mode, the jasmineStarted event is separately dispatched // by jasmine-npm. This event only reaches reporters in non-parallel. totalSpecsDefined, + numExcludedSpecs: this.#executionTree.numExcludedSpecs(), order: orderForReporting(order), parallel: false }); @@ -11977,6 +11979,23 @@ getJasmineRequireObj().TreeProcessor = function(j$) { const nodeStats = this.#stats[node.id]; return node.children ? !nodeStats.willExecute : nodeStats.excluded; } + + numExcludedSpecs(node) { + if (!node) { + return this.numExcludedSpecs(this.topSuite); + } else if (node.children) { + let result = 0; + + for (const child of node.children) { + result += this.numExcludedSpecs(child); + } + + return result; + } else { + const nodeStats = this.#stats[node.id]; + return nodeStats.willExecute ? 0 : 1; + } + } } function segmentChildren(node, orderedChildren, stats, executableIndex) { diff --git a/spec/core/TreeProcessorSpec.js b/spec/core/TreeProcessorSpec.js index b4ac43c4..8a750c9b 100644 --- a/spec/core/TreeProcessorSpec.js +++ b/spec/core/TreeProcessorSpec.js @@ -246,4 +246,53 @@ describe('TreeProcessor', function() { { spec: leaf1 } ]); }); + + describe("The returned ExecutionTree's numExcludedSpecs method", function() { + it('counts filtered-out specs', function() { + const included = new Leaf(); + const excluded1 = new Leaf(); + const excluded2 = new Leaf(); + const excluded3 = new Leaf(); + const topSuite = new Node({ + children: [ + excluded1, + new Node({ + children: [included, excluded2, new Node({ children: [excluded3] })] + }) + ] + }); + const processor = new privateUnderTest.TreeProcessor({ + tree: topSuite, + runnableIds: [topSuite.id], + excludeNode(node) { + return node.id !== included.id; + } + }); + + const executionTree = processor.processTree(); + expect(executionTree.numExcludedSpecs()).toEqual(3); + }); + + it("counts specs that aren't in or descendants of runnableIds", function() { + const includedSuite = new Node({ + children: [new Node({ children: [new Leaf()] }), new Leaf()] + }); + const directlyIncludedSpec = new Leaf(); + const topSuite = new Node({ + children: [ + includedSuite, + new Node({ + children: [new Leaf(), directlyIncludedSpec] + }) + ] + }); + const processor = new privateUnderTest.TreeProcessor({ + tree: topSuite, + runnableIds: [includedSuite.id, directlyIncludedSpec.id] + }); + + const executionTree = processor.processTree(); + expect(executionTree.numExcludedSpecs()).toEqual(1); + }); + }); }); diff --git a/spec/core/integration/EnvSpec.js b/spec/core/integration/EnvSpec.js index b6d9e320..c1886772 100644 --- a/spec/core/integration/EnvSpec.js +++ b/spec/core/integration/EnvSpec.js @@ -1557,6 +1557,7 @@ describe('Env integration', function() { expect(reporter.jasmineStarted).toHaveBeenCalledWith({ totalSpecsDefined: 1, + numExcludedSpecs: 0, order: { random: true, seed: jasmine.any(String) }, parallel: false }); @@ -1592,6 +1593,7 @@ describe('Env integration', function() { expect(reporter.jasmineStarted).toHaveBeenCalledWith({ totalSpecsDefined: 1, + numExcludedSpecs: 0, order: { random: true, seed: jasmine.any(String) }, parallel: false }); @@ -1648,6 +1650,7 @@ describe('Env integration', function() { expect(reporter.jasmineStarted).toHaveBeenCalledWith({ totalSpecsDefined: 6, + numExcludedSpecs: 3, order: { random: false }, parallel: false }); @@ -2061,6 +2064,7 @@ describe('Env integration', function() { expect(reporter.jasmineStarted).toHaveBeenCalledWith({ totalSpecsDefined: 1, + numExcludedSpecs: 1, order: { random: true, seed: jasmine.any(String) }, parallel: false }); diff --git a/spec/html/HtmlReporterV2Spec.js b/spec/html/HtmlReporterV2Spec.js index d422e817..12821f10 100644 --- a/spec/html/HtmlReporterV2Spec.js +++ b/spec/html/HtmlReporterV2Spec.js @@ -144,7 +144,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.specDone({ status: 'passed', fullName: 'a spec with a deprecation', @@ -185,7 +185,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ deprecationWarnings: [ { @@ -221,7 +221,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ deprecationWarnings: [ { @@ -240,7 +240,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ deprecationWarnings: [ { @@ -273,7 +273,7 @@ describe('HtmlReporterV2', function() { it('hides all tabs', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); const tabs = container.querySelectorAll('.jasmine-tab'); expect(tabs.length).toEqual(3); expect(tabs[0].textContent).toEqual('Spec List'); @@ -374,7 +374,10 @@ describe('HtmlReporterV2', function() { describe('with spec failures', function() { hasSpecOrSuiteFailureBehavior(function(reporter) { - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ + totalSpecsDefined: 0, + numExcludedSpecs: 0 + }); reporter.specDone({ id: 1, description: 'a failing spec', @@ -397,7 +400,10 @@ describe('HtmlReporterV2', function() { describe('with suite failures', function() { hasSpecOrSuiteFailureBehavior(function(reporter) { - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ + totalSpecsDefined: 0, + numExcludedSpecs: 0 + }); reporter.specDone({ id: 1, description: 'a failing spec', @@ -420,7 +426,10 @@ describe('HtmlReporterV2', function() { describe('without any failures', function() { hasSpecAndSuiteSuccessBehavior(function(reporter) { - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ + totalSpecsDefined: 0, + numExcludedSpecs: 0 + }); reporter.specDone({ id: 1, description: 'a passing spec', @@ -438,7 +447,10 @@ describe('HtmlReporterV2', function() { // Top suite failures are displayed in their own alert bars, so they // don't cause the failures tab to be shown. hasSpecAndSuiteSuccessBehavior(function(reporter) { - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ + totalSpecsDefined: 0, + numExcludedSpecs: 0 + }); reporter.jasmineDone({ failedExpectations: [{}] }); @@ -448,7 +460,7 @@ describe('HtmlReporterV2', function() { it('shows the slow spec view when the Performance tab is clicked', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.specDone({ duration: 1.2, failedExpectations: [], @@ -473,7 +485,7 @@ describe('HtmlReporterV2', function() { spyOn(console, 'error'); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.suiteStarted({ id: 1 }); reporter.specDone({ id: 1, @@ -497,7 +509,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ totalTime: 100 }); @@ -515,7 +527,7 @@ describe('HtmlReporterV2', function() { }); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.suiteStarted({ id: 1, description: 'A Suite', @@ -646,7 +658,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ failedExpectations: [ { @@ -675,7 +687,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ failedExpectations: [ { message: 'load error', globalErrorType: 'load' }, @@ -705,7 +717,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ failedExpectations: [ { @@ -911,7 +923,7 @@ describe('HtmlReporterV2', function() { passedExpectations: [] }; - reporter.jasmineStarted({ totalSpecsDefined: 3 }); + reporter.jasmineStarted({ totalSpecsDefined: 3, numExcludedSpecs: 0 }); reporter.specDone({ ...minimalSpecDone }); reporter.specDone({ ...minimalSpecDone }); reporter.specDone({ ...minimalSpecDone, status: 'excluded' }); @@ -929,7 +941,7 @@ describe('HtmlReporterV2', function() { }); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 1 }); + reporter.jasmineStarted({ totalSpecsDefined: 1, numExcludedSpecs: 0 }); reporter.jasmineDone({ order: { random: true } }); const skippedLink = container.querySelector('.jasmine-skipped a'); @@ -942,7 +954,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 2 }); + reporter.jasmineStarted({ totalSpecsDefined: 2, numExcludedSpecs: 0 }); reporter.specDone({ id: 123, description: 'with a spec', @@ -1008,7 +1020,10 @@ describe('HtmlReporterV2', function() { } }); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 1 }); + reporter.jasmineStarted({ + totalSpecsDefined: 1, + numExcludedSpecs: 0 + }); reporter.specDone(specStatus); reporter.jasmineDone({}); }); @@ -1030,7 +1045,10 @@ describe('HtmlReporterV2', function() { } }); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 1 }); + reporter.jasmineStarted({ + totalSpecsDefined: 1, + numExcludedSpecs: 0 + }); reporter.specDone(specStatus); reporter.jasmineDone({}); }); @@ -1066,7 +1084,7 @@ describe('HtmlReporterV2', function() { reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 1 }); + reporter.jasmineStarted({ totalSpecsDefined: 1, numExcludedSpecs: 0 }); }); it('reports the pending specs count', function() { @@ -1119,7 +1137,7 @@ describe('HtmlReporterV2', function() { reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 1 }); + reporter.jasmineStarted({ totalSpecsDefined: 1, numExcludedSpecs: 0 }); reporter.suiteStarted({ id: 1, description: 'A suite' @@ -1287,7 +1305,7 @@ describe('HtmlReporterV2', function() { }); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 1 }); + reporter.jasmineStarted({ totalSpecsDefined: 1, numExcludedSpecs: 0 }); const failingSpecResult = { id: 124, @@ -1395,7 +1413,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ overallStatus: 'passed', failedExpectations: [] @@ -1411,7 +1429,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ overallStatus: 'failed', failedExpectations: [] @@ -1427,7 +1445,7 @@ describe('HtmlReporterV2', function() { const reporter = setup(); reporter.initialize(); - reporter.jasmineStarted({ totalSpecsDefined: 0 }); + reporter.jasmineStarted({ totalSpecsDefined: 0, numExcludedSpecs: 0 }); reporter.jasmineDone({ overallStatus: 'incomplete', incompleteReason: 'because nope', diff --git a/src/core/Runner.js b/src/core/Runner.js index d8bf1ba1..15162da5 100644 --- a/src/core/Runner.js +++ b/src/core/Runner.js @@ -96,7 +96,8 @@ getJasmineRequireObj().Runner = function(j$) { /** * Information passed to the {@link Reporter#jasmineStarted} event. * @typedef JasmineStartedInfo - * @property {Int} totalSpecsDefined - The total number of specs defined in this suite. Note that this property is not present when Jasmine is run in parallel mode. + * @property {int} totalSpecsDefined - The total number of specs defined in this suite. Note that this property is not present when Jasmine is run in parallel mode. + * @property {int} numExcludedSpecs - The number of specs that will be excluded from execution. Note that this property is not present when Jasmine is run in parallel mode. * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. Note that this property is not present when Jasmine is run in parallel mode. * @property {Boolean} parallel - Whether Jasmine is being run in parallel mode. * @since 2.0.0 @@ -105,6 +106,7 @@ getJasmineRequireObj().Runner = function(j$) { // In parallel mode, the jasmineStarted event is separately dispatched // by jasmine-npm. This event only reaches reporters in non-parallel. totalSpecsDefined, + numExcludedSpecs: this.#executionTree.numExcludedSpecs(), order: orderForReporting(order), parallel: false }); diff --git a/src/core/TreeProcessor.js b/src/core/TreeProcessor.js index aebdeafa..04feb514 100644 --- a/src/core/TreeProcessor.js +++ b/src/core/TreeProcessor.js @@ -123,6 +123,23 @@ getJasmineRequireObj().TreeProcessor = function(j$) { const nodeStats = this.#stats[node.id]; return node.children ? !nodeStats.willExecute : nodeStats.excluded; } + + numExcludedSpecs(node) { + if (!node) { + return this.numExcludedSpecs(this.topSuite); + } else if (node.children) { + let result = 0; + + for (const child of node.children) { + result += this.numExcludedSpecs(child); + } + + return result; + } else { + const nodeStats = this.#stats[node.id]; + return nodeStats.willExecute ? 0 : 1; + } + } } function segmentChildren(node, orderedChildren, stats, executableIndex) { diff --git a/src/html/HtmlReporterV2.js b/src/html/HtmlReporterV2.js index cb703beb..1ca92ff5 100644 --- a/src/html/HtmlReporterV2.js +++ b/src/html/HtmlReporterV2.js @@ -112,7 +112,9 @@ jasmineRequire.HtmlReporterV2 = function(j$) { jasmineStarted(options) { this.#stateBuilder.jasmineStarted(options); - this.#progress.start(options.totalSpecsDefined); + this.#progress.start( + options.totalSpecsDefined - options.numExcludedSpecs + ); } suiteStarted(result) { @@ -228,7 +230,9 @@ jasmineRequire.HtmlReporterV2 = function(j$) { } specDone(result) { - this.rootEl.value = this.rootEl.value + 1; + if (result.status !== 'excluded') { + this.rootEl.value = this.rootEl.value + 1; + } if (result.status === 'failed') { this.rootEl.classList.add('failed');