Compare commits

...

13 Commits

Author SHA1 Message Date
Steve Gravrock
d9023b1fde Bump version to 7.0.0-pre.0
Some checks failed
Test in latest available Safari / build (push) Has been cancelled
2026-02-22 14:08:32 -08:00
Steve Gravrock
27319fd6ae Merge branch 'main' into 7.0 2026-02-22 10:13:11 -08:00
Steve Gravrock
d230b0500d Test against 5.0 branch of jasmine-browser-runner 2026-02-21 12:57:26 -08:00
Steve Gravrock
c6520763d8 Re-add version() to Node module exports 2026-02-21 12:12:54 -08:00
Steve Gravrock
e087ebc419 Merge branch 'main' into 7.0 2026-02-21 11:19:51 -08:00
Steve Gravrock
63ac7da082 Prevent monkey patching
This doesn't affect globals (describe, it, expect, etc). Those belong to
the user and Jasmine doesn't depend on them.
2026-02-16 20:30:29 -08:00
Steve Gravrock
281c0d1ee8 Convert ParallelReportDispatcher to an ES6 class
ParallelReportDispatcher itself doesn't gain anything from this, but
it'll allow monkey patching prevention to be implemented and tested
more uniformly.
2026-02-16 16:36:06 -08:00
Steve Gravrock
8bb325628f Depend on 7.0 branch of -npm 2026-02-16 16:35:23 -08:00
Steve Gravrock
ff0699035f Merge branch 'main' into 7.0 2026-02-16 07:28:22 -08:00
Steve Gravrock
f12f4395f0 Redesigned moudule system
* Top level private APIs (e.g. jasmine.private.whatever) are no longer
  exposed
* jasmineRequire is no longer exposed
* core is self-booting
* Globals are automatically created in browsers. (They can subsequently
  be removed by user code if desired.)
* Globals are *not* automatically created in Node. An installGlobals
  function is exported instead. The jasmine package calls installGlobals
  unless configured not to do so.
* In Node, the same instance is returned each time jasmine-core is
  imported. A reset function is exported. It effectively resets all state
  by discarding the env and creating a new one. This allows mulitple
  sequential runs within the same process to be independent of each
  other, but does not allow multiple concurrent runs. (That probably never
  worked anyway.)

Fixes #2094
2026-02-15 20:16:45 -08:00
Steve Gravrock
03006080d4 rm deprecated jsApiReporter 2025-11-28 09:53:15 -08:00
Steve Gravrock
876de65803 rm monkey patch warnings 2025-11-28 09:53:15 -08:00
Steve Gravrock
8b3c4ce3b4 Remove HtmlReporter, HtmlSpecFilter, and supporting internal code 2025-11-28 09:53:15 -08:00
149 changed files with 1699 additions and 4581 deletions

View File

@@ -41,13 +41,11 @@ Jasmine tests itself. The files in `lib` are loaded first, defining the referenc
The tests should always use `jasmineUnderTest` to refer to the objects and functions that are being tested. But the tests can use functions on `jasmine` as needed. _Be careful how you structure any new test code_. Copy the patterns you see in the existing code - this ensures that the code you're testing is not leaking into the `jasmine` reference and vice-versa. The tests should always use `jasmineUnderTest` to refer to the objects and functions that are being tested. But the tests can use functions on `jasmine` as needed. _Be careful how you structure any new test code_. Copy the patterns you see in the existing code - this ensures that the code you're testing is not leaking into the `jasmine` reference and vice-versa.
### `boot0.js` and `boot1.js` ### `boot.js`
These files file does all of the setup necessary for Jasmine to work in a This file does all the setup necessary for Jasmine to work in a browser. While
browser. They load all of the code, create an `Env`, attach the global the default in `lib`is appropriate for most uses, users may wish to customize
functions, and build the reporter. It also sets up the execution of the this file.
`Env` - for browsers this is in `window.onload`. While the default in `lib`
is appropriate for browsers, projects may wish to customize this file.
### Compatibility ### Compatibility

View File

