From 6715f24fd0ccbe8a53392dcd62a494db127f6271 Mon Sep 17 00:00:00 2001 From: Steve Gravrock Date: Wed, 17 Sep 2025 18:23:45 -0700 Subject: [PATCH] Move knowledge of query parameters out of boot1.js --- lib/jasmine-core/boot1.js | 17 ++-------------- lib/jasmine-core/jasmine-html.js | 19 +++++++++--------- spec/html/HtmlExactSpecFilterSpec.js | 30 ++++++++++++++++++++-------- spec/html/HtmlReporterSpec.js | 19 ++++++++++++++++-- src/boot/boot1.js | 17 ++-------------- src/html/HtmlExactSpecFilter.js | 13 +++++------- src/html/HtmlReporter.js | 6 +++++- 7 files changed, 63 insertions(+), 58 deletions(-) diff --git a/lib/jasmine-core/boot1.js b/lib/jasmine-core/boot1.js index 302fceec..c1bf086b 100644 --- a/lib/jasmine-core/boot1.js +++ b/lib/jasmine-core/boot1.js @@ -38,20 +38,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. (function() { const env = jasmine.getEnv(); - /** - * ## Runner Parameters - * - * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. - */ - const queryString = new jasmine.QueryString({ getWindowLocation: function() { return window.location; } }); - const filterSpecs = !!queryString.getParam('spec'); - const config = { stopOnSpecFailure: queryString.getParam('stopOnSpecFailure'), stopSpecOnExpectationFailure: queryString.getParam( @@ -93,7 +85,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. return document.createTextNode.apply(document, arguments); }, timer: new jasmine.Timer(), - filterSpecs: filterSpecs + queryString }); /** @@ -105,12 +97,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /** * Filter which specs will be run by matching the start of the full name against the `spec` query param. */ - const specFilter = new jasmine.HtmlExactSpecFilter({ - filterString: function() { - return queryString.getParam('spec'); - } - }); - + const specFilter = new jasmine.HtmlExactSpecFilter({ queryString }); config.specFilter = function(spec) { return specFilter.matches(spec); }; diff --git a/lib/jasmine-core/jasmine-html.js b/lib/jasmine-core/jasmine-html.js index 93b10583..c1878cb5 100644 --- a/lib/jasmine-core/jasmine-html.js +++ b/lib/jasmine-core/jasmine-html.js @@ -99,10 +99,14 @@ jasmineRequire.HtmlReporter = function(j$) { const getContainer = options.getContainer; const createElement = options.createElement; const createTextNode = options.createTextNode; + // TODO: in the next major release, replace navigateWithNewParam and + // addToExistingQueryString with direct usage of options.queryString const navigateWithNewParam = options.navigateWithNewParam || function() {}; const addToExistingQueryString = options.addToExistingQueryString || defaultQueryString; - const filterSpecs = options.filterSpecs; + const filterSpecs = options.queryString + ? !!options.queryString.getParam('spec') + : options.filterSpecs; // For compatibility with pre-5.11 boot files let htmlReporterMain; let symbols; const deprecationWarnings = []; @@ -1032,16 +1036,13 @@ jasmineRequire.HtmlExactSpecFilter = function() { /** * Create a filter instance. - * @param options Object with a filterString method, which should - * return the value of the "spec" query string parameter set by - * {@link HtmlReporter}. + * @param options Object with a queryString property, which should be an + * instance of {@link QueryString}. */ constructor(options) { - if (typeof options?.filterString !== 'function') { - throw new Error('options.filterString must be a function'); - } - - this.#getFilterString = options.filterString; + this.#getFilterString = function() { + return options.queryString.getParam('spec'); + }; } /** diff --git a/spec/html/HtmlExactSpecFilterSpec.js b/spec/html/HtmlExactSpecFilterSpec.js index 9fcef7d3..ada0c49e 100644 --- a/spec/html/HtmlExactSpecFilterSpec.js +++ b/spec/html/HtmlExactSpecFilterSpec.js @@ -1,8 +1,10 @@ describe('HtmlExactSpecFilter', function() { it('matches everything when no string is provided', function() { const specFilter = new jasmineUnderTest.HtmlExactSpecFilter({ - filterString() { - return ''; + queryString: { + getParam(name) { + return ''; + } } }); @@ -11,8 +13,12 @@ describe('HtmlExactSpecFilter', function() { it('matches a spec with the exact same path', function() { const specFilter = new jasmineUnderTest.HtmlExactSpecFilter({ - filterString() { - return '["a","b","c"]'; + queryString: { + getParam(name) { + if (name === 'spec') { + return '["a","b","c"]'; + } + } } }); @@ -21,8 +27,12 @@ describe('HtmlExactSpecFilter', function() { it('matches a spec whose path has the filter path as a prefix', function() { const specFilter = new jasmineUnderTest.HtmlExactSpecFilter({ - filterString() { - return '["a","b"]'; + queryString: { + getParam(name) { + if (name === 'spec') { + return '["a","b"]'; + } + } } }); @@ -31,8 +41,12 @@ describe('HtmlExactSpecFilter', function() { it('does not match a spec with a different path', function() { const specFilter = new jasmineUnderTest.HtmlExactSpecFilter({ - filterString() { - return '["a","b","c"]'; + queryString: { + getParam(name) { + if (name === 'spec') { + return '["a","b","c"]'; + } + } } }); diff --git a/spec/html/HtmlReporterSpec.js b/spec/html/HtmlReporterSpec.js index fc06c560..a62fd187 100644 --- a/spec/html/HtmlReporterSpec.js +++ b/spec/html/HtmlReporterSpec.js @@ -1368,6 +1368,11 @@ describe('HtmlReporter', function() { }, createTextNode: function() { return document.createTextNode.apply(document, arguments); + }, + queryString: { + getParam(name) { + return ''; + } } }; specStatus = { @@ -1382,7 +1387,12 @@ describe('HtmlReporter', function() { describe('when the specs are not filtered', function() { beforeEach(function() { - reporterConfig.filterSpecs = false; + reporterConfig.queryString.getParam = function(name) { + if (name !== 'spec') { + throw new Error('Unexpected query param ' + name); + } + return ''; + }; reporter = new jasmineUnderTest.HtmlReporter(reporterConfig); reporter.initialize(); reporter.jasmineStarted({ totalSpecsDefined: 1 }); @@ -1400,7 +1410,12 @@ describe('HtmlReporter', function() { describe('when the specs are filtered', function() { beforeEach(function() { - reporterConfig.filterSpecs = true; + reporterConfig.queryString.getParam = function(name) { + if (name !== 'spec') { + throw new Error('Unexpected query param ' + name); + } + return 'not the empty string'; + }; reporter = new jasmineUnderTest.HtmlReporter(reporterConfig); reporter.initialize(); reporter.jasmineStarted({ totalSpecsDefined: 1 }); diff --git a/src/boot/boot1.js b/src/boot/boot1.js index 39327ca7..45547069 100644 --- a/src/boot/boot1.js +++ b/src/boot/boot1.js @@ -14,20 +14,12 @@ (function() { const env = jasmine.getEnv(); - /** - * ## Runner Parameters - * - * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. - */ - const queryString = new jasmine.QueryString({ getWindowLocation: function() { return window.location; } }); - const filterSpecs = !!queryString.getParam('spec'); - const config = { stopOnSpecFailure: queryString.getParam('stopOnSpecFailure'), stopSpecOnExpectationFailure: queryString.getParam( @@ -69,7 +61,7 @@ return document.createTextNode.apply(document, arguments); }, timer: new jasmine.Timer(), - filterSpecs: filterSpecs + queryString }); /** @@ -81,12 +73,7 @@ /** * Filter which specs will be run by matching the start of the full name against the `spec` query param. */ - const specFilter = new jasmine.HtmlExactSpecFilter({ - filterString: function() { - return queryString.getParam('spec'); - } - }); - + const specFilter = new jasmine.HtmlExactSpecFilter({ queryString }); config.specFilter = function(spec) { return specFilter.matches(spec); }; diff --git a/src/html/HtmlExactSpecFilter.js b/src/html/HtmlExactSpecFilter.js index f4209c7c..a027648c 100644 --- a/src/html/HtmlExactSpecFilter.js +++ b/src/html/HtmlExactSpecFilter.js @@ -10,16 +10,13 @@ jasmineRequire.HtmlExactSpecFilter = function() { /** * Create a filter instance. - * @param options Object with a filterString method, which should - * return the value of the "spec" query string parameter set by - * {@link HtmlReporter}. + * @param options Object with a queryString property, which should be an + * instance of {@link QueryString}. */ constructor(options) { - if (typeof options?.filterString !== 'function') { - throw new Error('options.filterString must be a function'); - } - - this.#getFilterString = options.filterString; + this.#getFilterString = function() { + return options.queryString.getParam('spec'); + }; } /** diff --git a/src/html/HtmlReporter.js b/src/html/HtmlReporter.js index ed011091..88cafae1 100644 --- a/src/html/HtmlReporter.js +++ b/src/html/HtmlReporter.js @@ -64,10 +64,14 @@ jasmineRequire.HtmlReporter = function(j$) { const getContainer = options.getContainer; const createElement = options.createElement; const createTextNode = options.createTextNode; + // TODO: in the next major release, replace navigateWithNewParam and + // addToExistingQueryString with direct usage of options.queryString const navigateWithNewParam = options.navigateWithNewParam || function() {}; const addToExistingQueryString = options.addToExistingQueryString || defaultQueryString; - const filterSpecs = options.filterSpecs; + const filterSpecs = options.queryString + ? !!options.queryString.getParam('spec') + : options.filterSpecs; // For compatibility with pre-5.11 boot files let htmlReporterMain; let symbols; const deprecationWarnings = [];