@@ -24,70 +24,26 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict'; 'use strict';
/** const path = require('path');
* Note: Only available on Node. const fs = require('fs');
* @module jasmine-core const {
*/ globals,
installGlobals,
version,
private$
} = require('./jasmine-core/jasmine.js');
const jasmineRequire = require('./jasmine-core/jasmine.js'); function reset() {
module.exports = jasmineRequire; private$.currentEnv_ = null;
const env = jasmine.getEnv({ suppressLoadErrors: true });
const bootWithoutGlobals = (function() { rebindInterface(env);
let jasmine, jasmineInterface; }
return function bootWithoutGlobals(reinitialize) {
if (!jasmineInterface || reinitialize === true) {
jasmine = jasmineRequire.core(jasmineRequire);
const env = jasmine.getEnv({ suppressLoadErrors: true });
jasmineInterface = jasmineRequire.interface(jasmine, env);
}
return { jasmine, jasmineInterface };
};
})();
/**
* Boots a copy of Jasmine and returns an object as described in {@link jasmine}.
* @param {boolean} [reinitialize=true] Whether to create a new copy of Jasmine if one already exists
* @type {function}
* @return {jasmine}
*/
module.exports.boot = function(reinitialize) {
if (reinitialize === undefined) {
reinitialize = true;
}
const { jasmine, jasmineInterface } = bootWithoutGlobals(reinitialize);
for (const k in jasmineInterface) {
global[k] = jasmineInterface[k];
}
return jasmine;
};
/**
* Boots a copy of Jasmine and returns an object containing the properties
* that would normally be added to the global object. If noGlobals is called
* multiple times, the same object is returned every time.
*
* @example
* const {describe, beforeEach, it, expect, jasmine} = require('jasmine-core').noGlobals();
*/
module.exports.noGlobals = function() {
const { jasmineInterface } = bootWithoutGlobals(false);
return jasmineInterface;
};
const path = require('path'),
fs = require('fs');
const rootPath = path.join(__dirname, 'jasmine-core'), const rootPath = path.join(__dirname, 'jasmine-core'),
bootFiles = ['boot0.js', 'boot1.js'], bootFiles = ['boot.js'],
legacyBootFiles = ['boot.js'],
cssFiles = [], cssFiles = [],
jsFiles = [], jsFiles = [],
jsFilesToSkip = ['jasmine.js'].concat(bootFiles, legacyBootFiles); jsFilesToSkip = ['jasmine.js'].concat(bootFiles);
fs.readdirSync(rootPath).forEach(function(file) { fs.readdirSync(rootPath).forEach(function(file) {
if (fs.statSync(path.join(rootPath, file)).isFile()) { if (fs.statSync(path.join(rootPath, file)).isFile()) {
@@ -104,12 +60,40 @@ fs.readdirSync(rootPath).forEach(function(file) {
} }
}); });
module.exports.files = { /**
self: __filename, * Note: Only available on Node.
path: rootPath, *
bootDir: rootPath, * In addition to the members documented here, this module's exports include all
bootFiles: bootFiles, * {@link globals}.
cssFiles: cssFiles, * @module jasmine-core
jsFiles: ['jasmine.js'].concat(jsFiles), */
imagesDir: path.join(__dirname, '../images') module.exports = {
...globals,
/**
* Copies Jasmine globals (jasmine, describe, it, etc) to the specified
* object or to globalThis.
* @function
* @param {object} [dest] - The object to copy globals to.
*/
installGlobals,
/**
* Returns the jasmine-core version.
* @function
*/
version,
/**
* Resets all of jasmine-core's state, including removing specs, suites, and
* reporters, and resetting configuration to the default.
* @function
*/
reset,
files: {
self: __filename,
path: rootPath,
bootDir: rootPath,
bootFiles: bootFiles,
cssFiles: cssFiles,
jsFiles: ['jasmine.js'].concat(jsFiles),
imagesDir: path.join(__dirname, '../images')
}
}; };

View File

@@ -24,19 +24,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict'; 'use strict';
/**
This file finishes 'booting' Jasmine, performing all of the necessary
initialization before executing the loaded environment and all of a project's
specs. This file should be loaded after `boot0.js` but before any project
source files or spec files are loaded. Thus this file can also be used to
customize Jasmine for a project.
If a project is using Jasmine via the standalone distribution, this file can
be customized directly. If you only wish to configure the Jasmine env, you
can load another file that calls `jasmine.getEnv().configure({...})`
after `boot0.js` is loaded and before this file is loaded.
*/
(function() { (function() {
const env = jasmine.getEnv(); const env = jasmine.getEnv();
const urls = new jasmine.HtmlReporterV2Urls(); const urls = new jasmine.HtmlReporterV2Urls();

View File

@@ -1,68 +0,0 @@
/*
Copyright (c) 2008-2019 Pivotal Labs
Copyright (c) 2008-2026 The Jasmine developers
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
'use strict';
/**
This file starts the process of "booting" Jasmine. It initializes Jasmine,
makes its globals available, and creates the env. This file should be loaded
after `jasmine.js` and `jasmine_html.js`, but before `boot1.js` or any project
source files or spec files are loaded.
*/
(function() {
const jasmineRequire = window.jasmineRequire || require('./jasmine.js');
/**
* ## Require & Instantiate
*
* Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference.
*/
const jasmine = jasmineRequire.core(jasmineRequire),
global = jasmine.getGlobal();
global.jasmine = jasmine;
/**
* Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference.
*/
jasmineRequire.html(jasmine);
/**
* Create the Jasmine environment. This is used to run all specs in a project.
*/
const env = jasmine.getEnv();
/**
* ## The Global Interface
*
* Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged.
*/
const jasmineInterface = jasmineRequire.interface(jasmine, env);
/**
* Add all of the Jasmine global/public interface to the global scope, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`.
*/
for (const property in jasmineInterface) {
global[property] = jasmineInterface[property];
}
})();

View File

@@ -22,321 +22,50 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
// eslint-disable-next-line no-var (function() {
var jasmineRequire = window.jasmineRequire || require('./jasmine.js'); // eslint-disable-next-line no-unused-vars
const getJasmineHtmlRequireObj = (function() {
jasmineRequire.html = function(j$) {
j$.private.ResultsNode = jasmineRequire.ResultsNode();
j$.private.ResultsStateBuilder = jasmineRequire.ResultsStateBuilder(j$);
j$.private.htmlReporterUtils = jasmineRequire.htmlReporterUtils(j$);
j$.private.AlertsView = jasmineRequire.AlertsView(j$);
j$.private.OverallStatusBar = jasmineRequire.OverallStatusBar(j$);
j$.private.Banner = jasmineRequire.Banner(j$);
j$.private.SymbolsView = jasmineRequire.SymbolsView(j$);
j$.private.SummaryTreeView = jasmineRequire.SummaryTreeView(j$);
j$.private.FailuresView = jasmineRequire.FailuresView(j$);
j$.private.PerformanceView = jasmineRequire.PerformanceView(j$);
j$.private.TabBar = jasmineRequire.TabBar(j$);
j$.HtmlReporter = jasmineRequire.HtmlReporter(j$);
j$.HtmlReporterV2Urls = jasmineRequire.HtmlReporterV2Urls(j$);
j$.HtmlReporterV2 = jasmineRequire.HtmlReporterV2(j$);
j$.QueryString = jasmineRequire.QueryString();
j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(j$);
j$.private.HtmlSpecFilterV2 = jasmineRequire.HtmlSpecFilterV2();
};
jasmineRequire.HtmlReporter = function(j$) {
'use strict'; 'use strict';
const htmlRequire = {};
const { createDom, noExpectations } = j$.private.htmlReporterUtils; function getJasmineHtmlRequire() {
return htmlRequire;
/**
* @class HtmlReporter
* @classdesc Displays results and allows re-running individual specs and suites.
* @implements {Reporter}
* @param options Options object. See lib/jasmine-core/boot1.js for details.
* @since 1.2.0
* @deprecated Use {@link HtmlReporterV2} instead.
*/
class HtmlReporter {
#env;
#getContainer;
#navigateWithNewParam;
#urlBuilder;
#filterSpecs;
#stateBuilder;
#config;
#htmlReporterMain;
// Sub-views
#alerts;
#symbols;
#banner;
#failures;
constructor(options) {
this.#env = options.env;
this.#getContainer = options.getContainer;
this.#navigateWithNewParam =
options.navigateWithNewParam || function() {};
this.#urlBuilder = new UrlBuilder(
options.addToExistingQueryString || defaultQueryString
);
this.#filterSpecs = options.filterSpecs;
}
/**
* Initializes the reporter. Should be called before {@link Env#execute}.
* @function
* @name HtmlReporter#initialize
*/
initialize() {
this.#env.deprecated(
'HtmlReporter and HtmlSpecFilter are deprecated. Use HtmlReporterV2 instead.'
);
this.#clearPrior();
this.#config = this.#env ? this.#env.configuration() : {};
this.#stateBuilder = new j$.private.ResultsStateBuilder();
this.#alerts = new j$.private.AlertsView(this.#urlBuilder);
this.#symbols = new j$.private.SymbolsView();
this.#banner = new j$.private.Banner(this.#navigateWithNewParam);
this.#failures = new j$.private.FailuresView(this.#urlBuilder);
this.#htmlReporterMain = createDom(
'div',
{ className: 'jasmine_html-reporter' },
this.#banner.rootEl,
this.#symbols.rootEl,
this.#alerts.rootEl,
this.#failures.rootEl
);
this.#getContainer().appendChild(this.#htmlReporterMain);
}
jasmineStarted(options) {
this.#stateBuilder.jasmineStarted(options);
}
suiteStarted(result) {
this.#stateBuilder.suiteStarted(result);
}
suiteDone(result) {
this.#stateBuilder.suiteDone(result);
if (result.status === 'failed') {
this.#failures.append(result, this.#stateBuilder.currentParent);
}
}
specStarted() {}
specDone(result) {
this.#stateBuilder.specDone(result);
this.#symbols.append(result, this.#config);
if (noExpectations(result)) {
const noSpecMsg = "Spec '" + result.fullName + "' has no expectations.";
if (result.status === 'failed') {
// eslint-disable-next-line no-console
console.error(noSpecMsg);
} else {
// eslint-disable-next-line no-console
console.warn(noSpecMsg);
}
}
if (result.status === 'failed') {
this.#failures.append(result, this.#stateBuilder.currentParent);
}
}
jasmineDone(doneResult) {
this.#stateBuilder.jasmineDone(doneResult);
this.#banner.showOptionsMenu(this.#config);
if (
this.#stateBuilder.specsExecuted < this.#stateBuilder.totalSpecsDefined
) {
this.#alerts.addSkipped(
this.#stateBuilder.specsExecuted,
this.#stateBuilder.totalSpecsDefined
);
}
const statusBar = new j$.private.OverallStatusBar(this.#urlBuilder);
statusBar.showDone(doneResult, this.#stateBuilder);
this.#alerts.addBar(statusBar.rootEl);
if (doneResult.failedExpectations) {
for (const f of doneResult.failedExpectations) {
this.#alerts.addGlobalFailure(f);
}
}
for (const dw of this.#stateBuilder.deprecationWarnings) {
this.#alerts.addDeprecationWarning(dw);
}
const results = this.#find('.jasmine-results');
const summary = new j$.private.SummaryTreeView(
this.#urlBuilder,
this.#filterSpecs
);
summary.addResults(this.#stateBuilder.topResults);
results.appendChild(summary.rootEl);
if (this.#stateBuilder.anyNonTopSuiteFailures) {
this.#addFailureToggle();
this.#setMenuModeTo('jasmine-failure-list');
this.#failures.show();
}
}
#addFailureToggle() {
const onClickFailures = () => this.#setMenuModeTo('jasmine-failure-list');
const onClickSpecList = () => this.#setMenuModeTo('jasmine-spec-list');
const failuresLink = createDom(
'a',
{ className: 'jasmine-failures-menu', href: '#' },
'Failures'
);
let specListLink = createDom(
'a',
{ className: 'jasmine-spec-list-menu', href: '#' },
'Spec List'
);
failuresLink.onclick = function() {
onClickFailures();
return false;
};
specListLink.onclick = function() {
onClickSpecList();
return false;
};
this.#alerts.addBar(
createDom(
'span',
{ className: 'jasmine-menu jasmine-bar jasmine-spec-list' },
[createDom('span', {}, 'Spec List | '), failuresLink]
)
);
this.#alerts.addBar(
createDom(
'span',
{ className: 'jasmine-menu jasmine-bar jasmine-failure-list' },
[specListLink, createDom('span', {}, ' | Failures ')]
)
);
}
#find(selector) {
return this.#getContainer().querySelector(
'.jasmine_html-reporter ' + selector
);
}
#clearPrior() {
const oldReporter = this.#find('');
if (oldReporter) {
this.#getContainer().removeChild(oldReporter);
}
}
#setMenuModeTo(mode) {
this.#htmlReporterMain.setAttribute(
'class',
'jasmine_html-reporter ' + mode
);
}
} }
class UrlBuilder { htmlRequire.html = function(j$, private$) {
#addToExistingQueryString; if (!private$) {
private$ = {};
constructor(addToExistingQueryString) {
this.#addToExistingQueryString = function(k, v) {
// include window.location.pathname to fix issue with karma-jasmine-html-reporter in angular: see https://github.com/jasmine/jasmine/issues/1906
return (
(window.location.pathname || '') + addToExistingQueryString(k, v)
);
};
} }
suiteHref(suite) { private$.ResultsNode = htmlRequire.ResultsNode();
const els = []; private$.ResultsStateBuilder = htmlRequire.ResultsStateBuilder(
j$,
while (suite && suite.parent) { private$
els.unshift(suite.result.description);
suite = suite.parent;
}
return this.#addToExistingQueryString('spec', els.join(' '));
}
specHref(result) {
return this.#addToExistingQueryString('spec', result.fullName);
}
runAllHref() {
return this.#addToExistingQueryString('spec', '');
}
seedHref(seed) {
return this.#addToExistingQueryString('seed', seed);
}
}
function defaultQueryString(key, value) {
return '?' + key + '=' + value;
}
return HtmlReporter;
};
jasmineRequire.HtmlSpecFilter = function(j$) {
'use strict';
/**
* @class HtmlSpecFilter
* @param options Options object. See lib/jasmine-core/boot1.js for details.
* @deprecated Use {@link HtmlReporterV2Urls} instead.
*/
function HtmlSpecFilter(options) {
const env = options?.env ?? j$.getEnv();
env.deprecated(
'HtmlReporter and HtmlSpecFilter are deprecated. Use HtmlReporterV2 instead.'
); );
private$.htmlReporterUtils = htmlRequire.htmlReporterUtils(j$, private$);
private$.AlertsView = htmlRequire.AlertsView(j$, private$);
private$.OverallStatusBar = htmlRequire.OverallStatusBar(j$, private$);
private$.Banner = htmlRequire.Banner(j$, private$);
private$.SummaryTreeView = htmlRequire.SummaryTreeView(j$, private$);
private$.FailuresView = htmlRequire.FailuresView(j$, private$);
private$.PerformanceView = htmlRequire.PerformanceView(j$, private$);
private$.TabBar = htmlRequire.TabBar(j$, private$);
private$.HtmlSpecFilterV2 = htmlRequire.HtmlSpecFilterV2();
const filterString = for (const k of ['HtmlReporterV2Urls', 'HtmlReporterV2', 'QueryString']) {
options && Object.defineProperty(j$, k, {
options.filterString && enumerable: true,
options.filterString() && configurable: false,
options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); writable: false,
const filterPattern = new RegExp(filterString); value: htmlRequire[k](j$, private$)
});
}
};
/** return getJasmineHtmlRequire;
* Determines whether the spec with the specified name should be executed. })();
* @name HtmlSpecFilter#matches
* @function
* @param {string} specName The full name of the spec
* @returns {boolean}
*/
this.matches = function(specName) {
return filterPattern.test(specName);
};
}
return HtmlSpecFilter; getJasmineHtmlRequireObj().ResultsNode = function() {
};
jasmineRequire.ResultsNode = function() {
'use strict'; 'use strict';
function ResultsNode(result, type, parent) { function ResultsNode(result, type, parent) {
@@ -362,7 +91,7 @@ jasmineRequire.ResultsNode = function() {
return ResultsNode; return ResultsNode;
}; };
jasmineRequire.QueryString = function() { getJasmineHtmlRequireObj().QueryString = function() {
'use strict'; 'use strict';
/** /**
@@ -378,6 +107,7 @@ jasmineRequire.QueryString = function() {
*/ */
constructor(options) { constructor(options) {
this.#getWindowLocation = options.getWindowLocation; this.#getWindowLocation = options.getWindowLocation;
Object.freeze(this);
} }
/** /**
@@ -445,13 +175,14 @@ jasmineRequire.QueryString = function() {
return '?' + qStrPairs.join('&'); return '?' + qStrPairs.join('&');
} }
Object.freeze(QueryString.prototype);
return QueryString; return QueryString;
}; };
jasmineRequire.AlertsView = function(j$) { getJasmineHtmlRequireObj().AlertsView = function(j$, private$) {
'use strict'; 'use strict';
const { createDom } = j$.private.htmlReporterUtils; const { createDom } = private$.htmlReporterUtils;
const errorBarClassName = 'jasmine-bar jasmine-errored'; const errorBarClassName = 'jasmine-bar jasmine-errored';
const afterAllMessagePrefix = 'AfterAll '; const afterAllMessagePrefix = 'AfterAll ';
@@ -567,10 +298,10 @@ jasmineRequire.AlertsView = function(j$) {
return AlertsView; return AlertsView;
}; };
jasmineRequire.Banner = function(j$) { getJasmineHtmlRequireObj().Banner = function(j$, private$) {
'use strict'; 'use strict';
const { createDom } = j$.private.htmlReporterUtils; const { createDom } = private$.htmlReporterUtils;
class Banner { class Banner {
#navigateWithNewParam; #navigateWithNewParam;
@@ -729,10 +460,10 @@ jasmineRequire.Banner = function(j$) {
return Banner; return Banner;
}; };
jasmineRequire.FailuresView = function(j$) { getJasmineHtmlRequireObj().FailuresView = function(j$, private$) {
'use strict'; 'use strict';
const { createDom } = j$.private.htmlReporterUtils; const { createDom } = private$.htmlReporterUtils;
class FailuresView { class FailuresView {
#urlBuilder; #urlBuilder;
@@ -896,7 +627,7 @@ jasmineRequire.FailuresView = function(j$) {
return FailuresView; return FailuresView;
}; };
jasmineRequire.htmlReporterUtils = function(j$) { getJasmineHtmlRequireObj().htmlReporterUtils = function(j$, private$) {
'use strict'; 'use strict';
function createDom(type, attrs, childrenArrayOrVarArgs) { function createDom(type, attrs, childrenArrayOrVarArgs) {
@@ -949,10 +680,10 @@ jasmineRequire.htmlReporterUtils = function(j$) {
return { createDom, noExpectations }; return { createDom, noExpectations };
}; };
jasmineRequire.HtmlReporterV2 = function(j$) { getJasmineHtmlRequireObj().HtmlReporterV2 = function(j$, private$) {
'use strict'; 'use strict';
const { createDom, noExpectations } = j$.private.htmlReporterUtils; const { createDom, noExpectations } = private$.htmlReporterUtils;
const specListTabId = 'jasmine-specListTab'; const specListTabId = 'jasmine-specListTab';
const failuresTabId = 'jasmine-failuresTab'; const failuresTabId = 'jasmine-failuresTab';
@@ -1008,14 +739,14 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
this.#config = options.env ? options.env.configuration() : {}; this.#config = options.env ? options.env.configuration() : {};
this.#stateBuilder = new j$.private.ResultsStateBuilder(); this.#stateBuilder = new private$.ResultsStateBuilder();
this.#alerts = new j$.private.AlertsView(this.#urlBuilder); this.#alerts = new private$.AlertsView(this.#urlBuilder);
this.#statusBar = new j$.private.OverallStatusBar(this.#urlBuilder); this.#statusBar = new private$.OverallStatusBar(this.#urlBuilder);
this.#statusBar.showRunning(); this.#statusBar.showRunning();
this.#alerts.addBar(this.#statusBar.rootEl); this.#alerts.addBar(this.#statusBar.rootEl);
this.#tabBar = new j$.private.TabBar( this.#tabBar = new private$.TabBar(
[ [
{ id: specListTabId, label: 'Spec List' }, { id: specListTabId, label: 'Spec List' },
{ id: failuresTabId, label: 'Failures' }, { id: failuresTabId, label: 'Failures' },
@@ -1034,11 +765,11 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
this.#alerts.addBar(this.#tabBar.rootEl); this.#alerts.addBar(this.#tabBar.rootEl);
this.#progress = new ProgressView(); this.#progress = new ProgressView();
this.#banner = new j$.private.Banner( this.#banner = new private$.Banner(
this.#queryString.navigateWithNewParam.bind(this.#queryString), this.#queryString.navigateWithNewParam.bind(this.#queryString),
true true
); );
this.#failures = new j$.private.FailuresView(this.#urlBuilder); this.#failures = new private$.FailuresView(this.#urlBuilder);
this.#htmlReporterMain = createDom( this.#htmlReporterMain = createDom(
'div', 'div',
{ className: 'jasmine_html-reporter' }, { className: 'jasmine_html-reporter' },
@@ -1049,6 +780,8 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
); );
this.#container.appendChild(this.#htmlReporterMain); this.#container.appendChild(this.#htmlReporterMain);
this.#failures.show(); this.#failures.show();
Object.freeze(this);
} }
jasmineStarted(options) { jasmineStarted(options) {
@@ -1119,13 +852,13 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
} }
const results = this.#find('.jasmine-results'); const results = this.#find('.jasmine-results');
const summary = new j$.private.SummaryTreeView( const summary = new private$.SummaryTreeView(
this.#urlBuilder, this.#urlBuilder,
this.#filterSpecs this.#filterSpecs
); );
summary.addResults(this.#stateBuilder.topResults); summary.addResults(this.#stateBuilder.topResults);
results.appendChild(summary.rootEl); results.appendChild(summary.rootEl);
const perf = new j$.private.PerformanceView(); const perf = new private$.PerformanceView();
perf.addResults(this.#stateBuilder.topResults); perf.addResults(this.#stateBuilder.topResults);
results.appendChild(perf.rootEl); results.appendChild(perf.rootEl);
this.#tabBar.showTab(specListTabId); this.#tabBar.showTab(specListTabId);
@@ -1226,10 +959,11 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
} }
} }
Object.freeze(HtmlReporterV2.prototype);
return HtmlReporterV2; return HtmlReporterV2;
}; };
jasmineRequire.HtmlReporterV2Urls = function(j$) { getJasmineHtmlRequireObj().HtmlReporterV2Urls = function(j$, private$) {
'use strict'; 'use strict';
// TODO unify with V2 UrlBuilder? // TODO unify with V2 UrlBuilder?
@@ -1249,6 +983,8 @@ jasmineRequire.HtmlReporterV2Urls = function(j$) {
return window.location; return window.location;
} }
}); });
Object.freeze(this);
} }
/** /**
@@ -1280,7 +1016,7 @@ jasmineRequire.HtmlReporterV2Urls = function(j$) {
config.seed = seed; config.seed = seed;
} }
const specFilter = new j$.private.HtmlSpecFilterV2({ const specFilter = new private$.HtmlSpecFilterV2({
filterParams: () => ({ filterParams: () => ({
path: this.queryString.getParam('path'), path: this.queryString.getParam('path'),
spec: this.queryString.getParam('spec') spec: this.queryString.getParam('spec')
@@ -1299,10 +1035,11 @@ jasmineRequire.HtmlReporterV2Urls = function(j$) {
} }
} }
Object.freeze(HtmlReporterV2Urls.prototype);
return HtmlReporterV2Urls; return HtmlReporterV2Urls;
}; };
jasmineRequire.HtmlSpecFilterV2 = function() { getJasmineHtmlRequireObj().HtmlSpecFilterV2 = function() {
class HtmlSpecFilterV2 { class HtmlSpecFilterV2 {
#getFilterParams; #getFilterParams;
@@ -1344,10 +1081,10 @@ jasmineRequire.HtmlSpecFilterV2 = function() {
return HtmlSpecFilterV2; return HtmlSpecFilterV2;
}; };
jasmineRequire.OverallStatusBar = function(j$) { getJasmineHtmlRequireObj().OverallStatusBar = function(j$, private$) {
'use strict'; 'use strict';
const { createDom } = j$.private.htmlReporterUtils; const { createDom } = private$.htmlReporterUtils;
const staticClassNames = 'jasmine-overall-result jasmine-bar'; const staticClassNames = 'jasmine-overall-result jasmine-bar';
class OverallStatusBar { class OverallStatusBar {
@@ -1453,8 +1190,8 @@ jasmineRequire.OverallStatusBar = function(j$) {
return OverallStatusBar; return OverallStatusBar;
}; };
jasmineRequire.PerformanceView = function(j$) { getJasmineHtmlRequireObj().PerformanceView = function(j$, private$) {
const createDom = j$.private.htmlReporterUtils.createDom; const createDom = private$.htmlReporterUtils.createDom;
const MAX_SLOW_SPECS = 20; const MAX_SLOW_SPECS = 20;
class PerformanceView { class PerformanceView {
@@ -1552,12 +1289,12 @@ jasmineRequire.PerformanceView = function(j$) {
return PerformanceView; return PerformanceView;
}; };
jasmineRequire.ResultsStateBuilder = function(j$) { getJasmineHtmlRequireObj().ResultsStateBuilder = function(j$, private$) {
'use strict'; 'use strict';
class ResultsStateBuilder { class ResultsStateBuilder {
constructor() { constructor() {
this.topResults = new j$.private.ResultsNode({}, '', null); this.topResults = new private$.ResultsNode({}, '', null);
this.currentParent = this.topResults; this.currentParent = this.topResults;
this.suitesById = {}; this.suitesById = {};
this.totalSpecsDefined = 0; this.totalSpecsDefined = 0;
@@ -1635,10 +1372,10 @@ jasmineRequire.ResultsStateBuilder = function(j$) {
return ResultsStateBuilder; return ResultsStateBuilder;
}; };
jasmineRequire.SummaryTreeView = function(j$) { getJasmineHtmlRequireObj().SummaryTreeView = function(j$, private$) {
'use strict'; 'use strict';
const { createDom, noExpectations } = j$.private.htmlReporterUtils; const { createDom, noExpectations } = private$.htmlReporterUtils;
class SummaryTreeView { class SummaryTreeView {
#urlBuilder; #urlBuilder;
@@ -1744,48 +1481,8 @@ jasmineRequire.SummaryTreeView = function(j$) {
return SummaryTreeView; return SummaryTreeView;
}; };
jasmineRequire.SymbolsView = function(j$) { getJasmineHtmlRequireObj().TabBar = function(j$, private$) {
'use strict'; const createDom = private$.htmlReporterUtils.createDom;
const { createDom, noExpectations } = j$.private.htmlReporterUtils;
class SymbolsView {
constructor() {
this.rootEl = createDom('ul', {
className: 'jasmine-symbol-summary'
});
}
append(result, config) {
this.rootEl.appendChild(
createDom('li', {
className: this.#className(result, config),
id: 'spec_' + result.id,
title: result.fullName
})
);
}
#className(result, config) {
if (noExpectations(result) && result.status === 'passed') {
return 'jasmine-empty';
} else if (result.status === 'excluded') {
if (config.hideDisabled) {
return 'jasmine-excluded-no-display';
} else {
return 'jasmine-excluded';
}
} else {
return 'jasmine-' + result.status;
}
}
}
return SymbolsView;
};
jasmineRequire.TabBar = function(j$) {
const createDom = j$.private.htmlReporterUtils.createDom;
class TabBar { class TabBar {
#tabs; #tabs;
@@ -1861,3 +1558,10 @@ jasmineRequire.TabBar = function(j$) {
return TabBar; return TabBar;
}; };
(function() {
'use strict';
getJasmineHtmlRequireObj().html(jasmine);
})();
})()

View File

@@ -24,7 +24,6 @@ body {
line-height: 14px; line-height: 14px;
} }
.jasmine_html-reporter .jasmine-banner, .jasmine_html-reporter .jasmine-banner,
.jasmine_html-reporter .jasmine-symbol-summary,
.jasmine_html-reporter .jasmine-summary, .jasmine_html-reporter .jasmine-summary,
.jasmine_html-reporter .jasmine-result-message, .jasmine_html-reporter .jasmine-result-message,
.jasmine_html-reporter .jasmine-spec .jasmine-description, .jasmine_html-reporter .jasmine-spec .jasmine-description,
@@ -65,57 +64,6 @@ body {
padding-right: 9px; padding-right: 9px;
font-size: 12px; font-size: 12px;
} }
.jasmine_html-reporter .jasmine-symbol-summary {
overflow: hidden;
margin: 14px 0;
}
.jasmine_html-reporter .jasmine-symbol-summary li {
display: inline-block;
height: 10px;
width: 14px;
font-size: 16px;
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed {
font-size: 14px;
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed:before {
color: #007069;
content: "•";
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed {
line-height: 9px;
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before {
color: #ca3a11;
content: "×";
font-weight: bold;
margin-left: -1px;
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded {
font-size: 14px;
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded:before {
color: #bababa;
content: "•";
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded-no-display {
font-size: 14px;
display: none;
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending {
line-height: 17px;
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending:before {
color: #ba9d37;
content: "*";
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty {
font-size: 14px;
}
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty:before {
color: #ba9d37;
content: "•";
}
.jasmine_html-reporter progress { .jasmine_html-reporter progress {
width: 100%; width: 100%;
} }
@@ -197,12 +145,10 @@ body {
.jasmine_html-reporter .jasmine-bar a { .jasmine_html-reporter .jasmine-bar a {
color: white; color: white;
} }
.jasmine_html-reporter.jasmine-spec-list .jasmine-bar.jasmine-menu.jasmine-failure-list,
.jasmine_html-reporter.jasmine-spec-list .jasmine-results .jasmine-failures, .jasmine_html-reporter.jasmine-spec-list .jasmine-results .jasmine-failures,
.jasmine_html-reporter.jasmine-spec-list .jasmine-performance-view { .jasmine_html-reporter.jasmine-spec-list .jasmine-performance-view {
display: none; display: none;
} }
.jasmine_html-reporter.jasmine-failure-list .jasmine-bar.jasmine-menu.jasmine-spec-list,
.jasmine_html-reporter.jasmine-failure-list .jasmine-summary, .jasmine_html-reporter.jasmine-failure-list .jasmine-summary,
.jasmine_html-reporter.jasmine-failure-list .jasmine-performance-view { .jasmine_html-reporter.jasmine-failure-list .jasmine-performance-view {
display: none; display: none;

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "jasmine-core", "name": "jasmine-core",
"license": "MIT", "license": "MIT",
"version": "6.1.0", "version": "7.0.0-pre.0",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/jasmine/jasmine.git" "url": "https://github.com/jasmine/jasmine.git"
@@ -28,6 +28,9 @@
"description": "Simple JavaScript testing framework for browsers and node.js", "description": "Simple JavaScript testing framework for browsers and node.js",
"homepage": "https://jasmine.github.io", "homepage": "https://jasmine.github.io",
"main": "./lib/jasmine-core.js", "main": "./lib/jasmine-core.js",
"exports": {
".": "./lib/jasmine-core.js"
},
"files": [ "files": [
"LICENSE", "LICENSE",
"README.md", "README.md",
@@ -45,8 +48,8 @@
"eslint-plugin-compat": "^6.0.2", "eslint-plugin-compat": "^6.0.2",
"glob": "^13.0.0", "glob": "^13.0.0",
"globals": "^16.0.0", "globals": "^16.0.0",
"jasmine": "github:jasmine/jasmine-npm", "jasmine": "github:jasmine/jasmine-npm#7.0",
"jasmine-browser-runner": "github:jasmine/jasmine-browser-runner", "jasmine-browser-runner": "github:jasmine/jasmine-browser-runner#5.0",
"jsdom": "^26.0.0", "jsdom": "^26.0.0",
"prettier": "1.17.1", "prettier": "1.17.1",
"sass": "^1.58.3" "sass": "^1.58.3"

View File

@@ -0,0 +1,58 @@
# Jasmine Core 7.0.0-pre.0 Release Notes
This is a pre-release, intended to offer a preview of breaking changes and to
solicit feedback.
Before installing this release, update to 6.0.1 or later and fix all
deprecation warnings.
## Breaking changes
* `HtmlReporter`, `HtmlSpecFilter`, and `jsApiReporter`, which were deprecated
in 6.0, have been removed.
* Most private APIs are no longer exposed.
* Monkey patching is blocked. This does not affect globals (`describe`,
`expect`, etc.) or properties that are explicitly documented as writeable.
Those can still be overwritten.
* Redesigned boot process:
* `jasmineRequire`, `boot`, and `noGlobals` have been removed.
* The core instance is automatically created.
* In browsers, globals are automatically created.
* In Node, globals are not automatically created. Call the exported
`installGlobals` function to create them. If you're using the `jasmine`
package, this is done for you by default.
* In Node, the same instance is returned every time jasmine-core is imported.
If you need to do multiple consecutive independent test runs, call the
exported `reset` function to reset all state and configuration between runs.
If you maintain your own browser boot files, you may be able to update by just
removing `boot1.js`. See the `boot.js` file in this package for a working
example. If you boot jasmine-core in Node, remove the call to `boot` or
`noGlobals` and add a call to `installGlobals` if desired:
```javascript
const jasmineCore = require('jasmine-core');
jasmineCore.installGlobals();
```
## Supported environments
This version has been tested in the following environments.
| Environment | Supported versions |
|-------------------|--------------------------------|
| Node | 20, 22, 24 |
| Safari | 26.3** |
| Chrome | 144* |
| Firefox | 102**, 115**, 128**, 140, 147* |
| Edge | 144* |
\* Evergreen browser. Each version of Jasmine is tested against the latest
version available at release time.<br>
\** Supported on a best-effort basis. Support for these versions may be dropped
if it becomes impractical, and bugs affecting only these versions may not be
treated as release blockers.
------
_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_

View File

@@ -42,8 +42,7 @@ async function zipStandaloneDist(jasmineVersion) {
'lib/jasmine-core/jasmine.js', 'lib/jasmine-core/jasmine.js',
'lib/jasmine-core/jasmine-html.js', 'lib/jasmine-core/jasmine-html.js',
'lib/jasmine-core/jasmine.css', 'lib/jasmine-core/jasmine.css',
'lib/jasmine-core/boot0.js', 'lib/jasmine-core/boot.js',
'lib/jasmine-core/boot1.js',
], ],
destDir: 'lib/jasmine-' + jasmineVersion destDir: 'lib/jasmine-' + jasmineVersion
}, },

View File

@@ -34,18 +34,20 @@ function concatFiles() {
const configs = [ const configs = [
{ {
src: [ src: [
{ literal: '(function() {' },
'src/html/requireHtml.js', 'src/html/requireHtml.js',
'src/html/HtmlReporter.js',
'src/html/HtmlSpecFilter.js',
'src/html/ResultsNode.js', 'src/html/ResultsNode.js',
'src/html/QueryString.js', 'src/html/QueryString.js',
'src/html/**/*.js' { glob: 'src/html/**/*.js', exclude: 'src/html/requireSuffix.js' },
'src/html/requireSuffix.js',
{ literal: '})()' },
], ],
dest: 'lib/jasmine-core/jasmine-html.js', dest: 'lib/jasmine-core/jasmine-html.js',
}, },
{ {
dest: 'lib/jasmine-core/jasmine.js', dest: 'lib/jasmine-core/jasmine.js',
src: [ src: [
{ literal: '(function() {' },
'src/core/requireCore.js', 'src/core/requireCore.js',
'src/core/matchers/requireMatchers.js', 'src/core/matchers/requireMatchers.js',
'src/core/base.js', 'src/core/base.js',
@@ -53,23 +55,20 @@ function concatFiles() {
'src/core/Spec.js', 'src/core/Spec.js',
'src/core/Order.js', 'src/core/Order.js',
'src/core/Env.js', 'src/core/Env.js',
'src/core/JsApiReporter.js',
'src/core/PrettyPrinter', 'src/core/PrettyPrinter',
'src/core/Suite', 'src/core/Suite',
'src/core/**/*.js', { glob: 'src/core/**/*.js', exclude: 'src/core/requireSuffix.js'},
{ {
template: 'src/version.js', template: 'src/version.js',
data: {version: pkg.version} data: {version: pkg.version}
}, },
'src/core/requireSuffix.js',
{ literal: '})()' },
], ],
}, },
{ {
dest: 'lib/jasmine-core/boot0.js', dest: 'lib/jasmine-core/boot.js',
src: ['src/boot/boot0.js'], src: ['src/boot/boot.js'],
},
{
dest: 'lib/jasmine-core/boot1.js',
src: ['src/boot/boot1.js'],
}, },
{ {
dest: 'lib/jasmine-core.js', dest: 'lib/jasmine-core.js',
@@ -85,25 +84,28 @@ function concatFiles() {
src.unshift(licenseBanner); src.unshift(licenseBanner);
function expand(srcListEntry) { function expand(srcListEntry) {
if (typeof srcListEntry === 'object') { if (typeof srcListEntry === 'object' && !srcListEntry.glob) {
return srcListEntry; return srcListEntry;
} }
return glob.sync(srcListEntry) const matches = glob.sync(
.sort(function (a, b) { srcListEntry.glob ?? srcListEntry,
// Match the sort order of previous build tools, so that the {ignore: srcListEntry.exclude}
// output is the same. );
a = a.toLowerCase(); return matches.sort(function (a, b) {
b = b.toLowerCase(); // Match the sort order of previous build tools, so that the
// output is the same.
a = a.toLowerCase();
b = b.toLowerCase();
if (a < b) { if (a < b) {
return -1; return -1;
} else if (a === b) { } else if (a === b) {
return 0; return 0;
} else { } else {
return 1; return 1;
} }
}); });
} }
const srcs = src.flatMap(expand); const srcs = src.flatMap(expand);
@@ -117,6 +119,8 @@ function concatFiles() {
if (s.template) { if (s.template) {
const template = fs.readFileSync(s.template, {encoding: 'utf8'}); const template = fs.readFileSync(s.template, {encoding: 'utf8'});
content = ejs.render(template, s.data); content = ejs.render(template, s.data);
} else if (s.literal) {
content = s.literal;
} else { } else {
content = fs.readFileSync(s, {encoding: 'utf8'}); content = fs.readFileSync(s, {encoding: 'utf8'});
} }

View File

@@ -1,8 +1,9 @@
verifyNoGlobals(() => require('../lib/jasmine-core.js').noGlobals()); let jasmineCore;
verifyNoGlobals(() => { jasmineCore = require('../lib/jasmine-core.js'); });
jasmineCore.installGlobals();
const Jasmine = require('jasmine'); const Jasmine = require('jasmine');
const jasmineCore = require('../lib/jasmine-core.js'); const runner = new Jasmine({jasmineCore});
const runner = new Jasmine({jasmineCore: jasmineCore});
runner.loadConfigFile('./spec/support/jasmine.json'); runner.loadConfigFile('./spec/support/jasmine.json');
runner.exitOnCompletion = false; runner.exitOnCompletion = false;

View File

@@ -1248,24 +1248,7 @@ describe('Clock (acceptance)', function() {
clock.tick(400); clock.tick(400);
}); });
describe('Warning about monkey patching', function() { isNonMonkeyPatchableClass(privateUnderTest.Clock, function() {
for (const name of ['tick', 'mockDate', 'install', 'uninstall']) { return new privateUnderTest.Clock({}, function() {}, {});
it(`warns if Clock#${name} is monkey patched`, function() {
spyOn(console, 'error');
const clock = new privateUnderTest.Clock({}, function() {}, {});
const patch = {};
clock[name] = patch;
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledOnceWith(
jasmine.stringContaining('DEPRECATION: Monkey patching detected.')
);
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledOnceWith(
jasmine.stringContaining('ClockSpec.js')
);
expect(clock[name]).toBe(patch);
});
}
}); });
}); });

View File

@@ -875,43 +875,7 @@ describe('Env', function() {
}); });
}); });
describe('Warning about monkey patching', function() { isNonMonkeyPatchableClass(privateUnderTest.Env, function() {
afterEach(function() { return new privateUnderTest.Env();
// deprecateMonkeyPatching() uses jasmine.getEnv(), not the env from
// this suite. Clean it up so we don't leak event listeners.
jasmineUnderTest.getEnv().cleanup_();
privateUnderTest.currentEnv_ = null;
});
const names = [
'describe',
'xdescribe',
'fdescribe',
'it',
'xit',
'fit',
'beforeEach',
'afterEach',
'beforeAll',
'afterAll'
];
for (const name of names) {
it(`warns if Env#${name} is monkey patched`, function() {
spyOn(console, 'error');
const patch = {};
env[name] = patch;
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledOnceWith(
jasmine.stringContaining('DEPRECATION: Monkey patching detected.')
);
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledOnceWith(
jasmine.stringContaining('EnvSpec.js')
);
expect(env[name]).toBe(patch);
});
}
}); });
}); });

View File

@@ -173,10 +173,13 @@ describe('ExceptionFormatter', function() {
}); });
it('filters Jasmine stack frames in this environment', function() { it('filters Jasmine stack frames in this environment', function() {
const jasmineFile = (function() {
const trace = new privateUnderTest.StackTrace(new Error());
return trace.frames[2].file;
})();
expect(jasmineFile).toMatch(/\/jasmine.js$/);
const error = new Error('an error'); const error = new Error('an error');
const subject = new privateUnderTest.ExceptionFormatter({ const subject = new privateUnderTest.ExceptionFormatter({ jasmineFile });
jasmineFile: jasmine.private.util.jasmineFile()
});
const result = subject.stack(error); const result = subject.stack(error);
jasmine.debugLog('Original stack trace: ' + error.stack); jasmine.debugLog('Original stack trace: ' + error.stack);
jasmine.debugLog('Filtered stack trace: ' + result); jasmine.debugLog('Filtered stack trace: ' + result);
@@ -196,15 +199,18 @@ describe('ExceptionFormatter', function() {
}); });
it('handles multiline error messages in this environment', function() { it('handles multiline error messages in this environment', function() {
const jasmineFile = (function() {
const trace = new privateUnderTest.StackTrace(new Error());
return trace.frames[2].file;
})();
expect(jasmineFile).toMatch(/\/jasmine.js$/);
const msg = 'an error\nwith two lines'; const msg = 'an error\nwith two lines';
const error = new Error(msg); const error = new Error(msg);
if (error.stack.indexOf(msg) === -1) { if (error.stack.indexOf(msg) === -1) {
pending("Stack traces don't have messages in this environment"); pending("Stack traces don't have messages in this environment");
} }
const subject = new privateUnderTest.ExceptionFormatter({ const subject = new privateUnderTest.ExceptionFormatter({ jasmineFile });
jasmineFile: jasmine.private.util.jasmineFile()
});
const result = subject.stack(error); const result = subject.stack(error);
const lines = result.split('\n'); const lines = result.split('\n');
@@ -284,7 +290,7 @@ describe('ExceptionFormatter', function() {
it('ensures that stack traces do not include the message in this environment', function() { it('ensures that stack traces do not include the message in this environment', function() {
const error = new Error('an error'); const error = new Error('an error');
const subject = new privateUnderTest.ExceptionFormatter({ const subject = new privateUnderTest.ExceptionFormatter({
jasmineFile: jasmine.private.util.jasmineFile() jasmineFile: "doesn't matter"
}); });
const result = subject.stack(error, { omitMessage: true }); const result = subject.stack(error, { omitMessage: true });
expect(result).not.toContain('an error'); expect(result).not.toContain('an error');

View File

@@ -1,179 +0,0 @@
describe('JsApiReporter', function() {
it('knows when a full environment is started', function() {
const reporter = new privateUnderTest.JsApiReporter({});
expect(reporter.started).toBe(false);
expect(reporter.finished).toBe(false);
reporter.jasmineStarted();
expect(reporter.started).toBe(true);
expect(reporter.finished).toBe(false);
});
it('knows when a full environment is done', function() {
const reporter = new privateUnderTest.JsApiReporter({});
expect(reporter.started).toBe(false);
expect(reporter.finished).toBe(false);
reporter.jasmineStarted();
reporter.jasmineDone({});
expect(reporter.finished).toBe(true);
});
it("defaults to 'loaded' status", function() {
const reporter = new privateUnderTest.JsApiReporter({});
expect(reporter.status()).toEqual('loaded');
});
it("reports 'started' when Jasmine has started", function() {
const reporter = new privateUnderTest.JsApiReporter({});
reporter.jasmineStarted();
expect(reporter.status()).toEqual('started');
});
it("reports 'done' when Jasmine is done", function() {
const reporter = new privateUnderTest.JsApiReporter({});
reporter.jasmineDone({});
expect(reporter.status()).toEqual('done');
});
it('tracks a suite', function() {
const reporter = new privateUnderTest.JsApiReporter({});
reporter.suiteStarted({
id: 123,
description: 'A suite'
});
const suites = reporter.suites();
expect(suites).toEqual({ 123: { id: 123, description: 'A suite' } });
reporter.suiteDone({
id: 123,
description: 'A suite',
status: 'passed'
});
expect(suites).toEqual({
123: { id: 123, description: 'A suite', status: 'passed' }
});
});
describe('#specResults', function() {
let reporter, specResult1, specResult2;
beforeEach(function() {
reporter = new privateUnderTest.JsApiReporter({});
specResult1 = {
id: 1,
description: 'A spec'
};
specResult2 = {
id: 2,
description: 'Another spec'
};
reporter.specDone(specResult1);
reporter.specDone(specResult2);
});
it('should return a slice of results', function() {
expect(reporter.specResults(0, 1)).toEqual([specResult1]);
expect(reporter.specResults(1, 1)).toEqual([specResult2]);
});
describe('when the results do not exist', function() {
it('should return a slice of shorter length', function() {
expect(reporter.specResults(0, 3)).toEqual([specResult1, specResult2]);
expect(reporter.specResults(2, 3)).toEqual([]);
});
});
});
describe('#suiteResults', function() {
let reporter, suiteStarted1, suiteResult1, suiteResult2;
beforeEach(function() {
reporter = new privateUnderTest.JsApiReporter({});
suiteStarted1 = {
id: 1
};
suiteResult1 = {
id: 1,
status: 'failed',
failedExpectations: [{ message: 'My After All Exception' }]
};
suiteResult2 = {
id: 2,
status: 'passed'
};
reporter.suiteStarted(suiteStarted1);
reporter.suiteDone(suiteResult1);
reporter.suiteDone(suiteResult2);
});
it('should not include suite starts', function() {
expect(reporter.suiteResults(0, 3).length).toEqual(2);
});
it('should return a slice of results', function() {
expect(reporter.suiteResults(0, 1)).toEqual([suiteResult1]);
expect(reporter.suiteResults(1, 1)).toEqual([suiteResult2]);
});
it('returns nothing for out of bounds indices', function() {
expect(reporter.suiteResults(0, 3)).toEqual([suiteResult1, suiteResult2]);
expect(reporter.suiteResults(2, 3)).toEqual([]);
});
});
describe('#executionTime', function() {
it('should start the timer when jasmine starts', function() {
const timerSpy = jasmine.createSpyObj('timer', ['start', 'elapsed']),
reporter = new privateUnderTest.JsApiReporter({
timer: timerSpy
});
reporter.jasmineStarted();
expect(timerSpy.start).toHaveBeenCalled();
});
it('should return the time it took the specs to run, in ms', function() {
const timerSpy = jasmine.createSpyObj('timer', ['start', 'elapsed']),
reporter = new privateUnderTest.JsApiReporter({
timer: timerSpy
});
timerSpy.elapsed.and.returnValue(1000);
reporter.jasmineDone();
expect(reporter.executionTime()).toEqual(1000);
});
describe("when the specs haven't finished being run", function() {
it('should return undefined', function() {
const timerSpy = jasmine.createSpyObj('timer', ['start', 'elapsed']),
reporter = new privateUnderTest.JsApiReporter({
timer: timerSpy
});
expect(reporter.executionTime()).toBeUndefined();
});
});
});
describe('#runDetails', function() {
it('should have details about the run', function() {
const reporter = new privateUnderTest.JsApiReporter({});
reporter.jasmineDone({ some: { run: 'details' } });
expect(reporter.runDetails).toEqual({ some: { run: 'details' } });
});
});
});

View File

@@ -160,6 +160,13 @@ describe('ParallelReportDispatcher', function() {
); );
}); });
isNonMonkeyPatchableClass(
jasmineUnderTest.ParallelReportDispatcher,
function() {
return new jasmineUnderTest.ParallelReportDispatcher();
}
);
function mockGlobalErrors() { function mockGlobalErrors() {
const globalErrors = jasmine.createSpyObj('globalErrors', [ const globalErrors = jasmine.createSpyObj('globalErrors', [
'install', 'install',

View File

@@ -278,7 +278,7 @@ describe('Spec', function() {
spec.addExpectationResult(true, { message: 'passed' }); spec.addExpectationResult(true, { message: 'passed' });
expect(function() { expect(function() {
spec.addExpectationResult(false, { message: 'failed' }); spec.addExpectationResult(false, { message: 'failed' });
}).toThrowError(jasmineUnderTest.private.errors.ExpectationFailed); }).toThrowError(privateUnderTest.errors.ExpectationFailed);
expect(spec.doneEvent().failedExpectations).toEqual([ expect(spec.doneEvent().failedExpectations).toEqual([
jasmine.objectContaining({ message: 'failed' }) jasmine.objectContaining({ message: 'failed' })
@@ -453,9 +453,7 @@ describe('Spec', function() {
queueableFn: {} queueableFn: {}
}); });
spec.handleException( spec.handleException(new privateUnderTest.errors.ExpectationFailed());
new jasmineUnderTest.private.errors.ExpectationFailed()
);
expect(spec.doneEvent().failedExpectations).toEqual([]); expect(spec.doneEvent().failedExpectations).toEqual([]);
}); });

View File

@@ -138,7 +138,7 @@ describe('Suite', function() {
expect(function() { expect(function() {
suite.addExpectationResult(false, { message: 'failed' }); suite.addExpectationResult(false, { message: 'failed' });
}).toThrowError(jasmineUnderTest.private.errors.ExpectationFailed); }).toThrowError(privateUnderTest.errors.ExpectationFailed);
expect(suite.doneEvent().status).toBe('failed'); expect(suite.doneEvent().status).toBe('failed');
expect(suite.doneEvent().failedExpectations).toEqual([ expect(suite.doneEvent().failedExpectations).toEqual([
@@ -149,9 +149,7 @@ describe('Suite', function() {
it('does not add an additional failure when an expectation fails', function() { it('does not add an additional failure when an expectation fails', function() {
const suite = new privateUnderTest.Suite({}); const suite = new privateUnderTest.Suite({});
suite.handleException( suite.handleException(new privateUnderTest.errors.ExpectationFailed());
new jasmineUnderTest.private.errors.ExpectationFailed()
);
expect(suite.doneEvent().failedExpectations).toEqual([]); expect(suite.doneEvent().failedExpectations).toEqual([]);
}); });

View File

@@ -30,4 +30,8 @@ describe('Timer', function() {
expect(timer.elapsed()).toEqual(jasmine.any(Number)); expect(timer.elapsed()).toEqual(jasmine.any(Number));
}); });
}); });
isNonMonkeyPatchableClass(jasmineUnderTest.Timer, function() {
return new jasmineUnderTest.Timer();
});
}); });

View File

@@ -163,7 +163,6 @@ describe('util', function() {
// Chrome sometimes reports foo.js as foo.js/, so tolerate // Chrome sometimes reports foo.js as foo.js/, so tolerate
// a trailing slash if present. // a trailing slash if present.
expect(privateUnderTest.util.jasmineFile()).toMatch(/util.js\/?$/); expect(privateUnderTest.util.jasmineFile()).toMatch(/util.js\/?$/);
expect(jasmine.private.util.jasmineFile()).toMatch(/jasmine.js\/?$/);
}); });
}); });
}); });

View File

@@ -1289,9 +1289,7 @@ describe('Env integration', function() {
await env.execute(); await env.execute();
expect(reporter.specDone).toHaveBeenCalledTimes(1); expect(reporter.specDone).toHaveBeenCalledTimes(1);
const event = reporter.specDone.calls.argsFor(0)[0]; const event = reporter.specDone.calls.argsFor(0)[0];
jasmine.debugLog( jasmine.debugLog('Spec result: ' + jasmine.pp(event));
'Spec result: ' + jasmine.private.basicPrettyPrinter(event)
);
expect(event).toEqual(jasmine.objectContaining({ status: 'passed' })); expect(event).toEqual(jasmine.objectContaining({ status: 'passed' }));
jasmine.clock().tick(1); jasmine.clock().tick(1);

View File

@@ -13,83 +13,65 @@ describe('The jasmine namespace', function() {
expect(setDifference(actualKeys, expectedKeys())).toEqual(new Set()); expect(setDifference(actualKeys, expectedKeys())).toEqual(new Set());
}); });
describe('Warning about monkey patching', function() { describe('Preventing monkey patching', function() {
beforeEach(function() { const mutable = mutableKeys();
spyOn(console, 'error');
for (const key of expectedKeys()) {
if (mutable.includes(key)) {
it(`allows overwriting of jasmine.${key}`, function() {
const existingVal = jasmineUnderTest[key];
try {
jasmineUnderTest[key] = 'new value';
expect(jasmineUnderTest[key]).toEqual('new value');
} finally {
jasmineUnderTest[key] = existingVal;
}
});
} else {
it(`prevents overwriting of jasmine.${key}`, function() {
const existingVal = jasmineUnderTest[key];
try {
jasmineUnderTest[key] = 'monkey patch';
expect(jasmineUnderTest[key]).toBe(existingVal);
} finally {
// This will be a no-op if the test passed, but will prevent state
// leakage if it failed.
jasmineUnderTest[key] = existingVal;
}
});
}
}
it('allows additions', function() {
try {
jasmineUnderTest.Ajax = 'it worked';
expect(jasmineUnderTest.Ajax).toEqual('it worked');
} finally {
delete jasmineUnderTest.Ajax;
}
}); });
for (const key of expectedKeys(false)) {
if (!key.startsWith('MAX_') && key !== 'private' && key !== 'getEnv') {
describe(`jasmine.${key}`, function() {
let orig;
beforeEach(function() {
orig = jasmineUnderTest[key];
});
afterEach(function() {
jasmineUnderTest[key] = orig;
});
it('warns if monkey patched', function() {
const patch = {};
jasmineUnderTest[key] = patch;
verifyDeprecation();
expect(jasmineUnderTest[key]).toBe(patch);
});
});
}
}
// These specs rely on jasmineRequire being exposed. That only happens
// in browsers.
if (typeof document !== 'undefined') {
const statics = ['addMatchers', 'clock', 'createSpyObj'];
for (const name of statics) {
describe(`jasmine.${name}`, function() {
let bootedCore, env, orig;
beforeEach(function() {
bootedCore = jasmineRequire.core(jasmineRequire);
env = bootedCore.getEnv();
jasmineRequire.interface(bootedCore, env);
orig = bootedCore[name];
});
afterEach(function() {
bootedCore[name] = orig;
env.cleanup_();
});
it(`warns if jasmine.${name} is monkey patched`, function() {
const patch = {};
bootedCore[name] = patch;
verifyDeprecation();
expect(bootedCore[name]).toBe(patch);
});
});
}
}
}); });
function expectedKeys(includeHtml) { function mutableKeys() {
if (includeHtml === undefined) { return [
includeHtml = typeof window !== 'undefined';
}
// Does not include properties added by requireInterface(), since that isn't
// called by defineJasmineUnderTest.js/nodeDefineJasmineUnderTest.js.
const result = new Set([
'MAX_PRETTY_PRINT_ARRAY_LENGTH', 'MAX_PRETTY_PRINT_ARRAY_LENGTH',
'MAX_PRETTY_PRINT_CHARS', 'MAX_PRETTY_PRINT_CHARS',
'MAX_PRETTY_PRINT_DEPTH', 'MAX_PRETTY_PRINT_DEPTH',
'DEFAULT_TIMEOUT_INTERVAL'
];
}
function expectedKeys() {
// Does not include properties added by requireInterface(), since that isn't
// called by defineJasmineUnderTest.js/nodeDefineJasmineUnderTest.js.
const result = new Set([
...mutableKeys(),
'debugLog', 'debugLog',
'getEnv', 'getEnv',
'isSpy', 'isSpy',
'ParallelReportDispatcher', 'ParallelReportDispatcher',
'private',
'spyOnGlobalErrorsAsync', 'spyOnGlobalErrorsAsync',
'Timer', 'Timer',
'version', 'version',
@@ -116,12 +98,10 @@ describe('The jasmine namespace', function() {
'getGlobal' 'getGlobal'
]); ]);
if (includeHtml) { if (typeof window !== 'undefined') {
// jasmine-html.js // jasmine-html.js
result.add('HtmlReporter');
result.add('HtmlReporterV2'); result.add('HtmlReporterV2');
result.add('HtmlReporterV2Urls'); result.add('HtmlReporterV2Urls');
result.add('HtmlSpecFilter');
result.add('QueryString'); result.add('QueryString');
} }
@@ -141,15 +121,4 @@ describe('The jasmine namespace', function() {
return result; return result;
} }
function verifyDeprecation() {
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledOnceWith(
jasmine.stringContaining('DEPRECATION: Monkey patching detected.')
);
// eslint-disable-next-line no-console
expect(console.error).toHaveBeenCalledOnceWith(
jasmine.stringContaining('jasmineNamespaceSpec.js')
);
}
}); });

View File

@@ -1,9 +1,11 @@
(function() { (function() {
// By the time onload is called, jasmineRequire will be redefined to point // By the time onload is called, getJasmineRequireObj() and
// to the Jasmine source files (and not jasmine.js). So re-require // getJasmineHtmlRequireObj() will be redefined to point
window.jasmineUnderTest = jasmineRequire.core(jasmineRequire); // to the Jasmine source files (and not jasmine.js). So re-require.
jasmineRequire.html(jasmineUnderTest); const jasmineRequire = getJasmineRequireObj();
const coreUnderTest = jasmineRequire.core(jasmineRequire);
window.jasmineUnderTest = coreUnderTest.jasmine;
window.privateUnderTest = coreUnderTest.private;
// Alias the private namespace so tests can be less verbose getJasmineHtmlRequireObj().html(jasmineUnderTest, privateUnderTest);
window.privateUnderTest = window.jasmineUnderTest.private;
})(); })();

View File

@@ -42,9 +42,9 @@
: 'Expected runnable "' + : 'Expected runnable "' +
fullName + fullName +
'" to have failures ' + '" to have failures ' +
jasmine.private.basicPrettyPrinter(expectedFailures) + jasmine.pp(expectedFailures) +
' but it had ' + ' but it had ' +
jasmine.private.basicPrettyPrinter(foundFailures) jasmine.pp(foundFailures)
}; };
} }
}; };

View File

@@ -0,0 +1,67 @@
globalThis.isNonMonkeyPatchableClass = function(ctor, makeInstance) {
describe('Monkey patching prevention', function() {
it(`prevents overwriting ${ctor.name}.prototype`, function() {
const existing = ctor.prototype;
try {
ctor.prototype = {};
expect(ctor.prototype).toBe(existing);
} finally {
// This will be a no-op if the test passed, but will prevent state
// leakage if it failed.
ctor.prototype = existing;
}
});
it("prevents overwriting an instance's prototype", function() {
const instance = makeInstance();
let thrown;
// The message varies from browser to browser, so we can't rely on it
try {
instance.__proto__ = {};
} catch (e) {
thrown = e;
}
expect(thrown).toBeInstanceOf(TypeError);
});
it('prevents overwriting prototype properties', function() {
let any = false;
for (const k of Object.getOwnPropertyNames(ctor.prototype)) {
any = true;
const existingValue = ctor.prototype[k];
try {
ctor.prototype[k] = {};
expect(ctor.prototype[k])
.withContext(k)
.toBe(existingValue);
} finally {
// This will be a no-op if the test passed, but will prevent state
// leakage if it failed.
ctor.prototype[k] = existingValue;
}
}
expect(any).toBe(true);
});
it('prevents overriding prototype properties', function() {
const instance = makeInstance();
let any = false;
for (const k of Object.getOwnPropertyNames(ctor.prototype)) {
any = true;
instance[k] = {};
expect(instance[k])
.withContext(k)
.toBe(ctor.prototype[k]);
}
expect(any).toBe(true);
});
});
};

View File

@@ -7,24 +7,29 @@
'../../src/core/requireCore.js' '../../src/core/requireCore.js'
)); ));
// Individual source files call getJasmineRequireObj. It's normally defined
// by requireCore.js which is concatenated into jasmine.js before other source
// files. Since we're bypassing that mechanism, we need to provide our own.
global.getJasmineRequireObj = function() { global.getJasmineRequireObj = function() {
return jasmineUnderTestRequire; return jasmineUnderTestRequire;
}; };
function getSourceFiles() { const srcFiles = [
const globs = ['../../src/core/**/*.js', '../../src/version.js']; ...glob.sync('../../src/core/**/*.js', {
const srcFiles = globs.flatMap(g => glob.sync(g, { cwd: __dirname })); ignore: '../../src/core/requireSuffix.js',
cwd: __dirname
}),
'../../src/version.js',
'../../src/core/requireCore.js'
];
for (const file of srcFiles) { for (const file of srcFiles) {
require(file); require(file);
}
} }
getSourceFiles(); delete global.getJasmineRequireObj;
global.jasmineUnderTest = jasmineUnderTestRequire.core(
jasmineUnderTestRequire
);
// Alias the private namespace so tests can be less verbose const built = jasmineUnderTestRequire.core(jasmineUnderTestRequire);
global.privateUnderTest = global.jasmineUnderTest.private; global.jasmineUnderTest = built.jasmine;
global.privateUnderTest = built.private;
})(); })();

File diff suppressed because it is too large Load Diff

View File

@@ -1396,4 +1396,6 @@ describe('HtmlReporterV2', function() {
}); });
}); });
}); });
isNonMonkeyPatchableClass(jasmineUnderTest.HtmlReporterV2, setup);
}); });

View File

@@ -63,4 +63,8 @@ describe('HtmlReporterV2Urls', function() {
return qs; return qs;
} }
}); });
isNonMonkeyPatchableClass(jasmineUnderTest.HtmlReporterV2Urls, function() {
return new jasmineUnderTest.HtmlReporterV2Urls({});
});
}); });

View File

@@ -1,43 +0,0 @@
describe('HtmlSpecFilter', function() {
let env, deprecator;
beforeEach(function() {
deprecator = jasmine.createSpyObj('deprecator', [
'verboseDeprecations',
'addDeprecationWarning'
]);
env = new privateUnderTest.Env({ deprecator });
});
afterEach(function() {
env.cleanup_();
});
it('emits a deprecation warning', function() {
new jasmineUnderTest.HtmlSpecFilter({ env });
expect(deprecator.addDeprecationWarning).toHaveBeenCalledWith(
jasmine.anything(),
'HtmlReporter and HtmlSpecFilter are deprecated. Use HtmlReporterV2 instead.',
undefined
);
});
it('should match when no string is provided', function() {
const specFilter = new jasmineUnderTest.HtmlSpecFilter({ env });
expect(specFilter.matches('foo')).toBe(true);
expect(specFilter.matches('*bar')).toBe(true);
});
it('should only match the provided string', function() {
const specFilter = new jasmineUnderTest.HtmlSpecFilter({
env,
filterString: function() {
return 'foo';
}
});
expect(specFilter.matches('foo')).toBe(true);
expect(specFilter.matches('bar')).toBe(false);
});
});

View File

@@ -77,4 +77,12 @@ describe('QueryString', function() {
expect(queryString.getParam('baz')).toBeFalsy(); expect(queryString.getParam('baz')).toBeFalsy();
}); });
}); });
isNonMonkeyPatchableClass(jasmineUnderTest.QueryString, function() {
return new jasmineUnderTest.QueryString({
getWindowLocation: function() {
return { search: '' };
}
});
});
}); });

View File

@@ -77,7 +77,7 @@ describe('npm package', function() {
}); });
it('has bootFiles', function() { it('has bootFiles', function() {
expect(this.packagedCore.files.bootFiles).toEqual(['boot0.js', 'boot1.js']); expect(this.packagedCore.files.bootFiles).toEqual(['boot.js']);
for (const fileName of this.packagedCore.files.bootFiles) { for (const fileName of this.packagedCore.files.bootFiles) {
expect(fileName).toExistInPath(this.packagedCore.files.bootDir); expect(fileName).toExistInPath(this.packagedCore.files.bootDir);

View File

@@ -6,13 +6,14 @@ module.exports = {
'core/util.js', 'core/util.js',
'core/Spec.js', 'core/Spec.js',
'core/Env.js', 'core/Env.js',
'core/JsApiReporter.js',
'core/PrettyPrinter.js', 'core/PrettyPrinter.js',
'core/Suite.js', 'core/Suite.js',
'core/**/*.js', 'core/**/*.js',
'html/**/*.js', 'html/**/*.js',
'**/*.js', '**/*.js',
'!boot/**.js' '!boot/**.js',
'!core/requireSuffix.js',
'!html/requireSuffix.js'
], ],
specDir: 'spec', specDir: 'spec',
specFiles: ['**/*[Ss]pec.js', '!npmPackage/**/*'], specFiles: ['**/*[Ss]pec.js', '!npmPackage/**/*'],
@@ -23,6 +24,7 @@ module.exports = {
'helpers/domHelpers.js', 'helpers/domHelpers.js',
'helpers/integrationMatchers.js', 'helpers/integrationMatchers.js',
'helpers/callerFilenameShim.js', 'helpers/callerFilenameShim.js',
'helpers/monkeyPatchingSpecs.js',
'helpers/defineJasmineUnderTest.js', 'helpers/defineJasmineUnderTest.js',
'helpers/resetEnv.js' 'helpers/resetEnv.js'
], ],

View File

@@ -10,6 +10,7 @@
"helpers/integrationMatchers.js", "helpers/integrationMatchers.js",
"helpers/callerFilenameShim.js", "helpers/callerFilenameShim.js",
"helpers/overrideConsoleLogForCircleCi.js", "helpers/overrideConsoleLogForCircleCi.js",
"helpers/monkeyPatchingSpecs.js",
"helpers/nodeDefineJasmineUnderTest.js", "helpers/nodeDefineJasmineUnderTest.js",
"helpers/resetEnv.js" "helpers/resetEnv.js"
], ],

View File

@@ -8,10 +8,10 @@
<link rel="stylesheet" href="lib/jasmine-<%= jasmineVersion %>/jasmine.css"> <link rel="stylesheet" href="lib/jasmine-<%= jasmineVersion %>/jasmine.css">
<script src="lib/jasmine-<%= jasmineVersion %>/jasmine.js"></script> <script src="lib/jasmine-<%= jasmineVersion %>/jasmine.js"></script>
<script src="lib/jasmine-<%= jasmineVersion %>/jasmine-html.js"></script>
<script src="lib/jasmine-<%= jasmineVersion %>/boot0.js"></script> <script src="lib/jasmine-<%= jasmineVersion %>/boot0.js"></script>
<script src="lib/jasmine-<%= jasmineVersion %>/jasmine-html.js"></script>
<!-- optional: include a file here that configures the Jasmine env --> <!-- optional: include a file here that configures the Jasmine env -->
<script src="lib/jasmine-<%= jasmineVersion %>/boot1.js"></script> <script src="lib/jasmine-<%= jasmineVersion %>/boot.js"></script>
<!-- include source files here... --> <!-- include source files here... -->
<script src="src/Player.js"></script> <script src="src/Player.js"></script>

View File

@@ -1,18 +1,5 @@
'use strict'; 'use strict';
/**
This file finishes 'booting' Jasmine, performing all of the necessary
initialization before executing the loaded environment and all of a project's
specs. This file should be loaded after `boot0.js` but before any project
source files or spec files are loaded. Thus this file can also be used to
customize Jasmine for a project.
If a project is using Jasmine via the standalone distribution, this file can
be customized directly. If you only wish to configure the Jasmine env, you
can load another file that calls `jasmine.getEnv().configure({...})`
after `boot0.js` is loaded and before this file is loaded.
*/
(function() { (function() {
const env = jasmine.getEnv(); const env = jasmine.getEnv();
const urls = new jasmine.HtmlReporterV2Urls(); const urls = new jasmine.HtmlReporterV2Urls();

View File

@@ -1,44 +0,0 @@
'use strict';
/**
This file starts the process of "booting" Jasmine. It initializes Jasmine,
makes its globals available, and creates the env. This file should be loaded
after `jasmine.js` and `jasmine_html.js`, but before `boot1.js` or any project
source files or spec files are loaded.
*/
(function() {
const jasmineRequire = window.jasmineRequire || require('./jasmine.js');
/**
* ## Require &amp; Instantiate
*
* Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference.
*/
const jasmine = jasmineRequire.core(jasmineRequire),
global = jasmine.getGlobal();
global.jasmine = jasmine;
/**
* Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference.
*/
jasmineRequire.html(jasmine);
/**
* Create the Jasmine environment. This is used to run all specs in a project.
*/
const env = jasmine.getEnv();
/**
* ## The Global Interface
*
* Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged.
*/
const jasmineInterface = jasmineRequire.interface(jasmine, env);
/**
* Add all of the Jasmine global/public interface to the global scope, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`.
*/
for (const property in jasmineInterface) {
global[property] = jasmineInterface[property];
}
})();

View File

@@ -1,69 +1,25 @@
'use strict'; 'use strict';
/** const path = require('path');
* Note: Only available on Node. const fs = require('fs');
* @module jasmine-core const {
*/ globals,
installGlobals,
version,
private$
} = require('./jasmine-core/jasmine.js');
const jasmineRequire = require('./jasmine-core/jasmine.js'); function reset() {
module.exports = jasmineRequire; private$.currentEnv_ = null;
const env = jasmine.getEnv({ suppressLoadErrors: true });
const bootWithoutGlobals = (function() { rebindInterface(env);
let jasmine, jasmineInterface; }
return function bootWithoutGlobals(reinitialize) {
if (!jasmineInterface || reinitialize === true) {
jasmine = jasmineRequire.core(jasmineRequire);
const env = jasmine.getEnv({ suppressLoadErrors: true });
jasmineInterface = jasmineRequire.interface(jasmine, env);
}
return { jasmine, jasmineInterface };
};
})();
/**
* Boots a copy of Jasmine and returns an object as described in {@link jasmine}.
* @param {boolean} [reinitialize=true] Whether to create a new copy of Jasmine if one already exists
* @type {function}
* @return {jasmine}
*/
module.exports.boot = function(reinitialize) {
if (reinitialize === undefined) {
reinitialize = true;
}
const { jasmine, jasmineInterface } = bootWithoutGlobals(reinitialize);
for (const k in jasmineInterface) {
global[k] = jasmineInterface[k];
}
return jasmine;
};
/**
* Boots a copy of Jasmine and returns an object containing the properties
* that would normally be added to the global object. If noGlobals is called
* multiple times, the same object is returned every time.
*
* @example
* const {describe, beforeEach, it, expect, jasmine} = require('jasmine-core').noGlobals();
*/
module.exports.noGlobals = function() {
const { jasmineInterface } = bootWithoutGlobals(false);
return jasmineInterface;
};
const path = require('path'),
fs = require('fs');
const rootPath = path.join(__dirname, 'jasmine-core'), const rootPath = path.join(__dirname, 'jasmine-core'),
bootFiles = ['boot0.js', 'boot1.js'], bootFiles = ['boot.js'],
legacyBootFiles = ['boot.js'],
cssFiles = [], cssFiles = [],
jsFiles = [], jsFiles = [],
jsFilesToSkip = ['jasmine.js'].concat(bootFiles, legacyBootFiles); jsFilesToSkip = ['jasmine.js'].concat(bootFiles);
fs.readdirSync(rootPath).forEach(function(file) { fs.readdirSync(rootPath).forEach(function(file) {
if (fs.statSync(path.join(rootPath, file)).isFile()) { if (fs.statSync(path.join(rootPath, file)).isFile()) {
@@ -80,12 +36,40 @@ fs.readdirSync(rootPath).forEach(function(file) {
} }
}); });
module.exports.files = { /**
self: __filename, * Note: Only available on Node.
path: rootPath, *
bootDir: rootPath, * In addition to the members documented here, this module's exports include all
bootFiles: bootFiles, * {@link globals}.
cssFiles: cssFiles, * @module jasmine-core
jsFiles: ['jasmine.js'].concat(jsFiles), */
imagesDir: path.join(__dirname, '../images') module.exports = {
...globals,
/**
* Copies Jasmine globals (jasmine, describe, it, etc) to the specified
* object or to globalThis.
* @function
* @param {object} [dest] - The object to copy globals to.
*/
installGlobals,
/**
* Returns the jasmine-core version.
* @function
*/
version,
/**
* Resets all of jasmine-core's state, including removing specs, suites, and
* reporters, and resetting configuration to the default.
* @function
*/
reset,
files: {
self: __filename,
path: rootPath,
bootDir: rootPath,
bootFiles: bootFiles,
cssFiles: cssFiles,
jsFiles: ['jasmine.js'].concat(jsFiles),
imagesDir: path.join(__dirname, '../images')
}
}; };

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().CallTracker = function(j$) { getJasmineRequireObj().CallTracker = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -125,9 +125,7 @@ getJasmineRequireObj().CallTracker = function(j$) {
* @param {Function} [argsCloner] A function to use to clone the arguments. Defaults to a shallow cloning function. * @param {Function} [argsCloner] A function to use to clone the arguments. Defaults to a shallow cloning function.
* @function * @function
*/ */
this.saveArgumentsByValue = function( this.saveArgumentsByValue = function(argsCloner = private$.util.cloneArgs) {
argsCloner = j$.private.util.cloneArgs
) {
opts.cloneArgs = true; opts.cloneArgs = true;
opts.argsCloner = argsCloner; opts.argsCloner = argsCloner;
}; };

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Clock = function(j$) { getJasmineRequireObj().Clock = function(j$, private$) {
'use strict'; 'use strict';
/* global process */ /* global process */
@@ -192,7 +192,7 @@ callbacks to execute _before_ running the next one.
setInterval[IsMockClockTimingFn] = true; setInterval[IsMockClockTimingFn] = true;
clearInterval[IsMockClockTimingFn] = true; clearInterval[IsMockClockTimingFn] = true;
j$.private.deprecateMonkeyPatching(this); Object.freeze(this);
return this; return this;
@@ -347,5 +347,7 @@ callbacks to execute _before_ running the next one.
}; };
Clock.IsMockClockTimingFn = IsMockClockTimingFn; Clock.IsMockClockTimingFn = IsMockClockTimingFn;
Object.freeze(Clock);
Object.freeze(Clock.prototype);
return Clock; return Clock;
}; };

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().CompleteOnFirstErrorSkipPolicy = function(j$) { getJasmineRequireObj().CompleteOnFirstErrorSkipPolicy = function(j$, private$) {
'use strict'; 'use strict';
function CompleteOnFirstErrorSkipPolicy(queueableFns) { function CompleteOnFirstErrorSkipPolicy(queueableFns) {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Configuration = function(j$) { getJasmineRequireObj().Configuration = function(j$, private$) {
'use strict'; 'use strict';
/** /**

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().DelayedFunctionScheduler = function(j$) { getJasmineRequireObj().DelayedFunctionScheduler = function(j$, private$) {
'use strict'; 'use strict';
function DelayedFunctionScheduler() { function DelayedFunctionScheduler() {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Deprecator = function(j$) { getJasmineRequireObj().Deprecator = function(j$, private$) {
'use strict'; 'use strict';
function Deprecator(topSuite) { function Deprecator(topSuite) {
@@ -25,7 +25,7 @@ getJasmineRequireObj().Deprecator = function(j$) {
) { ) {
options = options || {}; options = options || {};
if (!this.verbose_ && !j$.private.isError(deprecation)) { if (!this.verbose_ && !private$.isError(deprecation)) {
if (this.toSuppress_.indexOf(deprecation) !== -1) { if (this.toSuppress_.indexOf(deprecation) !== -1) {
return; return;
} }
@@ -37,7 +37,7 @@ getJasmineRequireObj().Deprecator = function(j$) {
}; };
Deprecator.prototype.log_ = function(runnable, deprecation, options) { Deprecator.prototype.log_ = function(runnable, deprecation, options) {
if (j$.private.isError(deprecation)) { if (private$.isError(deprecation)) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.error(deprecation); console.error(deprecation);
return; return;
@@ -66,7 +66,7 @@ getJasmineRequireObj().Deprecator = function(j$) {
}; };
Deprecator.prototype.stackTrace_ = function() { Deprecator.prototype.stackTrace_ = function() {
const formatter = new j$.private.ExceptionFormatter(); const formatter = new private$.ExceptionFormatter();
return formatter.stack(new Error()).replace(/^Error\n/m, ''); return formatter.stack(new Error()).replace(/^Error\n/m, '');
}; };
@@ -75,7 +75,7 @@ getJasmineRequireObj().Deprecator = function(j$) {
runnable = this.topSuite_; runnable = this.topSuite_;
} }
if (j$.private.isError(deprecation)) { if (private$.isError(deprecation)) {
runnable.addDeprecationWarning(deprecation); runnable.addDeprecationWarning(deprecation);
return; return;
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Env = function(j$) { getJasmineRequireObj().Env = function(j$, private$) {
'use strict'; 'use strict';
const DEFAULT_IT_DESCRIBE_STACK_DEPTH = 3; const DEFAULT_IT_DESCRIBE_STACK_DEPTH = 3;
@@ -15,18 +15,18 @@ getJasmineRequireObj().Env = function(j$) {
envOptions = envOptions || {}; envOptions = envOptions || {};
const self = this; const self = this;
const GlobalErrors = envOptions.GlobalErrors || j$.private.GlobalErrors; const GlobalErrors = envOptions.GlobalErrors || private$.GlobalErrors;
const global = envOptions.global || j$.getGlobal(); const global = envOptions.global || j$.getGlobal();
const realSetTimeout = global.setTimeout; const realSetTimeout = global.setTimeout;
const realClearTimeout = global.clearTimeout; const realClearTimeout = global.clearTimeout;
const stackClearer = j$.private.getStackClearer(global); const stackClearer = private$.getStackClearer(global);
this.clock = new j$.private.Clock( this.clock = new private$.Clock(
global, global,
function() { function() {
return new j$.private.DelayedFunctionScheduler(); return new private$.DelayedFunctionScheduler();
}, },
new j$.private.MockDate(global) new private$.MockDate(global)
); );
const globalErrors = new GlobalErrors( const globalErrors = new GlobalErrors(
@@ -54,7 +54,7 @@ getJasmineRequireObj().Env = function(j$) {
}; };
})(); })();
const runableResources = new j$.private.RunableResources({ const runableResources = new private$.RunableResources({
getCurrentRunableId: function() { getCurrentRunableId: function() {
const r = runner.currentRunable(); const r = runner.currentRunable();
return r ? r.id : null; return r ? r.id : null;
@@ -67,7 +67,7 @@ getJasmineRequireObj().Env = function(j$) {
let runner; let runner;
let parallelLoadingState = null; // 'specs', 'helpers', or null for non-parallel let parallelLoadingState = null; // 'specs', 'helpers', or null for non-parallel
const config = new j$.private.Configuration(); const config = new private$.Configuration();
if (!envOptions.suppressLoadErrors) { if (!envOptions.suppressLoadErrors) {
installGlobalErrors(); installGlobalErrors();
@@ -137,11 +137,11 @@ getJasmineRequireObj().Env = function(j$) {
runableResources.customObjectFormatters().push(formatter); runableResources.customObjectFormatters().push(formatter);
}; };
j$.private.Expectation.addCoreMatchers(j$.private.matchers); private$.Expectation.addCoreMatchers(private$.matchers);
j$.private.Expectation.addAsyncCoreMatchers(j$.private.asyncMatchers); private$.Expectation.addAsyncCoreMatchers(private$.asyncMatchers);
const expectationFactory = function(actual, spec) { const expectationFactory = function(actual, spec) {
return j$.private.Expectation.factory({ return private$.Expectation.factory({
matchersUtil: runableResources.makeMatchersUtil(), matchersUtil: runableResources.makeMatchersUtil(),
customMatchers: runableResources.customMatchers(), customMatchers: runableResources.customMatchers(),
actual: actual, actual: actual,
@@ -174,7 +174,7 @@ getJasmineRequireObj().Env = function(j$) {
}; };
const throwUnlessFactory = function(actual, spec) { const throwUnlessFactory = function(actual, spec) {
return j$.private.Expectation.factory({ return private$.Expectation.factory({
matchersUtil: runableResources.makeMatchersUtil(), matchersUtil: runableResources.makeMatchersUtil(),
customMatchers: runableResources.customMatchers(), customMatchers: runableResources.customMatchers(),
actual: actual, actual: actual,
@@ -183,7 +183,7 @@ getJasmineRequireObj().Env = function(j$) {
}; };
const throwUnlessAsyncFactory = function(actual, spec) { const throwUnlessAsyncFactory = function(actual, spec) {
return j$.private.Expectation.asyncFactory({ return private$.Expectation.asyncFactory({
matchersUtil: runableResources.makeMatchersUtil(), matchersUtil: runableResources.makeMatchersUtil(),
customAsyncMatchers: runableResources.customAsyncMatchers(), customAsyncMatchers: runableResources.customAsyncMatchers(),
actual: actual, actual: actual,
@@ -198,7 +198,7 @@ getJasmineRequireObj().Env = function(j$) {
error.matcherName !== undefined && error.passed !== undefined; error.matcherName !== undefined && error.passed !== undefined;
const result = isExpectationResult const result = isExpectationResult
? error ? error
: j$.private.buildExpectationResult({ : private$.buildExpectationResult({
error, error,
passed: false, passed: false,
matcherName: '', matcherName: '',
@@ -259,7 +259,7 @@ getJasmineRequireObj().Env = function(j$) {
} }
const asyncExpectationFactory = function(actual, spec, runableType) { const asyncExpectationFactory = function(actual, spec, runableType) {
return j$.private.Expectation.asyncFactory({ return private$.Expectation.asyncFactory({
matchersUtil: runableResources.makeMatchersUtil(), matchersUtil: runableResources.makeMatchersUtil(),
customAsyncMatchers: runableResources.customAsyncMatchers(), customAsyncMatchers: runableResources.customAsyncMatchers(),
actual: actual, actual: actual,
@@ -318,10 +318,10 @@ getJasmineRequireObj().Env = function(j$) {
(runner.currentRunable() || topSuite).handleException(e); (runner.currentRunable() || topSuite).handleException(e);
}; };
new j$.private.QueueRunner(options).execute(); new private$.QueueRunner(options).execute();
} }
const suiteBuilder = new j$.private.SuiteBuilder({ const suiteBuilder = new private$.SuiteBuilder({
env: this, env: this,
expectationFactory, expectationFactory,
asyncExpectationFactory, asyncExpectationFactory,
@@ -330,7 +330,7 @@ getJasmineRequireObj().Env = function(j$) {
}); });
topSuite = suiteBuilder.topSuite; topSuite = suiteBuilder.topSuite;
const deprecator = const deprecator =
envOptions?.deprecator ?? new j$.private.Deprecator(topSuite); envOptions?.deprecator ?? new private$.Deprecator(topSuite);
/** /**
* Provides the root suite, through which all suites and specs can be * Provides the root suite, through which all suites and specs can be
@@ -350,23 +350,23 @@ getJasmineRequireObj().Env = function(j$) {
* @interface Reporter * @interface Reporter
* @see custom_reporter * @see custom_reporter
*/ */
reportDispatcher = new j$.private.ReportDispatcher( reportDispatcher = new private$.ReportDispatcher(
j$.private.reporterEvents, private$.reporterEvents,
function(options) { function(options) {
options.SkipPolicy = j$.private.NeverSkipPolicy; options.SkipPolicy = private$.NeverSkipPolicy;
return runQueue(options); return runQueue(options);
}, },
recordLateError recordLateError
); );
runner = new j$.private.Runner({ runner = new private$.Runner({
topSuite, topSuite,
totalSpecsDefined: () => suiteBuilder.totalSpecsDefined, totalSpecsDefined: () => suiteBuilder.totalSpecsDefined,
focusedRunables: () => suiteBuilder.focusedRunables, focusedRunables: () => suiteBuilder.focusedRunables,
runableResources, runableResources,
reportDispatcher, reportDispatcher,
runQueue, runQueue,
TreeProcessor: j$.private.TreeProcessor, TreeProcessor: private$.TreeProcessor,
globalErrors, globalErrors,
getConfig: () => config getConfig: () => config
}); });
@@ -411,7 +411,7 @@ getJasmineRequireObj().Env = function(j$) {
// Karma incorrectly loads jasmine-core as an ES module. It isn't one, // Karma incorrectly loads jasmine-core as an ES module. It isn't one,
// and we don't test that configuration. Warn about it. // and we don't test that configuration. Warn about it.
if (j$.private.loadedAsBrowserEsm) { if (private$.loadedAsBrowserEsm) {
this.deprecated( this.deprecated(
"jasmine-core isn't an ES module but it was loaded as one. This is not a supported configuration." "jasmine-core isn't an ES module but it was loaded as one. This is not a supported configuration."
); );
@@ -540,7 +540,7 @@ getJasmineRequireObj().Env = function(j$) {
try { try {
const maybePromise = fn(spy); const maybePromise = fn(spy);
if (!j$.private.isPromiseLike(maybePromise)) { if (!private$.isPromiseLike(maybePromise)) {
throw new Error( throw new Error(
'The callback to spyOnGlobalErrorsAsync must be an async or promise-returning function' 'The callback to spyOnGlobalErrorsAsync must be an async or promise-returning function'
); );
@@ -783,7 +783,7 @@ getJasmineRequireObj().Env = function(j$) {
}; };
this.pending = function(message) { this.pending = function(message) {
let fullMessage = j$.private.Spec.pendingSpecExceptionMessage; let fullMessage = private$.Spec.pendingSpecExceptionMessage;
if (message) { if (message) {
fullMessage += message; fullMessage += message;
} }
@@ -802,7 +802,7 @@ getJasmineRequireObj().Env = function(j$) {
message += ': '; message += ': ';
if (error.message) { if (error.message) {
message += error.message; message += error.message;
} else if (j$.private.isString(error)) { } else if (private$.isString(error)) {
message += error; message += error;
} else { } else {
// pretty print all kind of objects. This includes arrays. // pretty print all kind of objects. This includes arrays.
@@ -828,7 +828,7 @@ getJasmineRequireObj().Env = function(j$) {
this.pp = function(value) { this.pp = function(value) {
const pp = runner.currentRunable() const pp = runner.currentRunable()
? runableResources.makePrettyPrinter() ? runableResources.makePrettyPrinter()
: j$.private.basicPrettyPrinter; : private$.basicPrettyPrinter;
return pp(value); return pp(value);
}; };
@@ -836,16 +836,18 @@ getJasmineRequireObj().Env = function(j$) {
uninstallGlobalErrors(); uninstallGlobalErrors();
}; };
j$.private.deprecateMonkeyPatching(this, ['deprecated']); Object.freeze(this);
} }
function indirectCallerFilename(depth) { function indirectCallerFilename(depth) {
const frames = new j$.private.StackTrace(new Error()).frames; const frames = new private$.StackTrace(new Error()).frames;
// The specified frame should always exist except in Jasmine's own tests, // The specified frame should always exist except in Jasmine's own tests,
// which bypass the global it/describe layer, but could be absent in case // which bypass the global it/describe layer, but could be absent in case
// of misconfiguration. Don't crash if it's absent. // of misconfiguration. Don't crash if it's absent.
return frames[depth] && frames[depth].file; return frames[depth] && frames[depth].file;
} }
Object.freeze(Env);
Object.freeze(Env.prototype);
return Env; return Env;
}; };

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().ExceptionFormatter = function(j$) { getJasmineRequireObj().ExceptionFormatter = function(j$, private$) {
'use strict'; 'use strict';
const ignoredProperties = [ const ignoredProperties = [
@@ -17,7 +17,7 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
function ExceptionFormatter(options) { function ExceptionFormatter(options) {
const jasmineFile = const jasmineFile =
(options && options.jasmineFile) || j$.private.util.jasmineFile(); (options && options.jasmineFile) || private$.util.jasmineFile();
this.message = function(error) { this.message = function(error) {
let message = ''; let message = '';
@@ -61,7 +61,7 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
lines.pop(); lines.pop();
} }
const stackTrace = new j$.private.StackTrace(error); const stackTrace = new private$.StackTrace(error);
lines = lines.concat(filterJasmine(stackTrace)); lines = lines.concat(filterJasmine(stackTrace));
if (messageHandling === 'require') { if (messageHandling === 'require') {
@@ -128,7 +128,7 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
if (!empty) { if (!empty) {
return ( return (
'error properties: ' + j$.private.basicPrettyPrinter(result) + '\n' 'error properties: ' + private$.basicPrettyPrinter(result) + '\n'
); );
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Expectation = function(j$) { getJasmineRequireObj().Expectation = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -6,7 +6,7 @@ getJasmineRequireObj().Expectation = function(j$) {
* @namespace matchers * @namespace matchers
*/ */
function Expectation(options) { function Expectation(options) {
this.expector = new j$.private.Expector(options); this.expector = new private$.Expector(options);
const customMatchers = options.customMatchers || {}; const customMatchers = options.customMatchers || {};
for (const matcherName in customMatchers) { for (const matcherName in customMatchers) {
@@ -82,7 +82,7 @@ getJasmineRequireObj().Expectation = function(j$) {
* @namespace async-matchers * @namespace async-matchers
*/ */
function AsyncExpectation(options) { function AsyncExpectation(options) {
this.expector = new j$.private.Expector(options); this.expector = new private$.Expector(options);
const customAsyncMatchers = options.customAsyncMatchers || {}; const customAsyncMatchers = options.customAsyncMatchers || {};
for (const matcherName in customAsyncMatchers) { for (const matcherName in customAsyncMatchers) {
@@ -175,7 +175,7 @@ getJasmineRequireObj().Expectation = function(j$) {
function negatedFailureMessage(result, matcherName, args, matchersUtil) { function negatedFailureMessage(result, matcherName, args, matchersUtil) {
if (result.message) { if (result.message) {
if (j$.private.isFunction(result.message)) { if (private$.isFunction(result.message)) {
return result.message(); return result.message();
} else { } else {
return result.message; return result.message;
@@ -220,7 +220,7 @@ getJasmineRequireObj().Expectation = function(j$) {
return function(actual) { return function(actual) {
const matcherArgs = arguments; const matcherArgs = arguments;
return j$.private.isPending(actual).then(function(isPending) { return private$.isPending(actual).then(function(isPending) {
if (isPending) { if (isPending) {
return { return {
pass: false, pass: false,

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Expector = function(j$) { getJasmineRequireObj().Expector = function(j$, private$) {
'use strict'; 'use strict';
function Expector(options) { function Expector(options) {
@@ -7,7 +7,7 @@ getJasmineRequireObj().Expector = function(j$) {
}; };
this.actual = options.actual; this.actual = options.actual;
this.addExpectationResult = options.addExpectationResult || function() {}; this.addExpectationResult = options.addExpectationResult || function() {};
this.filters = new j$.private.ExpectationFilterChain(); this.filters = new private$.ExpectationFilterChain();
} }
Expector.prototype.instantiateMatcher = function( Expector.prototype.instantiateMatcher = function(
@@ -41,7 +41,7 @@ getJasmineRequireObj().Expector = function(j$) {
this.matchersUtil, this.matchersUtil,
args args
); );
} else if (j$.private.isFunction(result.message)) { } else if (private$.isFunction(result.message)) {
return result.message(); return result.message();
} else { } else {
return result.message; return result.message;

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().GlobalErrors = function(j$) { getJasmineRequireObj().GlobalErrors = function(j$, private$) {
'use strict'; 'use strict';
class GlobalErrors { class GlobalErrors {
@@ -26,7 +26,7 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
if ( if (
global.process && global.process &&
global.process.listeners && global.process.listeners &&
j$.private.isFunction(global.process.on) private$.isFunction(global.process.on)
) { ) {
this.#adapter = new NodeAdapter(global, dispatch); this.#adapter = new NodeAdapter(global, dispatch);
} else { } else {
@@ -183,7 +183,7 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
const jasmineMessage = 'Unhandled promise rejection: ' + event.reason; const jasmineMessage = 'Unhandled promise rejection: ' + event.reason;
let reason; let reason;
if (j$.private.isError(event.reason)) { if (private$.isError(event.reason)) {
reason = event.reason; reason = event.reason;
reason.jasmineMessage = jasmineMessage; reason.jasmineMessage = jasmineMessage;
} else { } else {
@@ -262,7 +262,7 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
jasmineMessagePrefix = 'Uncaught exception'; jasmineMessagePrefix = 'Uncaught exception';
} }
if (j$.private.isError(error)) { if (private$.isError(error)) {
error.jasmineMessage = jasmineMessagePrefix + ': ' + error; error.jasmineMessage = jasmineMessagePrefix + ': ' + error;
return error; return error;
} else { } else {

View File

@@ -1,133 +0,0 @@
getJasmineRequireObj().JsApiReporter = function(j$) {
'use strict';
// TODO: remove in 7.0.
/**
* @name jsApiReporter
* @classdesc {@link Reporter} added by default in `boot.js` to record results for retrieval in javascript code. An instance is made available as `jsApiReporter` on the global object.
* @class
* @hideconstructor
* @deprecated In most cases jsApiReporter can simply be removed. If necessary, it can be replaced with a {@link Reporter|custom reporter}.
*/
function JsApiReporter(options) {
const timer = options.timer || new j$.Timer();
let status = 'loaded';
this.started = false;
this.finished = false;
this.runDetails = {};
this.jasmineStarted = function() {
this.started = true;
status = 'started';
timer.start();
};
let executionTime;
this.jasmineDone = function(runDetails) {
this.finished = true;
this.runDetails = runDetails;
executionTime = timer.elapsed();
status = 'done';
};
/**
* Get the current status for the Jasmine environment.
* @name jsApiReporter#status
* @since 2.0.0
* @function
* @return {String} - One of `loaded`, `started`, or `done`
*/
this.status = function() {
return status;
};
const suites = [],
suites_hash = {};
this.suiteStarted = function(result) {
suites_hash[result.id] = result;
};
this.suiteDone = function(result) {
storeSuite(result);
};
/**
* Get the results for a set of suites.
*
* Retrievable in slices for easier serialization.
* @name jsApiReporter#suiteResults
* @since 2.1.0
* @function
* @param {Number} index - The position in the suites list to start from.
* @param {Number} length - Maximum number of suite results to return.
* @return {SuiteResult[]}
*/
this.suiteResults = function(index, length) {
return suites.slice(index, index + length);
};
function storeSuite(result) {
suites.push(result);
suites_hash[result.id] = result;
}
/**
* Get all of the suites in a single object, with their `id` as the key.
* @name jsApiReporter#suites
* @since 2.0.0
* @function
* @return {Object} - Map of suite id to {@link SuiteResult}
*/
this.suites = function() {
return suites_hash;
};
const specs = [];
this.specDone = function(result) {
specs.push(result);
};
/**
* Get the results for a set of specs.
*
* Retrievable in slices for easier serialization.
* @name jsApiReporter#specResults
* @since 2.0.0
* @function
* @param {Number} index - The position in the specs list to start from.
* @param {Number} length - Maximum number of specs results to return.
* @return {SpecDoneEvent[]}
*/
this.specResults = function(index, length) {
return specs.slice(index, index + length);
};
/**
* Get all spec results.
* @name jsApiReporter#specs
* @since 2.0.0
* @function
* @return {SpecDoneEvent[]}
*/
this.specs = function() {
return specs;
};
/**
* Get the number of milliseconds it took for the full Jasmine suite to run.
* @name jsApiReporter#executionTime
* @since 2.0.0
* @function
* @return {Number}
*/
this.executionTime = function() {
return executionTime;
};
}
return JsApiReporter;
};

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().MockDate = function(j$) { getJasmineRequireObj().MockDate = function(j$, private$) {
'use strict'; 'use strict';
function MockDate(global) { function MockDate(global) {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().NeverSkipPolicy = function(j$) { getJasmineRequireObj().NeverSkipPolicy = function(j$, private$) {
'use strict'; 'use strict';
function NeverSkipPolicy(queueableFns) {} function NeverSkipPolicy(queueableFns) {}

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().ParallelReportDispatcher = function(j$) { getJasmineRequireObj().ParallelReportDispatcher = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -15,43 +15,43 @@ getJasmineRequireObj().ParallelReportDispatcher = function(j$) {
* Jasmine specs run in. Doing so will break Jasmine's error handling. * Jasmine specs run in. Doing so will break Jasmine's error handling.
* @param onError {function} Function called when an unhandled exception, unhandled promise rejection, or explicit reporter failure occurs * @param onError {function} Function called when an unhandled exception, unhandled promise rejection, or explicit reporter failure occurs
*/ */
function ParallelReportDispatcher(onError, deps = {}) { class ParallelReportDispatcher {
const ReportDispatcher = constructor(onError, deps = {}) {
deps.ReportDispatcher || j$.private.ReportDispatcher; const ReportDispatcher =
const QueueRunner = deps.QueueRunner || j$.private.QueueRunner; deps.ReportDispatcher || private$.ReportDispatcher;
const globalErrors = deps.globalErrors || new j$.private.GlobalErrors(); const QueueRunner = deps.QueueRunner || private$.QueueRunner;
const dispatcher = new ReportDispatcher( const globalErrors = deps.globalErrors || new private$.GlobalErrors();
j$.private.reporterEvents, const dispatcher = new ReportDispatcher(
function(queueRunnerOptions) { private$.reporterEvents,
queueRunnerOptions = { function(queueRunnerOptions) {
...queueRunnerOptions, queueRunnerOptions = {
globalErrors, ...queueRunnerOptions,
timeout: { setTimeout, clearTimeout }, globalErrors,
fail: function(error) { timeout: { setTimeout, clearTimeout },
// A callback-style async reporter called either done.fail() fail: function(error) {
// or done(anError). // A callback-style async reporter called either done.fail()
if (!error) { // or done(anError).
error = new Error('A reporter called done.fail()'); if (!error) {
error = new Error('A reporter called done.fail()');
}
onError(error);
},
onException: function(error) {
// A reporter method threw an exception or returned a rejected
// promise, or there was an unhandled exception or unhandled promise
// rejection while an asynchronous reporter method was running.
onError(error);
} }
};
new QueueRunner(queueRunnerOptions).execute();
},
function(error) {
// A reporter called done() more than once.
onError(error);
}
);
onError(error);
},
onException: function(error) {
// A reporter method threw an exception or returned a rejected
// promise, or there was an unhandled exception or unhandled promise
// rejection while an asynchronous reporter method was running.
onError(error);
}
};
new QueueRunner(queueRunnerOptions).execute();
},
function(error) {
// A reporter called done() more than once.
onError(error);
}
);
const self = {
/** /**
* Adds a reporter to the list of reporters that events will be dispatched to. * Adds a reporter to the list of reporters that events will be dispatched to.
* @function * @function
@@ -59,13 +59,13 @@ getJasmineRequireObj().ParallelReportDispatcher = function(j$) {
* @param {Reporter} reporterToAdd The reporter to be added. * @param {Reporter} reporterToAdd The reporter to be added.
* @see custom_reporter * @see custom_reporter
*/ */
addReporter: dispatcher.addReporter.bind(dispatcher), this.addReporter = dispatcher.addReporter.bind(dispatcher);
/** /**
* Clears all registered reporters. * Clears all registered reporters.
* @function * @function
* @name ParallelReportDispatcher#clearReporters * @name ParallelReportDispatcher#clearReporters
*/ */
clearReporters: dispatcher.clearReporters.bind(dispatcher), this.clearReporters = dispatcher.clearReporters.bind(dispatcher);
/** /**
* Installs a global error handler. After this method is called, any * Installs a global error handler. After this method is called, any
* unhandled exceptions or unhandled promise rejections will be passed to * unhandled exceptions or unhandled promise rejections will be passed to
@@ -73,24 +73,25 @@ getJasmineRequireObj().ParallelReportDispatcher = function(j$) {
* @function * @function
* @name ParallelReportDispatcher#installGlobalErrors * @name ParallelReportDispatcher#installGlobalErrors
*/ */
installGlobalErrors: globalErrors.install.bind(globalErrors), this.installGlobalErrors = globalErrors.install.bind(globalErrors);
/** /**
* Uninstalls the global error handler. * Uninstalls the global error handler.
* @function * @function
* @name ParallelReportDispatcher#uninstallGlobalErrors * @name ParallelReportDispatcher#uninstallGlobalErrors
*/ */
uninstallGlobalErrors: function() { this.uninstallGlobalErrors = function() {
// late-bind uninstall because it doesn't exist until install is called // late-bind uninstall because it doesn't exist until install is called
globalErrors.uninstall(globalErrors); globalErrors.uninstall(globalErrors);
};
for (const eventName of private$.reporterEvents) {
this[eventName] = dispatcher[eventName].bind(dispatcher);
} }
};
for (const eventName of j$.private.reporterEvents) { Object.freeze(this);
self[eventName] = dispatcher[eventName].bind(dispatcher);
} }
return self;
} }
Object.freeze(ParallelReportDispatcher.prototype);
return ParallelReportDispatcher; return ParallelReportDispatcher;
}; };

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().makePrettyPrinter = function(j$) { getJasmineRequireObj().makePrettyPrinter = function(j$, private$) {
'use strict'; 'use strict';
class SinglePrettyPrintRun { class SinglePrettyPrintRun {
@@ -28,7 +28,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
this.emitScalar('<global>'); this.emitScalar('<global>');
} else if (value.jasmineToString) { } else if (value.jasmineToString) {
this.emitScalar(value.jasmineToString(this.pp_)); this.emitScalar(value.jasmineToString(this.pp_));
} else if (j$.private.isString(value)) { } else if (private$.isString(value)) {
this.emitString(value); this.emitString(value);
} else if (j$.isSpy(value)) { } else if (j$.isSpy(value)) {
this.emitScalar('spy on ' + value.and.identity); this.emitScalar('spy on ' + value.and.identity);
@@ -42,7 +42,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
} else { } else {
this.emitScalar('Function'); this.emitScalar('Function');
} }
} else if (j$.private.isDomNode(value)) { } else if (private$.isDomNode(value)) {
if (value.tagName) { if (value.tagName) {
this.emitDomElement(value); this.emitDomElement(value);
} else { } else {
@@ -50,11 +50,11 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
} }
} else if (value instanceof Date) { } else if (value instanceof Date) {
this.emitScalar('Date(' + value + ')'); this.emitScalar('Date(' + value + ')');
} else if (j$.private.isSet(value)) { } else if (private$.isSet(value)) {
this.emitSet(value); this.emitSet(value);
} else if (j$.private.isMap(value)) { } else if (private$.isMap(value)) {
this.emitMap(value); this.emitMap(value);
} else if (j$.private.isTypedArray(value)) { } else if (private$.isTypedArray(value)) {
this.emitTypedArray(value); this.emitTypedArray(value);
} else if ( } else if (
value.toString && value.toString &&
@@ -74,7 +74,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
(Array.isArray(value) ? 'Array' : 'Object') + (Array.isArray(value) ? 'Array' : 'Object') +
'>' '>'
); );
} else if (Array.isArray(value) || j$.private.isA('Object', value)) { } else if (Array.isArray(value) || private$.isA('Object', value)) {
this.seen.push(value); this.seen.push(value);
if (Array.isArray(value)) { if (Array.isArray(value)) {
this.emitArray(value); this.emitArray(value);
@@ -99,7 +99,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
} }
iterateObject(obj, fn) { iterateObject(obj, fn) {
const objKeys = j$.private.MatchersUtil.keys(obj, Array.isArray(obj)); const objKeys = private$.MatchersUtil.keys(obj, Array.isArray(obj));
const length = Math.min(objKeys.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); const length = Math.min(objKeys.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
@@ -208,7 +208,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
const ctor = obj.constructor; const ctor = obj.constructor;
const constructorName = const constructorName =
typeof ctor === 'function' && obj instanceof ctor typeof ctor === 'function' && obj instanceof ctor
? j$.private.fnNameFor(obj.constructor) ? private$.fnNameFor(obj.constructor)
: 'null'; : 'null';
this.append(constructorName); this.append(constructorName);
@@ -238,7 +238,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
} }
emitTypedArray(arr) { emitTypedArray(arr) {
const constructorName = j$.private.fnNameFor(arr.constructor); const constructorName = private$.fnNameFor(arr.constructor);
const limitedArray = Array.prototype.slice.call( const limitedArray = Array.prototype.slice.call(
arr, arr,
0, 0,
@@ -307,7 +307,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
// iframe, web worker) // iframe, web worker)
try { try {
return ( return (
j$.private.isFunction(value.toString) && private$.isFunction(value.toString) &&
value.toString !== Object.prototype.toString && value.toString !== Object.prototype.toString &&
value.toString() !== Object.prototype.toString.call(value) value.toString() !== Object.prototype.toString.call(value)
); );

View File

@@ -1,11 +1,11 @@
getJasmineRequireObj().QueueRunner = function(j$) { getJasmineRequireObj().QueueRunner = function(j$, private$) {
'use strict'; 'use strict';
let nextid = 1; let nextid = 1;
function StopExecutionError() {} function StopExecutionError() {}
StopExecutionError.prototype = new Error(); StopExecutionError.prototype = new Error();
j$.private.StopExecutionError = StopExecutionError; private$.StopExecutionError = StopExecutionError;
function once(fn, onTwice) { function once(fn, onTwice) {
let called = false; let called = false;
@@ -58,7 +58,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
}; };
this.onException = attrs.onException || emptyFn; this.onException = attrs.onException || emptyFn;
this.onMultipleDone = attrs.onMultipleDone || fallbackOnMultipleDone; this.onMultipleDone = attrs.onMultipleDone || fallbackOnMultipleDone;
this.userContext = attrs.userContext || new j$.private.UserContext(); this.userContext = attrs.userContext || new private$.UserContext();
this.timeout = attrs.timeout || { this.timeout = attrs.timeout || {
setTimeout: setTimeout, setTimeout: setTimeout,
clearTimeout: clearTimeout clearTimeout: clearTimeout
@@ -69,7 +69,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
popListener: emptyFn popListener: emptyFn
}; };
const SkipPolicy = attrs.SkipPolicy || j$.private.NeverSkipPolicy; const SkipPolicy = attrs.SkipPolicy || private$.NeverSkipPolicy;
this.skipPolicy_ = new SkipPolicy(this.queueableFns); this.skipPolicy_ = new SkipPolicy(this.queueableFns);
this.errored_ = false; this.errored_ = false;
@@ -192,7 +192,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
if (queueableFn.fn.length === 0) { if (queueableFn.fn.length === 0) {
maybeThenable = queueableFn.fn.call(this.userContext); maybeThenable = queueableFn.fn.call(this.userContext);
if (maybeThenable && j$.private.isFunction(maybeThenable.then)) { if (maybeThenable && private$.isFunction(maybeThenable.then)) {
maybeThenable.then( maybeThenable.then(
wrapInPromiseResolutionHandler(next), wrapInPromiseResolutionHandler(next),
onPromiseRejection onPromiseRejection
@@ -262,11 +262,11 @@ getJasmineRequireObj().QueueRunner = function(j$) {
}; };
QueueRunner.prototype.diagnoseConflictingAsync_ = function(fn, retval) { QueueRunner.prototype.diagnoseConflictingAsync_ = function(fn, retval) {
if (retval && j$.private.isFunction(retval.then)) { if (retval && private$.isFunction(retval.then)) {
// Issue a warning that matches the user's code. // Issue a warning that matches the user's code.
// Omit the stack trace because there's almost certainly no user code // Omit the stack trace because there's almost certainly no user code
// on the stack at this point. // on the stack at this point.
if (j$.private.isAsyncFunction(fn)) { if (private$.isAsyncFunction(fn)) {
this.onException( this.onException(
new Error( new Error(
'An asynchronous before/it/after ' + 'An asynchronous before/it/after ' +
@@ -290,7 +290,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
function wrapInPromiseResolutionHandler(fn) { function wrapInPromiseResolutionHandler(fn) {
return function(maybeArg) { return function(maybeArg) {
if (j$.private.isError(maybeArg)) { if (private$.isError(maybeArg)) {
fn(maybeArg); fn(maybeArg);
} else { } else {
fn(); fn();

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().ReportDispatcher = function(j$) { getJasmineRequireObj().ReportDispatcher = function(j$, private$) {
'use strict'; 'use strict';
function ReportDispatcher(methods, runQueue, onLateError) { function ReportDispatcher(methods, runQueue, onLateError) {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().RunableResources = function(j$) { getJasmineRequireObj().RunableResources = function(j$, private$) {
'use strict'; 'use strict';
class RunableResources { class RunableResources {
@@ -7,7 +7,7 @@ getJasmineRequireObj().RunableResources = function(j$) {
this.getCurrentRunableId_ = options.getCurrentRunableId; this.getCurrentRunableId_ = options.getCurrentRunableId;
this.globalErrors_ = options.globalErrors; this.globalErrors_ = options.globalErrors;
this.spyFactory = new j$.private.SpyFactory( this.spyFactory = new private$.SpyFactory(
() => { () => {
if (this.getCurrentRunableId_()) { if (this.getCurrentRunableId_()) {
return this.customSpyStrategies(); return this.customSpyStrategies();
@@ -19,7 +19,7 @@ getJasmineRequireObj().RunableResources = function(j$) {
() => this.makeMatchersUtil() () => this.makeMatchersUtil()
); );
this.spyRegistry = new j$.private.SpyRegistry({ this.spyRegistry = new private$.SpyRegistry({
currentSpies: () => this.spies(), currentSpies: () => this.spies(),
createSpy: (name, originalFn) => createSpy: (name, originalFn) =>
this.spyFactory.createSpy(name, originalFn) this.spyFactory.createSpy(name, originalFn)
@@ -50,7 +50,7 @@ getJasmineRequireObj().RunableResources = function(j$) {
]; ];
for (const k of toClone) { for (const k of toClone) {
newRes[k] = j$.private.util.clone(parentRes[k]); newRes[k] = private$.util.clone(parentRes[k]);
} }
} }
} }
@@ -128,18 +128,18 @@ getJasmineRequireObj().RunableResources = function(j$) {
} }
makePrettyPrinter() { makePrettyPrinter() {
return j$.private.makePrettyPrinter(this.customObjectFormatters()); return private$.makePrettyPrinter(this.customObjectFormatters());
} }
makeMatchersUtil() { makeMatchersUtil() {
if (this.getCurrentRunableId_()) { if (this.getCurrentRunableId_()) {
return new j$.private.MatchersUtil({ return new private$.MatchersUtil({
customTesters: this.customEqualityTesters(), customTesters: this.customEqualityTesters(),
pp: this.makePrettyPrinter() pp: this.makePrettyPrinter()
}); });
} else { } else {
return new j$.private.MatchersUtil({ return new private$.MatchersUtil({
pp: j$.private.basicPrettyPrinter pp: private$.basicPrettyPrinter
}); });
} }
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Runner = function(j$) { getJasmineRequireObj().Runner = function(j$, private$) {
'use strict'; 'use strict';
class Runner { class Runner {
@@ -26,7 +26,7 @@ getJasmineRequireObj().Runner = function(j$) {
this.#reportDispatcher = options.reportDispatcher; this.#reportDispatcher = options.reportDispatcher;
this.#getConfig = options.getConfig; this.#getConfig = options.getConfig;
this.#executedBefore = false; this.#executedBefore = false;
this.#currentRunableTracker = new j$.private.CurrentRunableTracker(); this.#currentRunableTracker = new private$.CurrentRunableTracker();
} }
currentSpec() { currentSpec() {
@@ -66,9 +66,9 @@ getJasmineRequireObj().Runner = function(j$) {
} }
} }
const order = new j$.private.Order({ const order = new private$.Order({
random: config.random, random: config.random,
seed: j$.private.isNumber(config.seed) ? config.seed + '' : config.seed seed: private$.isNumber(config.seed) ? config.seed + '' : config.seed
}); });
const treeProcessor = new this.#TreeProcessor({ const treeProcessor = new this.#TreeProcessor({
@@ -112,7 +112,7 @@ getJasmineRequireObj().Runner = function(j$) {
}); });
this.#currentRunableTracker.pushSuite(this.#topSuite); this.#currentRunableTracker.pushSuite(this.#topSuite);
const treeRunner = new j$.private.TreeRunner({ const treeRunner = new private$.TreeRunner({
executionTree: this.#executionTree, executionTree: this.#executionTree,
globalErrors: this.#globalErrors, globalErrors: this.#globalErrors,
runableResources: this.#runableResources, runableResources: this.#runableResources,

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().SkipAfterBeforeAllErrorPolicy = function(j$) { getJasmineRequireObj().SkipAfterBeforeAllErrorPolicy = function(j$, private$) {
'use strict'; 'use strict';
function SkipAfterBeforeAllErrorPolicy(queueableFns) { function SkipAfterBeforeAllErrorPolicy(queueableFns) {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Spec = function(j$) { getJasmineRequireObj().Spec = function(j$, private$) {
'use strict'; 'use strict';
class Spec { class Spec {
@@ -46,7 +46,7 @@ getJasmineRequireObj().Spec = function(j$) {
} }
addExpectationResult(passed, data, isError) { addExpectationResult(passed, data, isError) {
const expectationResult = j$.private.buildExpectationResult(data); const expectationResult = private$.buildExpectationResult(data);
if (passed) { if (passed) {
this.#executionState.passedExpectations.push(expectationResult); this.#executionState.passedExpectations.push(expectationResult);
@@ -58,7 +58,7 @@ getJasmineRequireObj().Spec = function(j$) {
} }
if (this.#throwOnExpectationFailure && !isError) { if (this.#throwOnExpectationFailure && !isError) {
throw new j$.private.errors.ExpectationFailed(); throw new private$.errors.ExpectationFailed();
} }
} }
} }
@@ -72,10 +72,10 @@ getJasmineRequireObj().Spec = function(j$) {
// Key and value will eventually be cloned during reporting. The error // Key and value will eventually be cloned during reporting. The error
// thrown at that point if they aren't cloneable isn't very helpful. // thrown at that point if they aren't cloneable isn't very helpful.
// Throw a better one now. // Throw a better one now.
if (!j$.private.isString(key)) { if (!private$.isString(key)) {
throw new Error('Key must be a string'); throw new Error('Key must be a string');
} }
j$.private.util.assertReporterCloneable(value, 'Value'); private$.util.assertReporterCloneable(value, 'Value');
this.#executionState.properties = this.#executionState.properties || {}; this.#executionState.properties = this.#executionState.properties || {};
this.#executionState.properties[key] = value; this.#executionState.properties[key] = value;
@@ -208,7 +208,7 @@ getJasmineRequireObj().Spec = function(j$) {
return; return;
} }
if (e instanceof j$.private.errors.ExpectationFailed) { if (e instanceof private$.errors.ExpectationFailed) {
return; return;
} }
@@ -275,7 +275,7 @@ getJasmineRequireObj().Spec = function(j$) {
deprecation = { message: deprecation }; deprecation = { message: deprecation };
} }
this.#executionState.deprecationWarnings.push( this.#executionState.deprecationWarnings.push(
j$.private.buildExpectationResult(deprecation) private$.buildExpectationResult(deprecation)
); );
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Spy = function(j$) { getJasmineRequireObj().Spy = function(j$, private$) {
'use strict'; 'use strict';
const nextOrder = (function() { const nextOrder = (function() {
@@ -55,7 +55,7 @@ getJasmineRequireObj().Spy = function(j$) {
}, },
matchersUtil matchersUtil
), ),
callTracker = new j$.private.CallTracker(); callTracker = new private$.CallTracker();
function makeFunc(length, fn) { function makeFunc(length, fn) {
switch (length) { switch (length) {
@@ -147,9 +147,9 @@ getJasmineRequireObj().Spy = function(j$) {
} }
function SpyStrategyDispatcher(strategyArgs, matchersUtil) { function SpyStrategyDispatcher(strategyArgs, matchersUtil) {
const baseStrategy = new j$.private.SpyStrategy(strategyArgs); const baseStrategy = new private$.SpyStrategy(strategyArgs);
const argsStrategies = new StrategyDict(function() { const argsStrategies = new StrategyDict(function() {
return new j$.private.SpyStrategy(strategyArgs); return new private$.SpyStrategy(strategyArgs);
}, matchersUtil); }, matchersUtil);
this.and = baseStrategy; this.and = baseStrategy;

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().SpyFactory = function(j$) { getJasmineRequireObj().SpyFactory = function(j$, private$) {
'use strict'; 'use strict';
function SpyFactory( function SpyFactory(
@@ -7,12 +7,12 @@ getJasmineRequireObj().SpyFactory = function(j$) {
getMatchersUtil getMatchersUtil
) { ) {
this.createSpy = function(name, originalFn) { this.createSpy = function(name, originalFn) {
if (j$.private.isFunction(name) && originalFn === undefined) { if (private$.isFunction(name) && originalFn === undefined) {
originalFn = name; originalFn = name;
name = originalFn.name; name = originalFn.name;
} }
return j$.private.Spy(name, getMatchersUtil(), { return private$.Spy(name, getMatchersUtil(), {
originalFn, originalFn,
customStrategies: getCustomStrategies(), customStrategies: getCustomStrategies(),
defaultStrategyFn: getDefaultStrategyFn() defaultStrategyFn: getDefaultStrategyFn()
@@ -21,7 +21,7 @@ getJasmineRequireObj().SpyFactory = function(j$) {
this.createSpyObj = function(baseName, methodNames, propertyNames) { this.createSpyObj = function(baseName, methodNames, propertyNames) {
const baseNameIsCollection = const baseNameIsCollection =
j$.private.isObject(baseName) || Array.isArray(baseName); private$.isObject(baseName) || Array.isArray(baseName);
if (baseNameIsCollection) { if (baseNameIsCollection) {
propertyNames = methodNames; propertyNames = methodNames;
@@ -71,7 +71,7 @@ getJasmineRequireObj().SpyFactory = function(j$) {
for (let i = 0; i < object.length; i++) { for (let i = 0; i < object.length; i++) {
result.push([object[i]]); result.push([object[i]]);
} }
} else if (j$.private.isObject(object)) { } else if (private$.isObject(object)) {
for (const key in object) { for (const key in object) {
if (object.hasOwnProperty(key)) { if (object.hasOwnProperty(key)) {
result.push([key, object[key]]); result.push([key, object[key]]);

View File

@@ -1,11 +1,11 @@
getJasmineRequireObj().SpyRegistry = function(j$) { getJasmineRequireObj().SpyRegistry = function(j$, private$) {
'use strict'; 'use strict';
const spyOnMsg = j$.private.formatErrorMsg( const spyOnMsg = private$.formatErrorMsg(
'<spyOn>', '<spyOn>',
'spyOn(<object>, <methodName>)' 'spyOn(<object>, <methodName>)'
); );
const spyOnPropertyMsg = j$.private.formatErrorMsg( const spyOnPropertyMsg = private$.formatErrorMsg(
'<spyOnProperty>', '<spyOnProperty>',
'spyOnProperty(<object>, <propName>, [accessType])' 'spyOnProperty(<object>, <propName>, [accessType])'
); );
@@ -47,7 +47,7 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
// restored. // restored.
if ( if (
obj[methodName] && obj[methodName] &&
obj[methodName][j$.private.Clock.IsMockClockTimingFn] obj[methodName][private$.Clock.IsMockClockTimingFn]
) { ) {
throw new Error("Mock clock timing functions can't be spied on"); throw new Error("Mock clock timing functions can't be spied on");
} }
@@ -102,7 +102,7 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
// localStorage in Firefox and later Safari versions, have no-op setters. // localStorage in Firefox and later Safari versions, have no-op setters.
if (obj[methodName] !== spiedMethod) { if (obj[methodName] !== spiedMethod) {
throw new Error( throw new Error(
j$.private.formatErrorMsg('<spyOn>')( private$.formatErrorMsg('<spyOn>')(
`Can't spy on ${methodName} because assigning to it had no effect` `Can't spy on ${methodName} because assigning to it had no effect`
) )
); );
@@ -130,10 +130,7 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
throw new Error(getErrorMsg('No property name supplied')); throw new Error(getErrorMsg('No property name supplied'));
} }
const descriptor = j$.private.util.getPropertyDescriptor( const descriptor = private$.util.getPropertyDescriptor(obj, propertyName);
obj,
propertyName
);
if (!descriptor) { if (!descriptor) {
throw new Error(getErrorMsg(propertyName + ' property does not exist')); throw new Error(getErrorMsg(propertyName + ' property does not exist'));
@@ -168,7 +165,7 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
} }
} }
const originalDescriptor = j$.private.util.clone(descriptor); const originalDescriptor = private$.util.clone(descriptor);
const spy = createSpy(propertyName, descriptor[accessType]); const spy = createSpy(propertyName, descriptor[accessType]);
let restoreStrategy; let restoreStrategy;

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().SpyStrategy = function(j$) { getJasmineRequireObj().SpyStrategy = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -21,7 +21,7 @@ getJasmineRequireObj().SpyStrategy = function(j$) {
const cs = options.customStrategies || {}; const cs = options.customStrategies || {};
for (const k in cs) { for (const k in cs) {
if (j$.private.util.has(cs, k) && !this[k]) { if (private$.util.has(cs, k) && !this[k]) {
this[k] = createCustomPlan(cs[k]); this[k] = createCustomPlan(cs[k]);
} }
} }
@@ -59,7 +59,7 @@ getJasmineRequireObj().SpyStrategy = function(j$) {
return function() { return function() {
const plan = factory.apply(null, arguments); const plan = factory.apply(null, arguments);
if (!j$.private.isFunction(plan)) { if (!private$.isFunction(plan)) {
throw new Error('Spy strategy must return a function'); throw new Error('Spy strategy must return a function');
} }
@@ -131,7 +131,7 @@ getJasmineRequireObj().SpyStrategy = function(j$) {
* @param {Error|Object|String} something Thing to throw * @param {Error|Object|String} something Thing to throw
*/ */
SpyStrategy.prototype.throwError = function(something) { SpyStrategy.prototype.throwError = function(something) {
const error = j$.private.isString(something) const error = private$.isString(something)
? new Error(something) ? new Error(something)
: something; : something;
this.plan = function() { this.plan = function() {
@@ -150,9 +150,9 @@ getJasmineRequireObj().SpyStrategy = function(j$) {
SpyStrategy.prototype.callFake = function(fn) { SpyStrategy.prototype.callFake = function(fn) {
if ( if (
!( !(
j$.private.isFunction(fn) || private$.isFunction(fn) ||
j$.private.isAsyncFunction(fn) || private$.isAsyncFunction(fn) ||
j$.private.isGeneratorFunction(fn) private$.isGeneratorFunction(fn)
) )
) { ) {
throw new Error( throw new Error(

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().StackClearer = function(j$) { getJasmineRequireObj().StackClearer = function(j$, private$) {
'use strict'; 'use strict';
const maxInlineCallCount = 10; const maxInlineCallCount = 10;

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().StackTrace = function(j$) { getJasmineRequireObj().StackTrace = function(j$, private$) {
'use strict'; 'use strict';
function StackTrace(error) { function StackTrace(error) {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Suite = function(j$) { getJasmineRequireObj().Suite = function(j$, private$) {
'use strict'; 'use strict';
class Suite { class Suite {
@@ -37,10 +37,10 @@ getJasmineRequireObj().Suite = function(j$) {
// Key and value will eventually be cloned during reporting. The error // Key and value will eventually be cloned during reporting. The error
// thrown at that point if they aren't cloneable isn't very helpful. // thrown at that point if they aren't cloneable isn't very helpful.
// Throw a better one now. // Throw a better one now.
if (!j$.private.isString(key)) { if (!private$.isString(key)) {
throw new Error('Key must be a string'); throw new Error('Key must be a string');
} }
j$.private.util.assertReporterCloneable(value, 'Value'); private$.util.assertReporterCloneable(value, 'Value');
this.#result.properties = this.#result.properties || {}; this.#result.properties = this.#result.properties || {};
this.#result.properties[key] = value; this.#result.properties[key] = value;
@@ -217,18 +217,18 @@ getJasmineRequireObj().Suite = function(j$) {
if (!this.sharedContext) { if (!this.sharedContext) {
this.sharedContext = this.parentSuite this.sharedContext = this.parentSuite
? this.parentSuite.clonedSharedUserContext() ? this.parentSuite.clonedSharedUserContext()
: new j$.private.UserContext(); : new private$.UserContext();
} }
return this.sharedContext; return this.sharedContext;
} }
clonedSharedUserContext() { clonedSharedUserContext() {
return j$.private.UserContext.fromExisting(this.sharedUserContext()); return private$.UserContext.fromExisting(this.sharedUserContext());
} }
handleException() { handleException() {
if (arguments[0] instanceof j$.private.errors.ExpectationFailed) { if (arguments[0] instanceof private$.errors.ExpectationFailed) {
return; return;
} }
@@ -237,7 +237,7 @@ getJasmineRequireObj().Suite = function(j$) {
passed: false, passed: false,
error: arguments[0] error: arguments[0]
}; };
const failedExpectation = j$.private.buildExpectationResult(data); const failedExpectation = private$.buildExpectationResult(data);
if (!this.parentSuite) { if (!this.parentSuite) {
failedExpectation.globalErrorType = 'afterAll'; failedExpectation.globalErrorType = 'afterAll';
@@ -279,7 +279,7 @@ getJasmineRequireObj().Suite = function(j$) {
return; return;
} }
const expectationResult = j$.private.buildExpectationResult(data); const expectationResult = private$.buildExpectationResult(data);
if (this.reportedDone) { if (this.reportedDone) {
this.onLateError(expectationResult); this.onLateError(expectationResult);
@@ -288,7 +288,7 @@ getJasmineRequireObj().Suite = function(j$) {
} }
if (this.#throwOnExpectationFailure) { if (this.#throwOnExpectationFailure) {
throw new j$.private.errors.ExpectationFailed(); throw new private$.errors.ExpectationFailed();
} }
} }
@@ -297,7 +297,7 @@ getJasmineRequireObj().Suite = function(j$) {
deprecation = { message: deprecation }; deprecation = { message: deprecation };
} }
this.#result.deprecationWarnings.push( this.#result.deprecationWarnings.push(
j$.private.buildExpectationResult(deprecation) private$.buildExpectationResult(deprecation)
); );
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().SuiteBuilder = function(j$) { getJasmineRequireObj().SuiteBuilder = function(j$, private$) {
'use strict'; 'use strict';
class SuiteBuilder { class SuiteBuilder {
@@ -94,7 +94,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
ensureIsFunctionOrAsync(fn, 'fit'); ensureIsFunctionOrAsync(fn, 'fit');
if (timeout) { if (timeout) {
j$.private.util.validateTimeout(timeout); private$.util.validateTimeout(timeout);
} }
const spec = this.specFactory_(description, fn, timeout, filename); const spec = this.specFactory_(description, fn, timeout, filename);
this.currentDeclarationSuite_.addChild(spec); this.currentDeclarationSuite_.addChild(spec);
@@ -107,7 +107,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach'); ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach');
if (timeout) { if (timeout) {
j$.private.util.validateTimeout(timeout); private$.util.validateTimeout(timeout);
} }
this.currentDeclarationSuite_.beforeEach({ this.currentDeclarationSuite_.beforeEach({
@@ -120,7 +120,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll'); ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll');
if (timeout) { if (timeout) {
j$.private.util.validateTimeout(timeout); private$.util.validateTimeout(timeout);
} }
this.currentDeclarationSuite_.beforeAll({ this.currentDeclarationSuite_.beforeAll({
@@ -133,7 +133,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
ensureIsFunctionOrAsync(afterEachFunction, 'afterEach'); ensureIsFunctionOrAsync(afterEachFunction, 'afterEach');
if (timeout) { if (timeout) {
j$.private.util.validateTimeout(timeout); private$.util.validateTimeout(timeout);
} }
afterEachFunction.isCleanup = true; afterEachFunction.isCleanup = true;
@@ -147,7 +147,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
ensureIsFunctionOrAsync(afterAllFunction, 'afterAll'); ensureIsFunctionOrAsync(afterAllFunction, 'afterAll');
if (timeout) { if (timeout) {
j$.private.util.validateTimeout(timeout); private$.util.validateTimeout(timeout);
} }
this.currentDeclarationSuite_.afterAll({ this.currentDeclarationSuite_.afterAll({
@@ -158,7 +158,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
it_(description, fn, timeout, filename) { it_(description, fn, timeout, filename) {
if (timeout) { if (timeout) {
j$.private.util.validateTimeout(timeout); private$.util.validateTimeout(timeout);
} }
this.checkDuplicate_(description, 'spec'); this.checkDuplicate_(description, 'spec');
@@ -197,7 +197,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
const parentSuite = this.currentDeclarationSuite_; const parentSuite = this.currentDeclarationSuite_;
const reportedParentSuiteId = const reportedParentSuiteId =
parentSuite === this.topSuite ? null : parentSuite.id; parentSuite === this.topSuite ? null : parentSuite.id;
return new j$.private.Suite({ return new private$.Suite({
id: 'suite' + this.nextSuiteId_++, id: 'suite' + this.nextSuiteId_++,
description, description,
filename, filename,
@@ -239,7 +239,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
const config = this.env_.configuration(); const config = this.env_.configuration();
const suite = this.currentDeclarationSuite_; const suite = this.currentDeclarationSuite_;
const parentSuiteId = suite === this.topSuite ? null : suite.id; const parentSuiteId = suite === this.topSuite ? null : suite.id;
const spec = new j$.private.Spec({ const spec = new private$.Spec({
id: 'spec' + this.nextSpecId_++, id: 'spec' + this.nextSpecId_++,
filename, filename,
parentSuiteId, parentSuiteId,
@@ -302,21 +302,21 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
} }
function ensureIsFunction(fn, caller) { function ensureIsFunction(fn, caller) {
if (!j$.private.isFunction(fn)) { if (!private$.isFunction(fn)) {
throw new Error( throw new Error(
caller + caller +
' expects a function argument; received ' + ' expects a function argument; received ' +
j$.private.getType(fn) private$.getType(fn)
); );
} }
} }
function ensureIsFunctionOrAsync(fn, caller) { function ensureIsFunctionOrAsync(fn, caller) {
if (!j$.private.isFunction(fn) && !j$.private.isAsyncFunction(fn)) { if (!private$.isFunction(fn) && !private$.isAsyncFunction(fn)) {
throw new Error( throw new Error(
caller + caller +
' expects a function argument; received ' + ' expects a function argument; received ' +
j$.private.getType(fn) private$.getType(fn)
); );
} }
} }

View File

@@ -39,7 +39,11 @@ getJasmineRequireObj().Timer = function() {
this.elapsed = function() { this.elapsed = function() {
return now() - startTime; return now() - startTime;
}; };
Object.freeze(this);
} }
Object.freeze(Timer);
Object.freeze(Timer.prototype);
return Timer; return Timer;
}; };

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().TreeProcessor = function(j$) { getJasmineRequireObj().TreeProcessor = function(j$, private$) {
'use strict'; 'use strict';
const defaultMin = Infinity; const defaultMin = Infinity;

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().TreeRunner = function(j$) { getJasmineRequireObj().TreeRunner = function(j$, private$) {
'use strict'; 'use strict';
class TreeRunner { class TreeRunner {
@@ -83,14 +83,14 @@ getJasmineRequireObj().TreeRunner = function(j$) {
}, },
onComplete: () => { onComplete: () => {
if (spec.status() === 'failed') { if (spec.status() === 'failed') {
specOverallDone(new j$.private.StopExecutionError('spec failed')); specOverallDone(new private$.StopExecutionError('spec failed'));
} else { } else {
specOverallDone(); specOverallDone();
} }
}, },
userContext: spec.userContext(), userContext: spec.userContext(),
runnableName: spec.getFullName.bind(spec), runnableName: spec.getFullName.bind(spec),
SkipPolicy: j$.private.CompleteOnFirstErrorSkipPolicy SkipPolicy: private$.CompleteOnFirstErrorSkipPolicy
}); });
} }
@@ -265,7 +265,7 @@ getJasmineRequireObj().TreeRunner = function(j$) {
async #reportChildrenOfBeforeAllFailure(suite) { async #reportChildrenOfBeforeAllFailure(suite) {
for (const child of suite.children) { for (const child of suite.children) {
if (child instanceof j$.private.Suite) { if (child instanceof private$.Suite) {
await this.#reportDispatcher.suiteStarted(child.startedEvent()); await this.#reportDispatcher.suiteStarted(child.startedEvent());
await this.#reportChildrenOfBeforeAllFailure(child); await this.#reportChildrenOfBeforeAllFailure(child);
await this.#reportDispatcher.suiteDone(child.doneEvent()); await this.#reportDispatcher.suiteDone(child.doneEvent());
@@ -280,9 +280,9 @@ getJasmineRequireObj().TreeRunner = function(j$) {
#suiteSkipPolicy() { #suiteSkipPolicy() {
if (this.#getConfig().stopOnSpecFailure) { if (this.#getConfig().stopOnSpecFailure) {
return j$.private.CompleteOnFirstErrorSkipPolicy; return private$.CompleteOnFirstErrorSkipPolicy;
} else { } else {
return j$.private.SkipAfterBeforeAllErrorPolicy; return private$.SkipAfterBeforeAllErrorPolicy;
} }
} }
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().UserContext = function(j$) { getJasmineRequireObj().UserContext = function(j$, private$) {
'use strict'; 'use strict';
function UserContext() {} function UserContext() {}

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().AllOf = function(j$) { getJasmineRequireObj().AllOf = function(j$, private$) {
'use strict'; 'use strict';
function AllOf() { function AllOf() {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Any = function(j$) { getJasmineRequireObj().Any = function(j$, private$) {
'use strict'; 'use strict';
function Any(expectedObject) { function Any(expectedObject) {
@@ -40,7 +40,7 @@ getJasmineRequireObj().Any = function(j$) {
}; };
Any.prototype.jasmineToString = function() { Any.prototype.jasmineToString = function() {
return '<jasmine.any(' + j$.private.fnNameFor(this.expectedObject) + ')>'; return '<jasmine.any(' + private$.fnNameFor(this.expectedObject) + ')>';
}; };
return Any; return Any;

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Anything = function(j$) { getJasmineRequireObj().Anything = function(j$, private$) {
'use strict'; 'use strict';
function Anything() {} function Anything() {}

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().ArrayContaining = function(j$) { getJasmineRequireObj().ArrayContaining = function(j$, private$) {
'use strict'; 'use strict';
function ArrayContaining(sample) { function ArrayContaining(sample) {
@@ -9,7 +9,7 @@ getJasmineRequireObj().ArrayContaining = function(j$) {
if (!Array.isArray(this.sample)) { if (!Array.isArray(this.sample)) {
throw new Error( throw new Error(
'You must provide an array to arrayContaining, not ' + 'You must provide an array to arrayContaining, not ' +
j$.private.basicPrettyPrinter(this.sample) + private$.basicPrettyPrinter(this.sample) +
'.' '.'
); );
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().ArrayWithExactContents = function(j$) { getJasmineRequireObj().ArrayWithExactContents = function(j$, private$) {
'use strict'; 'use strict';
function ArrayWithExactContents(sample) { function ArrayWithExactContents(sample) {
@@ -12,7 +12,7 @@ getJasmineRequireObj().ArrayWithExactContents = function(j$) {
if (!Array.isArray(this.sample)) { if (!Array.isArray(this.sample)) {
throw new Error( throw new Error(
'You must provide an array to arrayWithExactContents, not ' + 'You must provide an array to arrayWithExactContents, not ' +
j$.private.basicPrettyPrinter(this.sample) + private$.basicPrettyPrinter(this.sample) +
'.' '.'
); );
} }

View File

@@ -1,22 +1,22 @@
getJasmineRequireObj().Empty = function(j$) { getJasmineRequireObj().Empty = function(j$, private$) {
'use strict'; 'use strict';
function Empty() {} function Empty() {}
Empty.prototype.asymmetricMatch = function(other) { Empty.prototype.asymmetricMatch = function(other) {
if ( if (
j$.private.isString(other) || private$.isString(other) ||
Array.isArray(other) || Array.isArray(other) ||
j$.private.isTypedArray(other) private$.isTypedArray(other)
) { ) {
return other.length === 0; return other.length === 0;
} }
if (j$.private.isMap(other) || j$.private.isSet(other)) { if (private$.isMap(other) || private$.isSet(other)) {
return other.size === 0; return other.size === 0;
} }
if (j$.private.isObject(other)) { if (private$.isObject(other)) {
return Object.keys(other).length === 0; return Object.keys(other).length === 0;
} }
return false; return false;

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Falsy = function(j$) { getJasmineRequireObj().Falsy = function(j$, private$) {
'use strict'; 'use strict';
function Falsy() {} function Falsy() {}

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Is = function(j$) { getJasmineRequireObj().Is = function(j$, private$) {
'use strict'; 'use strict';
class Is { class Is {

View File

@@ -1,11 +1,11 @@
getJasmineRequireObj().MapContaining = function(j$) { getJasmineRequireObj().MapContaining = function(j$, private$) {
'use strict'; 'use strict';
function MapContaining(sample) { function MapContaining(sample) {
if (!j$.private.isMap(sample)) { if (!private$.isMap(sample)) {
throw new Error( throw new Error(
'You must provide a map to `mapContaining`, not ' + 'You must provide a map to `mapContaining`, not ' +
j$.private.basicPrettyPrinter(sample) private$.basicPrettyPrinter(sample)
); );
} }
@@ -13,7 +13,7 @@ getJasmineRequireObj().MapContaining = function(j$) {
} }
MapContaining.prototype.asymmetricMatch = function(other, matchersUtil) { MapContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
if (!j$.private.isMap(other)) { if (!private$.isMap(other)) {
return false; return false;
} }

View File

@@ -1,22 +1,22 @@
getJasmineRequireObj().NotEmpty = function(j$) { getJasmineRequireObj().NotEmpty = function(j$, private$) {
'use strict'; 'use strict';
function NotEmpty() {} function NotEmpty() {}
NotEmpty.prototype.asymmetricMatch = function(other) { NotEmpty.prototype.asymmetricMatch = function(other) {
if ( if (
j$.private.isString(other) || private$.isString(other) ||
Array.isArray(other) || Array.isArray(other) ||
j$.private.isTypedArray(other) private$.isTypedArray(other)
) { ) {
return other.length !== 0; return other.length !== 0;
} }
if (j$.private.isMap(other) || j$.private.isSet(other)) { if (private$.isMap(other) || private$.isSet(other)) {
return other.size !== 0; return other.size !== 0;
} }
if (j$.private.isObject(other)) { if (private$.isObject(other)) {
return Object.keys(other).length !== 0; return Object.keys(other).length !== 0;
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().ObjectContaining = function(j$) { getJasmineRequireObj().ObjectContaining = function(j$, private$) {
'use strict'; 'use strict';
function ObjectContaining(sample) { function ObjectContaining(sample) {
@@ -42,7 +42,7 @@ getJasmineRequireObj().ObjectContaining = function(j$) {
}; };
ObjectContaining.prototype.valuesForDiff_ = function(other, pp) { ObjectContaining.prototype.valuesForDiff_ = function(other, pp) {
if (!j$.private.isObject(other)) { if (!private$.isObject(other)) {
return { return {
self: this.jasmineToString(pp), self: this.jasmineToString(pp),
other: other other: other

View File

@@ -1,11 +1,11 @@
getJasmineRequireObj().SetContaining = function(j$) { getJasmineRequireObj().SetContaining = function(j$, private$) {
'use strict'; 'use strict';
function SetContaining(sample) { function SetContaining(sample) {
if (!j$.private.isSet(sample)) { if (!private$.isSet(sample)) {
throw new Error( throw new Error(
'You must provide a set to `setContaining`, not ' + 'You must provide a set to `setContaining`, not ' +
j$.private.basicPrettyPrinter(sample) private$.basicPrettyPrinter(sample)
); );
} }
@@ -13,7 +13,7 @@ getJasmineRequireObj().SetContaining = function(j$) {
} }
SetContaining.prototype.asymmetricMatch = function(other, matchersUtil) { SetContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
if (!j$.private.isSet(other)) { if (!private$.isSet(other)) {
return false; return false;
} }

View File

@@ -1,8 +1,8 @@
getJasmineRequireObj().StringContaining = function(j$) { getJasmineRequireObj().StringContaining = function(j$, private$) {
'use strict'; 'use strict';
function StringContaining(expected) { function StringContaining(expected) {
if (!j$.private.isString(expected)) { if (!private$.isString(expected)) {
throw new Error('Expected is not a String'); throw new Error('Expected is not a String');
} }
@@ -10,7 +10,7 @@ getJasmineRequireObj().StringContaining = function(j$) {
} }
StringContaining.prototype.asymmetricMatch = function(other) { StringContaining.prototype.asymmetricMatch = function(other) {
if (!j$.private.isString(other)) { if (!private$.isString(other)) {
// Arrays, etc. don't match no matter what their indexOf returns. // Arrays, etc. don't match no matter what their indexOf returns.
return false; return false;
} }

View File

@@ -1,8 +1,8 @@
getJasmineRequireObj().StringMatching = function(j$) { getJasmineRequireObj().StringMatching = function(j$, private$) {
'use strict'; 'use strict';
function StringMatching(expected) { function StringMatching(expected) {
if (!j$.private.isString(expected) && !j$.private.isA('RegExp', expected)) { if (!private$.isString(expected) && !private$.isA('RegExp', expected)) {
throw new Error('Expected is not a String or a RegExp'); throw new Error('Expected is not a String or a RegExp');
} }

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().Truthy = function(j$) { getJasmineRequireObj().Truthy = function(j$, private$) {
'use strict'; 'use strict';
function Truthy() {} function Truthy() {}

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().base = function(j$, jasmineGlobal) { getJasmineRequireObj().base = function(j$, private$, jasmineGlobal) {
'use strict'; 'use strict';
/** /**
@@ -43,11 +43,12 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
*/ */
let DEFAULT_TIMEOUT_INTERVAL = 5000; let DEFAULT_TIMEOUT_INTERVAL = 5000;
Object.defineProperty(j$, 'DEFAULT_TIMEOUT_INTERVAL', { Object.defineProperty(j$, 'DEFAULT_TIMEOUT_INTERVAL', {
enumerable: true,
get: function() { get: function() {
return DEFAULT_TIMEOUT_INTERVAL; return DEFAULT_TIMEOUT_INTERVAL;
}, },
set: function(newValue) { set: function(newValue) {
j$.private.util.validateTimeout( private$.util.validateTimeout(
newValue, newValue,
'jasmine.DEFAULT_TIMEOUT_INTERVAL' 'jasmine.DEFAULT_TIMEOUT_INTERVAL'
); );
@@ -70,58 +71,58 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
Object.defineProperty(j$, 'getEnv', { Object.defineProperty(j$, 'getEnv', {
enumerable: true, enumerable: true,
value: function(options) { value: function(options) {
const env = (j$.private.currentEnv_ = const env = (private$.currentEnv_ =
j$.private.currentEnv_ || new j$.private.Env(options)); private$.currentEnv_ || new private$.Env(options));
//jasmine. singletons in here (setTimeout blah blah). //jasmine. singletons in here (setTimeout blah blah).
return env; return env;
} }
}); });
j$.private.isObject = function(value) { private$.isObject = function(value) {
return ( return (
value !== undefined && value !== null && j$.private.isA('Object', value) value !== undefined && value !== null && private$.isA('Object', value)
); );
}; };
j$.private.isString = function(value) { private$.isString = function(value) {
return j$.private.isA('String', value); return private$.isA('String', value);
}; };
j$.private.isNumber = function(value) { private$.isNumber = function(value) {
return j$.private.isA('Number', value); return private$.isA('Number', value);
}; };
j$.private.isFunction = function(value) { private$.isFunction = function(value) {
return j$.private.isA('Function', value); return private$.isA('Function', value);
}; };
j$.private.isAsyncFunction = function(value) { private$.isAsyncFunction = function(value) {
return j$.private.isA('AsyncFunction', value); return private$.isA('AsyncFunction', value);
}; };
j$.private.isGeneratorFunction = function(value) { private$.isGeneratorFunction = function(value) {
return j$.private.isA('GeneratorFunction', value); return private$.isA('GeneratorFunction', value);
}; };
j$.private.isTypedArray = function(value) { private$.isTypedArray = function(value) {
return ( return (
j$.private.isA('Float32Array', value) || private$.isA('Float32Array', value) ||
j$.private.isA('Float64Array', value) || private$.isA('Float64Array', value) ||
j$.private.isA('Int16Array', value) || private$.isA('Int16Array', value) ||
j$.private.isA('Int32Array', value) || private$.isA('Int32Array', value) ||
j$.private.isA('Int8Array', value) || private$.isA('Int8Array', value) ||
j$.private.isA('Uint16Array', value) || private$.isA('Uint16Array', value) ||
j$.private.isA('Uint32Array', value) || private$.isA('Uint32Array', value) ||
j$.private.isA('Uint8Array', value) || private$.isA('Uint8Array', value) ||
j$.private.isA('Uint8ClampedArray', value) private$.isA('Uint8ClampedArray', value)
); );
}; };
j$.private.isA = function(typeName, value) { private$.isA = function(typeName, value) {
return j$.private.getType(value) === '[object ' + typeName + ']'; return private$.getType(value) === '[object ' + typeName + ']';
}; };
j$.private.isError = function(value) { private$.isError = function(value) {
if (!value) { if (!value) {
return false; return false;
} }
@@ -133,15 +134,15 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
return typeof value.stack === 'string' && typeof value.message === 'string'; return typeof value.stack === 'string' && typeof value.message === 'string';
}; };
j$.private.isAsymmetricEqualityTester = function(obj) { private$.isAsymmetricEqualityTester = function(obj) {
return obj ? j$.private.isA('Function', obj.asymmetricMatch) : false; return obj ? private$.isA('Function', obj.asymmetricMatch) : false;
}; };
j$.private.getType = function(value) { private$.getType = function(value) {
return Object.prototype.toString.apply(value); return Object.prototype.toString.apply(value);
}; };
j$.private.isDomNode = function(obj) { private$.isDomNode = function(obj) {
// Node is a function, because constructors // Node is a function, because constructors
return typeof jasmineGlobal.Node !== 'undefined' return typeof jasmineGlobal.Node !== 'undefined'
? obj instanceof jasmineGlobal.Node ? obj instanceof jasmineGlobal.Node
@@ -152,7 +153,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
// return obj.nodeType > 0; // return obj.nodeType > 0;
}; };
j$.private.isMap = function(obj) { private$.isMap = function(obj) {
return ( return (
obj !== null && obj !== null &&
typeof obj !== 'undefined' && typeof obj !== 'undefined' &&
@@ -160,7 +161,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
); );
}; };
j$.private.isSet = function(obj) { private$.isSet = function(obj) {
return ( return (
obj !== null && obj !== null &&
typeof obj !== 'undefined' && typeof obj !== 'undefined' &&
@@ -168,7 +169,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
); );
}; };
j$.private.isWeakMap = function(obj) { private$.isWeakMap = function(obj) {
return ( return (
obj !== null && obj !== null &&
typeof obj !== 'undefined' && typeof obj !== 'undefined' &&
@@ -176,7 +177,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
); );
}; };
j$.private.isURL = function(obj) { private$.isURL = function(obj) {
return ( return (
obj !== null && obj !== null &&
typeof obj !== 'undefined' && typeof obj !== 'undefined' &&
@@ -184,11 +185,11 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
); );
}; };
j$.private.isIterable = function(value) { private$.isIterable = function(value) {
return value && !!value[Symbol.iterator]; return value && !!value[Symbol.iterator];
}; };
j$.private.isDataView = function(obj) { private$.isDataView = function(obj) {
return ( return (
obj !== null && obj !== null &&
typeof obj !== 'undefined' && typeof obj !== 'undefined' &&
@@ -196,15 +197,15 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
); );
}; };
j$.private.isPromise = function(obj) { private$.isPromise = function(obj) {
return !!obj && obj.constructor === jasmineGlobal.Promise; return !!obj && obj.constructor === jasmineGlobal.Promise;
}; };
j$.private.isPromiseLike = function(obj) { private$.isPromiseLike = function(obj) {
return !!obj && j$.private.isFunction(obj.then); return !!obj && private$.isFunction(obj.then);
}; };
j$.private.fnNameFor = function(func) { private$.fnNameFor = function(func) {
if (func.name) { if (func.name) {
return func.name; return func.name;
} }
@@ -216,7 +217,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
return matches ? matches[1] : '<anonymous>'; return matches ? matches[1] : '<anonymous>';
}; };
j$.private.isPending = function(promise) { private$.isPending = function(promise) {
const sentinel = {}; const sentinel = {};
return Promise.race([promise, Promise.resolve(sentinel)]).then( return Promise.race([promise, Promise.resolve(sentinel)]).then(
function(result) { function(result) {
@@ -251,7 +252,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {Constructor} clazz - The constructor to check against. * @param {Constructor} clazz - The constructor to check against.
*/ */
j$.any = function(clazz) { j$.any = function(clazz) {
return new j$.private.Any(clazz); return new private$.Any(clazz);
}; };
/** /**
@@ -263,7 +264,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @function * @function
*/ */
j$.anything = function() { j$.anything = function() {
return new j$.private.Anything(); return new private$.Anything();
}; };
/** /**
@@ -275,7 +276,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @function * @function
*/ */
j$.truthy = function() { j$.truthy = function() {
return new j$.private.Truthy(); return new private$.Truthy();
}; };
/** /**
@@ -288,7 +289,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @function * @function
*/ */
j$.falsy = function() { j$.falsy = function() {
return new j$.private.Falsy(); return new private$.Falsy();
}; };
/** /**
@@ -300,7 +301,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @function * @function
*/ */
j$.empty = function() { j$.empty = function() {
return new j$.private.Empty(); return new private$.Empty();
}; };
/** /**
@@ -312,7 +313,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {Object} sample - The value to compare the actual to. * @param {Object} sample - The value to compare the actual to.
*/ */
j$.is = function(sample) { j$.is = function(sample) {
return new j$.private.Is(sample); return new private$.Is(sample);
}; };
/** /**
@@ -324,7 +325,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @function * @function
*/ */
j$.notEmpty = function() { j$.notEmpty = function() {
return new j$.private.NotEmpty(); return new private$.NotEmpty();
}; };
/** /**
@@ -337,7 +338,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {Object} sample - The subset of properties that _must_ be in the actual. * @param {Object} sample - The subset of properties that _must_ be in the actual.
*/ */
j$.objectContaining = function(sample) { j$.objectContaining = function(sample) {
return new j$.private.ObjectContaining(sample); return new private$.ObjectContaining(sample);
}; };
/** /**
@@ -350,7 +351,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {RegExp|String} expected * @param {RegExp|String} expected
*/ */
j$.stringMatching = function(expected) { j$.stringMatching = function(expected) {
return new j$.private.StringMatching(expected); return new private$.StringMatching(expected);
}; };
/** /**
@@ -363,7 +364,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {String} expected * @param {String} expected
*/ */
j$.stringContaining = function(expected) { j$.stringContaining = function(expected) {
return new j$.private.StringContaining(expected); return new private$.StringContaining(expected);
}; };
/** /**
@@ -376,7 +377,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {Array} sample * @param {Array} sample
*/ */
j$.arrayContaining = function(sample) { j$.arrayContaining = function(sample) {
return new j$.private.ArrayContaining(sample); return new private$.ArrayContaining(sample);
}; };
/** /**
@@ -390,7 +391,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {Array} sample * @param {Array} sample
*/ */
j$.arrayWithExactContents = function(sample) { j$.arrayWithExactContents = function(sample) {
return new j$.private.ArrayWithExactContents(sample); return new private$.ArrayWithExactContents(sample);
}; };
/** /**
@@ -404,7 +405,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {Map} sample - The subset of items that _must_ be in the actual. * @param {Map} sample - The subset of items that _must_ be in the actual.
*/ */
j$.mapContaining = function(sample) { j$.mapContaining = function(sample) {
return new j$.private.MapContaining(sample); return new private$.MapContaining(sample);
}; };
/** /**
@@ -418,7 +419,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
* @param {Set} sample - The subset of items that _must_ be in the actual. * @param {Set} sample - The subset of items that _must_ be in the actual.
*/ */
j$.setContaining = function(sample) { j$.setContaining = function(sample) {
return new j$.private.SetContaining(sample); return new private$.SetContaining(sample);
}; };
/** /**
@@ -434,8 +435,8 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
return false; return false;
} }
return ( return (
putativeSpy.and instanceof j$.private.SpyStrategy && putativeSpy.and instanceof private$.SpyStrategy &&
putativeSpy.calls instanceof j$.private.CallTracker putativeSpy.calls instanceof private$.CallTracker
); );
}; };

View File

@@ -1,9 +1,9 @@
//TODO: expectation result may make more sense as a presentation of an expectation. //TODO: expectation result may make more sense as a presentation of an expectation.
getJasmineRequireObj().buildExpectationResult = function(j$) { getJasmineRequireObj().buildExpectationResult = function(j$, private$) {
'use strict'; 'use strict';
function buildExpectationResult(options) { function buildExpectationResult(options) {
const exceptionFormatter = new j$.private.ExceptionFormatter(); const exceptionFormatter = new private$.ExceptionFormatter();
/** /**
* Describes the result of evaluating an expectation * Describes the result of evaluating an expectation
@@ -33,7 +33,7 @@ getJasmineRequireObj().buildExpectationResult = function(j$) {
} }
if (!result.passed) { if (!result.passed) {
if (options.error && !j$.private.isString(options.error)) { if (options.error && !private$.isString(options.error)) {
if ('code' in options.error) { if ('code' in options.error) {
result.code = options.error.code; result.code = options.error.code;
} }

View File

@@ -1,22 +0,0 @@
getJasmineRequireObj().deprecateMonkeyPatching = function(j$) {
return function deprecateMonkeyPatching(obj, keysToSkip) {
for (const key of Object.keys(obj)) {
if (!keysToSkip?.includes(key)) {
let value = obj[key];
Object.defineProperty(obj, key, {
enumerable: key in obj,
get() {
return value;
},
set(newValue) {
j$.getEnv().deprecated(
'Monkey patching detected. Code that overwrites parts of Jasmine, except globala and other properties that are documented as writeable, is not supported and will break in a future release.'
);
value = newValue;
}
});
}
}
};
};

View File

@@ -1,12 +1,12 @@
getJasmineRequireObj().DiffBuilder = function(j$) { getJasmineRequireObj().DiffBuilder = function(j$, private$) {
'use strict'; 'use strict';
class DiffBuilder { class DiffBuilder {
constructor(config) { constructor(config) {
this.prettyPrinter_ = this.prettyPrinter_ =
(config || {}).prettyPrinter || j$.private.makePrettyPrinter(); (config || {}).prettyPrinter || private$.makePrettyPrinter();
this.mismatches_ = new j$.private.MismatchTree(); this.mismatches_ = new private$.MismatchTree();
this.path_ = new j$.private.ObjectPath(); this.path_ = new private$.ObjectPath();
this.actualRoot_ = undefined; this.actualRoot_ = undefined;
this.expectedRoot_ = undefined; this.expectedRoot_ = undefined;
} }
@@ -67,8 +67,8 @@ getJasmineRequireObj().DiffBuilder = function(j$) {
const handleAsymmetricExpected = () => { const handleAsymmetricExpected = () => {
if ( if (
j$.private.isAsymmetricEqualityTester(expected) && private$.isAsymmetricEqualityTester(expected) &&
j$.private.isFunction(expected.valuesForDiff_) private$.isFunction(expected.valuesForDiff_)
) { ) {
const asymmetricResult = expected.valuesForDiff_( const asymmetricResult = expected.valuesForDiff_(
actual, actual,

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().MismatchTree = function(j$) { getJasmineRequireObj().MismatchTree = function(j$, private$) {
'use strict'; 'use strict';
/* /*
@@ -10,7 +10,7 @@ getJasmineRequireObj().MismatchTree = function(j$) {
*/ */
class MismatchTree { class MismatchTree {
constructor(path) { constructor(path) {
this.path = path || new j$.private.ObjectPath([]); this.path = path || new private$.ObjectPath([]);
this.formatter = undefined; this.formatter = undefined;
this.children = []; this.children = [];
this.isMismatch = false; this.isMismatch = false;

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().NullDiffBuilder = function(j$) { getJasmineRequireObj().NullDiffBuilder = function(j$, private$) {
'use strict'; 'use strict';
return function() { return function() {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().ObjectPath = function(j$) { getJasmineRequireObj().ObjectPath = function(j$, private$) {
'use strict'; 'use strict';
class ObjectPath { class ObjectPath {

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().toBePending = function(j$) { getJasmineRequireObj().toBePending = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -13,7 +13,7 @@ getJasmineRequireObj().toBePending = function(j$) {
return function toBePending() { return function toBePending() {
return { return {
compare: function(actual) { compare: function(actual) {
if (!j$.private.isPromiseLike(actual)) { if (!private$.isPromiseLike(actual)) {
throw new Error( throw new Error(
`Expected toBePending to be called on a promise but was on a ${typeof actual}.` `Expected toBePending to be called on a promise but was on a ${typeof actual}.`
); );

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().toBeRejected = function(j$) { getJasmineRequireObj().toBeRejected = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -15,7 +15,7 @@ getJasmineRequireObj().toBeRejected = function(j$) {
return function toBeRejected() { return function toBeRejected() {
return { return {
compare: function(actual) { compare: function(actual) {
if (!j$.private.isPromiseLike(actual)) { if (!private$.isPromiseLike(actual)) {
throw new Error( throw new Error(
`Expected toBeRejected to be called on a promise but was on a ${typeof actual}.` `Expected toBeRejected to be called on a promise but was on a ${typeof actual}.`
); );

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().toBeRejectedWith = function(j$) { getJasmineRequireObj().toBeRejectedWith = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -16,7 +16,7 @@ getJasmineRequireObj().toBeRejectedWith = function(j$) {
return function toBeRejectedWith(matchersUtil) { return function toBeRejectedWith(matchersUtil) {
return { return {
compare: function(actualPromise, expectedValue) { compare: function(actualPromise, expectedValue) {
if (!j$.private.isPromiseLike(actualPromise)) { if (!private$.isPromiseLike(actualPromise)) {
throw new Error( throw new Error(
`Expected toBeRejectedWith to be called on a promise but was on a ${typeof actualPromise}.` `Expected toBeRejectedWith to be called on a promise but was on a ${typeof actualPromise}.`
); );

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().toBeRejectedWithError = function(j$) { getJasmineRequireObj().toBeRejectedWithError = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -19,7 +19,7 @@ getJasmineRequireObj().toBeRejectedWithError = function(j$) {
return function toBeRejectedWithError(matchersUtil) { return function toBeRejectedWithError(matchersUtil) {
return { return {
compare: function(actualPromise, arg1, arg2) { compare: function(actualPromise, arg1, arg2) {
if (!j$.private.isPromiseLike(actualPromise)) { if (!private$.isPromiseLike(actualPromise)) {
throw new Error( throw new Error(
`Expected toBeRejectedWithError to be called on a promise but was on a ${typeof actualPromise}.` `Expected toBeRejectedWithError to be called on a promise but was on a ${typeof actualPromise}.`
); );
@@ -43,14 +43,14 @@ getJasmineRequireObj().toBeRejectedWithError = function(j$) {
}; };
function matchError(actual, expected, matchersUtil) { function matchError(actual, expected, matchersUtil) {
if (!j$.private.isError(actual)) { if (!private$.isError(actual)) {
return fail(expected, 'rejected with ' + matchersUtil.pp(actual)); return fail(expected, 'rejected with ' + matchersUtil.pp(actual));
} }
if (!(actual instanceof expected.error)) { if (!(actual instanceof expected.error)) {
return fail( return fail(
expected, expected,
'rejected with type ' + j$.private.fnNameFor(actual.constructor) 'rejected with type ' + private$.fnNameFor(actual.constructor)
); );
} }
@@ -110,7 +110,7 @@ getJasmineRequireObj().toBeRejectedWithError = function(j$) {
error: error, error: error,
message: message, message: message,
printValue: printValue:
j$.private.fnNameFor(error) + private$.fnNameFor(error) +
(typeof message === 'undefined' ? '' : ': ' + matchersUtil.pp(message)) (typeof message === 'undefined' ? '' : ': ' + matchersUtil.pp(message))
}; };
} }
@@ -118,7 +118,7 @@ getJasmineRequireObj().toBeRejectedWithError = function(j$) {
function isErrorConstructor(value) { function isErrorConstructor(value) {
return ( return (
typeof value === 'function' && typeof value === 'function' &&
(value === Error || j$.private.isError(value.prototype)) (value === Error || private$.isError(value.prototype))
); );
} }
}; };

View File

@@ -1,4 +1,4 @@
getJasmineRequireObj().toBeResolved = function(j$) { getJasmineRequireObj().toBeResolved = function(j$, private$) {
'use strict'; 'use strict';
/** /**
@@ -15,7 +15,7 @@ getJasmineRequireObj().toBeResolved = function(j$) {
return function toBeResolved(matchersUtil) { return function toBeResolved(matchersUtil) {
return { return {
compare: function(actual) { compare: function(actual) {
if (!j$.private.isPromiseLike(actual)) { if (!private$.isPromiseLike(actual)) {
throw new Error( throw new Error(
`Expected toBeResolved to be called on a promise but was on a ${typeof actual}.` `Expected toBeResolved to be called on a promise but was on a ${typeof actual}.`
); );

Some files were not shown because too many files have changed in this diff Show More