Compare commits
25 Commits
v6.0.1
...
v7.0.0-pre
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9023b1fde | ||
|
|
27319fd6ae | ||
|
|
3de4512681 | ||
|
|
d230b0500d | ||
|
|
c6520763d8 | ||
|
|
e087ebc419 | ||
|
|
4bf333ed38 | ||
|
|
4f5ef7c2d7 | ||
|
|
63ac7da082 | ||
|
|
281c0d1ee8 | ||
|
|
8bb325628f | ||
|
|
ff0699035f | ||
|
|
f12f4395f0 | ||
|
|
5de03beea1 | ||
|
|
42baa422b3 | ||
|
|
6af5d24b3b | ||
|
|
b88ce2d49f | ||
|
|
c216ae1d13 | ||
|
|
319776d241 | ||
|
|
1d0718dc2f | ||
|
|
929694310e | ||
|
|
4db18aafce | ||
|
|
03006080d4 | ||
|
|
876de65803 | ||
|
|
8b3c4ce3b4 |
10
.github/CONTRIBUTING.md
vendored
10
.github/CONTRIBUTING.md
vendored
@@ -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.
|
||||
|
||||
### `boot0.js` and `boot1.js`
|
||||
### `boot.js`
|
||||
|
||||
These files file does all of the setup necessary for Jasmine to work in a
|
||||
browser. They load all of the code, create an `Env`, attach the global
|
||||
functions, and build the reporter. It also sets up the execution of the
|
||||
`Env` - for browsers this is in `window.onload`. While the default in `lib`
|
||||
is appropriate for browsers, projects may wish to customize this file.
|
||||
This file does all the setup necessary for Jasmine to work in a browser. While
|
||||
the default in `lib`is appropriate for most uses, users may wish to customize
|
||||
this file.
|
||||
|
||||
### Compatibility
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ Microsoft Edge) as well as Node.
|
||||
| Environment | Supported versions |
|
||||
|-------------------|----------------------------------|
|
||||
| Node | 20, 22, 24 |
|
||||
| Safari | 16*, 17*, 26* |
|
||||
| Safari | 26* |
|
||||
| Chrome | Evergreen |
|
||||
| Firefox | Evergreen, 102*, 115*, 128*, 140 |
|
||||
| Edge | Evergreen |
|
||||
|
||||
@@ -24,70 +24,26 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Note: Only available on Node.
|
||||
* @module jasmine-core
|
||||
*/
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const {
|
||||
globals,
|
||||
installGlobals,
|
||||
version,
|
||||
private$
|
||||
} = require('./jasmine-core/jasmine.js');
|
||||
|
||||
const jasmineRequire = require('./jasmine-core/jasmine.js');
|
||||
module.exports = jasmineRequire;
|
||||
|
||||
const bootWithoutGlobals = (function() {
|
||||
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');
|
||||
function reset() {
|
||||
private$.currentEnv_ = null;
|
||||
const env = jasmine.getEnv({ suppressLoadErrors: true });
|
||||
rebindInterface(env);
|
||||
}
|
||||
|
||||
const rootPath = path.join(__dirname, 'jasmine-core'),
|
||||
bootFiles = ['boot0.js', 'boot1.js'],
|
||||
legacyBootFiles = ['boot.js'],
|
||||
bootFiles = ['boot.js'],
|
||||
cssFiles = [],
|
||||
jsFiles = [],
|
||||
jsFilesToSkip = ['jasmine.js'].concat(bootFiles, legacyBootFiles);
|
||||
jsFilesToSkip = ['jasmine.js'].concat(bootFiles);
|
||||
|
||||
fs.readdirSync(rootPath).forEach(function(file) {
|
||||
if (fs.statSync(path.join(rootPath, file)).isFile()) {
|
||||
@@ -104,12 +60,40 @@ fs.readdirSync(rootPath).forEach(function(file) {
|
||||
}
|
||||
});
|
||||
|
||||
module.exports.files = {
|
||||
self: __filename,
|
||||
path: rootPath,
|
||||
bootDir: rootPath,
|
||||
bootFiles: bootFiles,
|
||||
cssFiles: cssFiles,
|
||||
jsFiles: ['jasmine.js'].concat(jsFiles),
|
||||
imagesDir: path.join(__dirname, '../images')
|
||||
/**
|
||||
* Note: Only available on Node.
|
||||
*
|
||||
* In addition to the members documented here, this module's exports include all
|
||||
* {@link globals}.
|
||||
* @module jasmine-core
|
||||
*/
|
||||
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')
|
||||
}
|
||||
};
|
||||
|
||||
@@ -24,19 +24,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
'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() {
|
||||
const env = jasmine.getEnv();
|
||||
const urls = new jasmine.HtmlReporterV2Urls();
|
||||
@@ -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];
|
||||
}
|
||||
})();
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line no-var
|
||||
var jasmineRequire = window.jasmineRequire || require('./jasmine.js');
|
||||
|
||||
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$) {
|
||||
(function() {
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const getJasmineHtmlRequireObj = (function() {
|
||||
'use strict';
|
||||
const htmlRequire = {};
|
||||
|
||||
const { createDom, noExpectations } = j$.private.htmlReporterUtils;
|
||||
|
||||
/**
|
||||
* @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
|
||||
);
|
||||
}
|
||||
function getJasmineHtmlRequire() {
|
||||
return htmlRequire;
|
||||
}
|
||||
|
||||
class UrlBuilder {
|
||||
#addToExistingQueryString;
|
||||
|
||||
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)
|
||||
);
|
||||
};
|
||||
htmlRequire.html = function(j$, private$) {
|
||||
if (!private$) {
|
||||
private$ = {};
|
||||
}
|
||||
|
||||
suiteHref(suite) {
|
||||
const els = [];
|
||||
|
||||
while (suite && suite.parent) {
|
||||
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$.ResultsNode = htmlRequire.ResultsNode();
|
||||
private$.ResultsStateBuilder = htmlRequire.ResultsStateBuilder(
|
||||
j$,
|
||||
private$
|
||||
);
|
||||
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 =
|
||||
options &&
|
||||
options.filterString &&
|
||||
options.filterString() &&
|
||||
options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
|
||||
const filterPattern = new RegExp(filterString);
|
||||
for (const k of ['HtmlReporterV2Urls', 'HtmlReporterV2', 'QueryString']) {
|
||||
Object.defineProperty(j$, k, {
|
||||
enumerable: true,
|
||||
configurable: false,
|
||||
writable: false,
|
||||
value: htmlRequire[k](j$, private$)
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 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 getJasmineHtmlRequire;
|
||||
})();
|
||||
|
||||
return HtmlSpecFilter;
|
||||
};
|
||||
|
||||
jasmineRequire.ResultsNode = function() {
|
||||
getJasmineHtmlRequireObj().ResultsNode = function() {
|
||||
'use strict';
|
||||
|
||||
function ResultsNode(result, type, parent) {
|
||||
@@ -362,7 +91,7 @@ jasmineRequire.ResultsNode = function() {
|
||||
return ResultsNode;
|
||||
};
|
||||
|
||||
jasmineRequire.QueryString = function() {
|
||||
getJasmineHtmlRequireObj().QueryString = function() {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@@ -378,6 +107,7 @@ jasmineRequire.QueryString = function() {
|
||||
*/
|
||||
constructor(options) {
|
||||
this.#getWindowLocation = options.getWindowLocation;
|
||||
Object.freeze(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -445,13 +175,14 @@ jasmineRequire.QueryString = function() {
|
||||
return '?' + qStrPairs.join('&');
|
||||
}
|
||||
|
||||
Object.freeze(QueryString.prototype);
|
||||
return QueryString;
|
||||
};
|
||||
|
||||
jasmineRequire.AlertsView = function(j$) {
|
||||
getJasmineHtmlRequireObj().AlertsView = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const { createDom } = j$.private.htmlReporterUtils;
|
||||
const { createDom } = private$.htmlReporterUtils;
|
||||
const errorBarClassName = 'jasmine-bar jasmine-errored';
|
||||
const afterAllMessagePrefix = 'AfterAll ';
|
||||
|
||||
@@ -567,10 +298,10 @@ jasmineRequire.AlertsView = function(j$) {
|
||||
return AlertsView;
|
||||
};
|
||||
|
||||
jasmineRequire.Banner = function(j$) {
|
||||
getJasmineHtmlRequireObj().Banner = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const { createDom } = j$.private.htmlReporterUtils;
|
||||
const { createDom } = private$.htmlReporterUtils;
|
||||
|
||||
class Banner {
|
||||
#navigateWithNewParam;
|
||||
@@ -729,10 +460,10 @@ jasmineRequire.Banner = function(j$) {
|
||||
return Banner;
|
||||
};
|
||||
|
||||
jasmineRequire.FailuresView = function(j$) {
|
||||
getJasmineHtmlRequireObj().FailuresView = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const { createDom } = j$.private.htmlReporterUtils;
|
||||
const { createDom } = private$.htmlReporterUtils;
|
||||
|
||||
class FailuresView {
|
||||
#urlBuilder;
|
||||
@@ -896,7 +627,7 @@ jasmineRequire.FailuresView = function(j$) {
|
||||
return FailuresView;
|
||||
};
|
||||
|
||||
jasmineRequire.htmlReporterUtils = function(j$) {
|
||||
getJasmineHtmlRequireObj().htmlReporterUtils = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function createDom(type, attrs, childrenArrayOrVarArgs) {
|
||||
@@ -949,10 +680,10 @@ jasmineRequire.htmlReporterUtils = function(j$) {
|
||||
return { createDom, noExpectations };
|
||||
};
|
||||
|
||||
jasmineRequire.HtmlReporterV2 = function(j$) {
|
||||
getJasmineHtmlRequireObj().HtmlReporterV2 = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const { createDom, noExpectations } = j$.private.htmlReporterUtils;
|
||||
const { createDom, noExpectations } = private$.htmlReporterUtils;
|
||||
|
||||
const specListTabId = 'jasmine-specListTab';
|
||||
const failuresTabId = 'jasmine-failuresTab';
|
||||
@@ -1008,14 +739,14 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
|
||||
|
||||
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.#statusBar = new j$.private.OverallStatusBar(this.#urlBuilder);
|
||||
this.#alerts = new private$.AlertsView(this.#urlBuilder);
|
||||
this.#statusBar = new private$.OverallStatusBar(this.#urlBuilder);
|
||||
this.#statusBar.showRunning();
|
||||
this.#alerts.addBar(this.#statusBar.rootEl);
|
||||
|
||||
this.#tabBar = new j$.private.TabBar(
|
||||
this.#tabBar = new private$.TabBar(
|
||||
[
|
||||
{ id: specListTabId, label: 'Spec List' },
|
||||
{ id: failuresTabId, label: 'Failures' },
|
||||
@@ -1034,11 +765,11 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
|
||||
this.#alerts.addBar(this.#tabBar.rootEl);
|
||||
|
||||
this.#progress = new ProgressView();
|
||||
this.#banner = new j$.private.Banner(
|
||||
this.#banner = new private$.Banner(
|
||||
this.#queryString.navigateWithNewParam.bind(this.#queryString),
|
||||
true
|
||||
);
|
||||
this.#failures = new j$.private.FailuresView(this.#urlBuilder);
|
||||
this.#failures = new private$.FailuresView(this.#urlBuilder);
|
||||
this.#htmlReporterMain = createDom(
|
||||
'div',
|
||||
{ className: 'jasmine_html-reporter' },
|
||||
@@ -1049,6 +780,8 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
|
||||
);
|
||||
this.#container.appendChild(this.#htmlReporterMain);
|
||||
this.#failures.show();
|
||||
|
||||
Object.freeze(this);
|
||||
}
|
||||
|
||||
jasmineStarted(options) {
|
||||
@@ -1119,13 +852,13 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
|
||||
}
|
||||
|
||||
const results = this.#find('.jasmine-results');
|
||||
const summary = new j$.private.SummaryTreeView(
|
||||
const summary = new private$.SummaryTreeView(
|
||||
this.#urlBuilder,
|
||||
this.#filterSpecs
|
||||
);
|
||||
summary.addResults(this.#stateBuilder.topResults);
|
||||
results.appendChild(summary.rootEl);
|
||||
const perf = new j$.private.PerformanceView();
|
||||
const perf = new private$.PerformanceView();
|
||||
perf.addResults(this.#stateBuilder.topResults);
|
||||
results.appendChild(perf.rootEl);
|
||||
this.#tabBar.showTab(specListTabId);
|
||||
@@ -1226,10 +959,11 @@ jasmineRequire.HtmlReporterV2 = function(j$) {
|
||||
}
|
||||
}
|
||||
|
||||
Object.freeze(HtmlReporterV2.prototype);
|
||||
return HtmlReporterV2;
|
||||
};
|
||||
|
||||
jasmineRequire.HtmlReporterV2Urls = function(j$) {
|
||||
getJasmineHtmlRequireObj().HtmlReporterV2Urls = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
// TODO unify with V2 UrlBuilder?
|
||||
@@ -1249,6 +983,8 @@ jasmineRequire.HtmlReporterV2Urls = function(j$) {
|
||||
return window.location;
|
||||
}
|
||||
});
|
||||
|
||||
Object.freeze(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1280,7 +1016,7 @@ jasmineRequire.HtmlReporterV2Urls = function(j$) {
|
||||
config.seed = seed;
|
||||
}
|
||||
|
||||
const specFilter = new j$.private.HtmlSpecFilterV2({
|
||||
const specFilter = new private$.HtmlSpecFilterV2({
|
||||
filterParams: () => ({
|
||||
path: this.queryString.getParam('path'),
|
||||
spec: this.queryString.getParam('spec')
|
||||
@@ -1299,10 +1035,11 @@ jasmineRequire.HtmlReporterV2Urls = function(j$) {
|
||||
}
|
||||
}
|
||||
|
||||
Object.freeze(HtmlReporterV2Urls.prototype);
|
||||
return HtmlReporterV2Urls;
|
||||
};
|
||||
|
||||
jasmineRequire.HtmlSpecFilterV2 = function() {
|
||||
getJasmineHtmlRequireObj().HtmlSpecFilterV2 = function() {
|
||||
class HtmlSpecFilterV2 {
|
||||
#getFilterParams;
|
||||
|
||||
@@ -1344,10 +1081,10 @@ jasmineRequire.HtmlSpecFilterV2 = function() {
|
||||
return HtmlSpecFilterV2;
|
||||
};
|
||||
|
||||
jasmineRequire.OverallStatusBar = function(j$) {
|
||||
getJasmineHtmlRequireObj().OverallStatusBar = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const { createDom } = j$.private.htmlReporterUtils;
|
||||
const { createDom } = private$.htmlReporterUtils;
|
||||
const staticClassNames = 'jasmine-overall-result jasmine-bar';
|
||||
|
||||
class OverallStatusBar {
|
||||
@@ -1453,8 +1190,8 @@ jasmineRequire.OverallStatusBar = function(j$) {
|
||||
return OverallStatusBar;
|
||||
};
|
||||
|
||||
jasmineRequire.PerformanceView = function(j$) {
|
||||
const createDom = j$.private.htmlReporterUtils.createDom;
|
||||
getJasmineHtmlRequireObj().PerformanceView = function(j$, private$) {
|
||||
const createDom = private$.htmlReporterUtils.createDom;
|
||||
const MAX_SLOW_SPECS = 20;
|
||||
|
||||
class PerformanceView {
|
||||
@@ -1552,12 +1289,12 @@ jasmineRequire.PerformanceView = function(j$) {
|
||||
return PerformanceView;
|
||||
};
|
||||
|
||||
jasmineRequire.ResultsStateBuilder = function(j$) {
|
||||
getJasmineHtmlRequireObj().ResultsStateBuilder = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class ResultsStateBuilder {
|
||||
constructor() {
|
||||
this.topResults = new j$.private.ResultsNode({}, '', null);
|
||||
this.topResults = new private$.ResultsNode({}, '', null);
|
||||
this.currentParent = this.topResults;
|
||||
this.suitesById = {};
|
||||
this.totalSpecsDefined = 0;
|
||||
@@ -1635,10 +1372,10 @@ jasmineRequire.ResultsStateBuilder = function(j$) {
|
||||
return ResultsStateBuilder;
|
||||
};
|
||||
|
||||
jasmineRequire.SummaryTreeView = function(j$) {
|
||||
getJasmineHtmlRequireObj().SummaryTreeView = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const { createDom, noExpectations } = j$.private.htmlReporterUtils;
|
||||
const { createDom, noExpectations } = private$.htmlReporterUtils;
|
||||
|
||||
class SummaryTreeView {
|
||||
#urlBuilder;
|
||||
@@ -1744,48 +1481,8 @@ jasmineRequire.SummaryTreeView = function(j$) {
|
||||
return SummaryTreeView;
|
||||
};
|
||||
|
||||
jasmineRequire.SymbolsView = function(j$) {
|
||||
'use strict';
|
||||
|
||||
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;
|
||||
getJasmineHtmlRequireObj().TabBar = function(j$, private$) {
|
||||
const createDom = private$.htmlReporterUtils.createDom;
|
||||
|
||||
class TabBar {
|
||||
#tabs;
|
||||
@@ -1861,3 +1558,10 @@ jasmineRequire.TabBar = function(j$) {
|
||||
|
||||
return TabBar;
|
||||
};
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
getJasmineHtmlRequireObj().html(jasmine);
|
||||
})();
|
||||
|
||||
})()
|
||||
@@ -24,7 +24,6 @@ body {
|
||||
line-height: 14px;
|
||||
}
|
||||
.jasmine_html-reporter .jasmine-banner,
|
||||
.jasmine_html-reporter .jasmine-symbol-summary,
|
||||
.jasmine_html-reporter .jasmine-summary,
|
||||
.jasmine_html-reporter .jasmine-result-message,
|
||||
.jasmine_html-reporter .jasmine-spec .jasmine-description,
|
||||
@@ -65,57 +64,6 @@ body {
|
||||
padding-right: 9px;
|
||||
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 {
|
||||
width: 100%;
|
||||
}
|
||||
@@ -197,12 +145,10 @@ body {
|
||||
.jasmine_html-reporter .jasmine-bar a {
|
||||
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-performance-view {
|
||||
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-performance-view {
|
||||
display: none;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "jasmine-core",
|
||||
"license": "MIT",
|
||||
"version": "6.0.1",
|
||||
"version": "7.0.0-pre.0",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jasmine/jasmine.git"
|
||||
@@ -28,6 +28,9 @@
|
||||
"description": "Simple JavaScript testing framework for browsers and node.js",
|
||||
"homepage": "https://jasmine.github.io",
|
||||
"main": "./lib/jasmine-core.js",
|
||||
"exports": {
|
||||
".": "./lib/jasmine-core.js"
|
||||
},
|
||||
"files": [
|
||||
"LICENSE",
|
||||
"README.md",
|
||||
@@ -45,8 +48,8 @@
|
||||
"eslint-plugin-compat": "^6.0.2",
|
||||
"glob": "^13.0.0",
|
||||
"globals": "^16.0.0",
|
||||
"jasmine": "github:jasmine/jasmine-npm",
|
||||
"jasmine-browser-runner": "github:jasmine/jasmine-browser-runner",
|
||||
"jasmine": "github:jasmine/jasmine-npm#7.0",
|
||||
"jasmine-browser-runner": "github:jasmine/jasmine-browser-runner#5.0",
|
||||
"jsdom": "^26.0.0",
|
||||
"prettier": "1.17.1",
|
||||
"sass": "^1.58.3"
|
||||
|
||||
40
release_notes/6.1.0.md
Normal file
40
release_notes/6.1.0.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# Jasmine Core 6.1.0 Release Notes
|
||||
|
||||
## Changes to supported environments
|
||||
|
||||
* Safari 16 and 17 are no longer supported. Although jasmine-core may still work
|
||||
in those versions, we no longer have a reliable way to test them and won't try
|
||||
to maintain compatibility with them in future releases.
|
||||
|
||||
## New features
|
||||
|
||||
* Report the underlying errors that make up an `AggregateError`.
|
||||
* Merges [#2093](https://github.com/jasmine/jasmine/pull/2093) from @puglyfe
|
||||
* Fixes [#2063](https://github.com/jasmine/jasmine/issues/2063)
|
||||
|
||||
## Documentation improvements
|
||||
|
||||
* Fix default MAX_PRETTY_PRINT_CHARS in JsDoc.
|
||||
* Merges [#2091](https://github.com/jasmine/jasmine/pull/2091) from @HolgerJeromin
|
||||
|
||||
## 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)_
|
||||
58
release_notes/7.0.0-pre.0.md
Normal file
58
release_notes/7.0.0-pre.0.md
Normal 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)_
|
||||
@@ -42,8 +42,7 @@ async function zipStandaloneDist(jasmineVersion) {
|
||||
'lib/jasmine-core/jasmine.js',
|
||||
'lib/jasmine-core/jasmine-html.js',
|
||||
'lib/jasmine-core/jasmine.css',
|
||||
'lib/jasmine-core/boot0.js',
|
||||
'lib/jasmine-core/boot1.js',
|
||||
'lib/jasmine-core/boot.js',
|
||||
],
|
||||
destDir: 'lib/jasmine-' + jasmineVersion
|
||||
},
|
||||
|
||||
@@ -34,18 +34,20 @@ function concatFiles() {
|
||||
const configs = [
|
||||
{
|
||||
src: [
|
||||
{ literal: '(function() {' },
|
||||
'src/html/requireHtml.js',
|
||||
'src/html/HtmlReporter.js',
|
||||
'src/html/HtmlSpecFilter.js',
|
||||
'src/html/ResultsNode.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.js',
|
||||
src: [
|
||||
{ literal: '(function() {' },
|
||||
'src/core/requireCore.js',
|
||||
'src/core/matchers/requireMatchers.js',
|
||||
'src/core/base.js',
|
||||
@@ -53,23 +55,20 @@ function concatFiles() {
|
||||
'src/core/Spec.js',
|
||||
'src/core/Order.js',
|
||||
'src/core/Env.js',
|
||||
'src/core/JsApiReporter.js',
|
||||
'src/core/PrettyPrinter',
|
||||
'src/core/Suite',
|
||||
'src/core/**/*.js',
|
||||
{ glob: 'src/core/**/*.js', exclude: 'src/core/requireSuffix.js'},
|
||||
{
|
||||
template: 'src/version.js',
|
||||
data: {version: pkg.version}
|
||||
},
|
||||
'src/core/requireSuffix.js',
|
||||
{ literal: '})()' },
|
||||
],
|
||||
},
|
||||
{
|
||||
dest: 'lib/jasmine-core/boot0.js',
|
||||
src: ['src/boot/boot0.js'],
|
||||
},
|
||||
{
|
||||
dest: 'lib/jasmine-core/boot1.js',
|
||||
src: ['src/boot/boot1.js'],
|
||||
dest: 'lib/jasmine-core/boot.js',
|
||||
src: ['src/boot/boot.js'],
|
||||
},
|
||||
{
|
||||
dest: 'lib/jasmine-core.js',
|
||||
@@ -85,25 +84,28 @@ function concatFiles() {
|
||||
src.unshift(licenseBanner);
|
||||
|
||||
function expand(srcListEntry) {
|
||||
if (typeof srcListEntry === 'object') {
|
||||
if (typeof srcListEntry === 'object' && !srcListEntry.glob) {
|
||||
return srcListEntry;
|
||||
}
|
||||
|
||||
return glob.sync(srcListEntry)
|
||||
.sort(function (a, b) {
|
||||
// Match the sort order of previous build tools, so that the
|
||||
// output is the same.
|
||||
a = a.toLowerCase();
|
||||
b = b.toLowerCase();
|
||||
const matches = glob.sync(
|
||||
srcListEntry.glob ?? srcListEntry,
|
||||
{ignore: srcListEntry.exclude}
|
||||
);
|
||||
return matches.sort(function (a, b) {
|
||||
// Match the sort order of previous build tools, so that the
|
||||
// output is the same.
|
||||
a = a.toLowerCase();
|
||||
b = b.toLowerCase();
|
||||
|
||||
if (a < b) {
|
||||
return -1;
|
||||
} else if (a === b) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
if (a < b) {
|
||||
return -1;
|
||||
} else if (a === b) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const srcs = src.flatMap(expand);
|
||||
@@ -117,6 +119,8 @@ function concatFiles() {
|
||||
if (s.template) {
|
||||
const template = fs.readFileSync(s.template, {encoding: 'utf8'});
|
||||
content = ejs.render(template, s.data);
|
||||
} else if (s.literal) {
|
||||
content = s.literal;
|
||||
} else {
|
||||
content = fs.readFileSync(s, {encoding: 'utf8'});
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Run tests in supported browsers that are available on Saucelabs.
|
||||
# Note: The latest Safari version is tested via GitHub Actions because Saucelabs
|
||||
# only makes it available to paid enterprise accounts. See
|
||||
# Note: Safari is tested via GitHub Actions because Saucelabs only makes Safari
|
||||
# 18 and later available to paid enterprise accounts. See
|
||||
# .github/workflows/safari.yml.
|
||||
|
||||
run_browser() {
|
||||
@@ -44,9 +44,6 @@ else
|
||||
fi
|
||||
run_browser firefox 102
|
||||
|
||||
run_browser safari 17
|
||||
run_browser safari 16
|
||||
|
||||
run_browser MicrosoftEdge latest
|
||||
|
||||
echo
|
||||
|
||||
@@ -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 jasmineCore = require('../lib/jasmine-core.js');
|
||||
const runner = new Jasmine({jasmineCore: jasmineCore});
|
||||
const runner = new Jasmine({jasmineCore});
|
||||
|
||||
runner.loadConfigFile('./spec/support/jasmine.json');
|
||||
runner.exitOnCompletion = false;
|
||||
|
||||
@@ -1248,24 +1248,7 @@ describe('Clock (acceptance)', function() {
|
||||
clock.tick(400);
|
||||
});
|
||||
|
||||
describe('Warning about monkey patching', function() {
|
||||
for (const name of ['tick', 'mockDate', 'install', 'uninstall']) {
|
||||
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);
|
||||
});
|
||||
}
|
||||
isNonMonkeyPatchableClass(privateUnderTest.Clock, function() {
|
||||
return new privateUnderTest.Clock({}, function() {}, {});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -875,43 +875,7 @@ describe('Env', function() {
|
||||
});
|
||||
});
|
||||
|
||||
describe('Warning about monkey patching', function() {
|
||||
afterEach(function() {
|
||||
// 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);
|
||||
});
|
||||
}
|
||||
isNonMonkeyPatchableClass(privateUnderTest.Env, function() {
|
||||
return new privateUnderTest.Env();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -173,10 +173,13 @@ describe('ExceptionFormatter', 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 subject = new privateUnderTest.ExceptionFormatter({
|
||||
jasmineFile: jasmine.private.util.jasmineFile()
|
||||
});
|
||||
const subject = new privateUnderTest.ExceptionFormatter({ jasmineFile });
|
||||
const result = subject.stack(error);
|
||||
jasmine.debugLog('Original stack trace: ' + error.stack);
|
||||
jasmine.debugLog('Filtered stack trace: ' + result);
|
||||
@@ -196,15 +199,18 @@ describe('ExceptionFormatter', 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 error = new Error(msg);
|
||||
|
||||
if (error.stack.indexOf(msg) === -1) {
|
||||
pending("Stack traces don't have messages in this environment");
|
||||
}
|
||||
const subject = new privateUnderTest.ExceptionFormatter({
|
||||
jasmineFile: jasmine.private.util.jasmineFile()
|
||||
});
|
||||
const subject = new privateUnderTest.ExceptionFormatter({ jasmineFile });
|
||||
const result = subject.stack(error);
|
||||
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() {
|
||||
const error = new Error('an error');
|
||||
const subject = new privateUnderTest.ExceptionFormatter({
|
||||
jasmineFile: jasmine.private.util.jasmineFile()
|
||||
jasmineFile: "doesn't matter"
|
||||
});
|
||||
const result = subject.stack(error, { omitMessage: true });
|
||||
expect(result).not.toContain('an error');
|
||||
@@ -346,5 +352,184 @@ describe('ExceptionFormatter', function() {
|
||||
}).not.toThrowError();
|
||||
});
|
||||
});
|
||||
|
||||
describe('when the error has an errors array (AggregateError)', function() {
|
||||
it('includes all aggregated errors in the stack trace', function() {
|
||||
const subject = new privateUnderTest.ExceptionFormatter();
|
||||
const error1 = (function fn1() {
|
||||
return new Error('first error');
|
||||
})();
|
||||
const error2 = (function fn2() {
|
||||
return new Error('second error');
|
||||
})();
|
||||
const aggregateError = (function fn3() {
|
||||
return new Error('Multiple errors occurred');
|
||||
})();
|
||||
aggregateError.errors = [error1, error2];
|
||||
|
||||
const lines = subject.stack(aggregateError).split('\n');
|
||||
|
||||
// TODO: be consistent across environments about whether the message is
|
||||
// included in the stack trace
|
||||
if (lines[0] === 'Error: Multiple errors occurred') {
|
||||
lines.shift();
|
||||
}
|
||||
|
||||
// Exclude lines that vary from environment to environment
|
||||
const filteredLines = lines.filter(
|
||||
x =>
|
||||
!x.includes('/jasmine.js:') &&
|
||||
// Some Node 20 and 22 minors when running in parallel
|
||||
!x.includes('process.processTicksAndRejections')
|
||||
);
|
||||
|
||||
for (let i = 0; i < filteredLines.length; i++) {
|
||||
jasmine.debugLog(`Line ${i} after filtering: ${filteredLines[i]}`);
|
||||
}
|
||||
|
||||
// Inexact matching because stack frame formatting varies from runtime
|
||||
// to runtime
|
||||
const expectedPatterns = [
|
||||
// Overall error
|
||||
/fn3.*ExceptionFormatterSpec\.js/,
|
||||
/ExceptionFormatterSpec\.js/,
|
||||
/^$/,
|
||||
|
||||
// First nested error
|
||||
/^ Error 1: Error: first error$/,
|
||||
/^ .*fn1.*ExceptionFormatterSpec\.js/,
|
||||
/^ .*ExceptionFormatterSpec\.js/,
|
||||
/^$/,
|
||||
|
||||
// Second nested error
|
||||
/^ .*Error 2: Error: second error$/,
|
||||
/^ .*fn2.*ExceptionFormatterSpec\.js/,
|
||||
/^ .*ExceptionFormatterSpec\.js/
|
||||
];
|
||||
|
||||
expect(filteredLines).toEqual(
|
||||
expectedPatterns.map(p => jasmine.stringMatching(p))
|
||||
);
|
||||
});
|
||||
|
||||
it('handles empty errors array', function() {
|
||||
const subject = new privateUnderTest.ExceptionFormatter();
|
||||
const aggregateError = new Error('No errors');
|
||||
aggregateError.errors = [];
|
||||
|
||||
expect(function() {
|
||||
subject.stack(aggregateError);
|
||||
}).not.toThrowError();
|
||||
});
|
||||
|
||||
it('handles nested AggregateError', function() {
|
||||
const subject = new privateUnderTest.ExceptionFormatter();
|
||||
const innerError1 = new Error('inner error 1');
|
||||
const innerError2 = new Error('inner error 2');
|
||||
const innerAggregate = new Error('Inner aggregate');
|
||||
innerAggregate.errors = [innerError1, innerError2];
|
||||
|
||||
const outerError = new Error('outer error');
|
||||
const outerAggregate = new Error('Outer aggregate');
|
||||
outerAggregate.errors = [innerAggregate, outerError];
|
||||
|
||||
const lines = subject.stack(outerAggregate).split('\n');
|
||||
|
||||
const innerAggMsgIx = lines.findIndex(line =>
|
||||
line.includes('Error 1: Error: Inner aggregate')
|
||||
);
|
||||
expect(innerAggMsgIx).toBeGreaterThan(-1);
|
||||
|
||||
const innerError1MsgIx = lines.findIndex(line =>
|
||||
line.includes('Error 1: Error: inner error 1')
|
||||
);
|
||||
expect(innerError1MsgIx).toBeGreaterThan(innerAggMsgIx);
|
||||
|
||||
const innerError2MsgIx = lines.findIndex(line =>
|
||||
line.includes('Error 2: Error: inner error 2')
|
||||
);
|
||||
expect(innerError2MsgIx).toBeGreaterThan(innerError1MsgIx);
|
||||
|
||||
const outerErrorMsgIx = lines.findIndex(line =>
|
||||
line.includes('Error 2: Error: outer error')
|
||||
);
|
||||
expect(outerErrorMsgIx).toBeGreaterThan(innerError2MsgIx);
|
||||
});
|
||||
|
||||
it('handles AggregateError containing error with cause', function() {
|
||||
const subject = new privateUnderTest.ExceptionFormatter();
|
||||
const rootCause = new Error('root cause');
|
||||
const errorWithCause = new Error('error with cause', {
|
||||
cause: rootCause
|
||||
});
|
||||
const aggregateError = new Error('Aggregate with cause chain');
|
||||
aggregateError.errors = [errorWithCause];
|
||||
|
||||
const lines = subject.stack(aggregateError).split('\n');
|
||||
|
||||
const error1MsgIx = lines.findIndex(line =>
|
||||
line.includes('Error 1: Error: error with cause')
|
||||
);
|
||||
expect(error1MsgIx).toBeGreaterThan(-1);
|
||||
|
||||
const causeMsgIx = lines.findIndex(line =>
|
||||
line.includes('Caused by: Error: root cause')
|
||||
);
|
||||
expect(causeMsgIx).toBeGreaterThan(error1MsgIx);
|
||||
});
|
||||
|
||||
it('skips non-Error items in errors array', function() {
|
||||
const subject = new privateUnderTest.ExceptionFormatter();
|
||||
const error1 = new Error('real error');
|
||||
const aggregateError = new Error('Mixed array');
|
||||
aggregateError.errors = [
|
||||
error1,
|
||||
'string error',
|
||||
{ message: 'object error' },
|
||||
null,
|
||||
undefined,
|
||||
42
|
||||
];
|
||||
|
||||
const lines = subject.stack(aggregateError).split('\n');
|
||||
|
||||
const error1MsgIx = lines.findIndex(line =>
|
||||
line.includes('Error 1: Error: real error')
|
||||
);
|
||||
expect(error1MsgIx).toBeGreaterThan(-1);
|
||||
|
||||
const hasStringError = lines.some(line =>
|
||||
line.includes('string error')
|
||||
);
|
||||
expect(hasStringError).toBe(false);
|
||||
|
||||
const hasObjectError = lines.some(line =>
|
||||
line.includes('object error')
|
||||
);
|
||||
expect(hasObjectError).toBe(false);
|
||||
});
|
||||
|
||||
it('works with native AggregateError constructor', function() {
|
||||
const subject = new privateUnderTest.ExceptionFormatter();
|
||||
const error1 = new Error('first error');
|
||||
const error2 = new Error('second error');
|
||||
const aggregateError = new AggregateError(
|
||||
[error1, error2],
|
||||
'Multiple errors'
|
||||
);
|
||||
|
||||
const lines = subject.stack(aggregateError).split('\n');
|
||||
|
||||
const error1MsgIx = lines.findIndex(line =>
|
||||
line.includes('Error 1: Error: first error')
|
||||
);
|
||||
expect(error1MsgIx).toBeGreaterThan(-1);
|
||||
|
||||
const error2MsgIx = lines.findIndex(line =>
|
||||
line.includes('Error 2: Error: second error')
|
||||
);
|
||||
expect(error2MsgIx).toBeGreaterThan(error1MsgIx);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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' } });
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -160,6 +160,13 @@ describe('ParallelReportDispatcher', function() {
|
||||
);
|
||||
});
|
||||
|
||||
isNonMonkeyPatchableClass(
|
||||
jasmineUnderTest.ParallelReportDispatcher,
|
||||
function() {
|
||||
return new jasmineUnderTest.ParallelReportDispatcher();
|
||||
}
|
||||
);
|
||||
|
||||
function mockGlobalErrors() {
|
||||
const globalErrors = jasmine.createSpyObj('globalErrors', [
|
||||
'install',
|
||||
|
||||
@@ -278,7 +278,7 @@ describe('Spec', function() {
|
||||
spec.addExpectationResult(true, { message: 'passed' });
|
||||
expect(function() {
|
||||
spec.addExpectationResult(false, { message: 'failed' });
|
||||
}).toThrowError(jasmineUnderTest.private.errors.ExpectationFailed);
|
||||
}).toThrowError(privateUnderTest.errors.ExpectationFailed);
|
||||
|
||||
expect(spec.doneEvent().failedExpectations).toEqual([
|
||||
jasmine.objectContaining({ message: 'failed' })
|
||||
@@ -453,9 +453,7 @@ describe('Spec', function() {
|
||||
queueableFn: {}
|
||||
});
|
||||
|
||||
spec.handleException(
|
||||
new jasmineUnderTest.private.errors.ExpectationFailed()
|
||||
);
|
||||
spec.handleException(new privateUnderTest.errors.ExpectationFailed());
|
||||
|
||||
expect(spec.doneEvent().failedExpectations).toEqual([]);
|
||||
});
|
||||
|
||||
@@ -138,7 +138,7 @@ describe('Suite', function() {
|
||||
|
||||
expect(function() {
|
||||
suite.addExpectationResult(false, { message: 'failed' });
|
||||
}).toThrowError(jasmineUnderTest.private.errors.ExpectationFailed);
|
||||
}).toThrowError(privateUnderTest.errors.ExpectationFailed);
|
||||
|
||||
expect(suite.doneEvent().status).toBe('failed');
|
||||
expect(suite.doneEvent().failedExpectations).toEqual([
|
||||
@@ -149,9 +149,7 @@ describe('Suite', function() {
|
||||
it('does not add an additional failure when an expectation fails', function() {
|
||||
const suite = new privateUnderTest.Suite({});
|
||||
|
||||
suite.handleException(
|
||||
new jasmineUnderTest.private.errors.ExpectationFailed()
|
||||
);
|
||||
suite.handleException(new privateUnderTest.errors.ExpectationFailed());
|
||||
|
||||
expect(suite.doneEvent().failedExpectations).toEqual([]);
|
||||
});
|
||||
|
||||
@@ -30,4 +30,8 @@ describe('Timer', function() {
|
||||
expect(timer.elapsed()).toEqual(jasmine.any(Number));
|
||||
});
|
||||
});
|
||||
|
||||
isNonMonkeyPatchableClass(jasmineUnderTest.Timer, function() {
|
||||
return new jasmineUnderTest.Timer();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -163,7 +163,6 @@ describe('util', function() {
|
||||
// Chrome sometimes reports foo.js as foo.js/, so tolerate
|
||||
// a trailing slash if present.
|
||||
expect(privateUnderTest.util.jasmineFile()).toMatch(/util.js\/?$/);
|
||||
expect(jasmine.private.util.jasmineFile()).toMatch(/jasmine.js\/?$/);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1289,9 +1289,7 @@ describe('Env integration', function() {
|
||||
await env.execute();
|
||||
expect(reporter.specDone).toHaveBeenCalledTimes(1);
|
||||
const event = reporter.specDone.calls.argsFor(0)[0];
|
||||
jasmine.debugLog(
|
||||
'Spec result: ' + jasmine.private.basicPrettyPrinter(event)
|
||||
);
|
||||
jasmine.debugLog('Spec result: ' + jasmine.pp(event));
|
||||
expect(event).toEqual(jasmine.objectContaining({ status: 'passed' }));
|
||||
jasmine.clock().tick(1);
|
||||
|
||||
|
||||
@@ -13,83 +13,65 @@ describe('The jasmine namespace', function() {
|
||||
expect(setDifference(actualKeys, expectedKeys())).toEqual(new Set());
|
||||
});
|
||||
|
||||
describe('Warning about monkey patching', function() {
|
||||
beforeEach(function() {
|
||||
spyOn(console, 'error');
|
||||
describe('Preventing monkey patching', function() {
|
||||
const mutable = mutableKeys();
|
||||
|
||||
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) {
|
||||
if (includeHtml === undefined) {
|
||||
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([
|
||||
function mutableKeys() {
|
||||
return [
|
||||
'MAX_PRETTY_PRINT_ARRAY_LENGTH',
|
||||
'MAX_PRETTY_PRINT_CHARS',
|
||||
'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',
|
||||
'getEnv',
|
||||
'isSpy',
|
||||
'ParallelReportDispatcher',
|
||||
'private',
|
||||
'spyOnGlobalErrorsAsync',
|
||||
'Timer',
|
||||
'version',
|
||||
@@ -116,12 +98,10 @@ describe('The jasmine namespace', function() {
|
||||
'getGlobal'
|
||||
]);
|
||||
|
||||
if (includeHtml) {
|
||||
if (typeof window !== 'undefined') {
|
||||
// jasmine-html.js
|
||||
result.add('HtmlReporter');
|
||||
result.add('HtmlReporterV2');
|
||||
result.add('HtmlReporterV2Urls');
|
||||
result.add('HtmlSpecFilter');
|
||||
result.add('QueryString');
|
||||
}
|
||||
|
||||
@@ -141,15 +121,4 @@ describe('The jasmine namespace', function() {
|
||||
|
||||
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')
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
(function() {
|
||||
// By the time onload is called, jasmineRequire will be redefined to point
|
||||
// to the Jasmine source files (and not jasmine.js). So re-require
|
||||
window.jasmineUnderTest = jasmineRequire.core(jasmineRequire);
|
||||
jasmineRequire.html(jasmineUnderTest);
|
||||
// By the time onload is called, getJasmineRequireObj() and
|
||||
// getJasmineHtmlRequireObj() will be redefined to point
|
||||
// to the Jasmine source files (and not jasmine.js). So re-require.
|
||||
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
|
||||
window.privateUnderTest = window.jasmineUnderTest.private;
|
||||
getJasmineHtmlRequireObj().html(jasmineUnderTest, privateUnderTest);
|
||||
})();
|
||||
|
||||
@@ -42,9 +42,9 @@
|
||||
: 'Expected runnable "' +
|
||||
fullName +
|
||||
'" to have failures ' +
|
||||
jasmine.private.basicPrettyPrinter(expectedFailures) +
|
||||
jasmine.pp(expectedFailures) +
|
||||
' but it had ' +
|
||||
jasmine.private.basicPrettyPrinter(foundFailures)
|
||||
jasmine.pp(foundFailures)
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
67
spec/helpers/monkeyPatchingSpecs.js
Normal file
67
spec/helpers/monkeyPatchingSpecs.js
Normal 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);
|
||||
});
|
||||
});
|
||||
};
|
||||
@@ -7,24 +7,29 @@
|
||||
'../../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() {
|
||||
return jasmineUnderTestRequire;
|
||||
};
|
||||
|
||||
function getSourceFiles() {
|
||||
const globs = ['../../src/core/**/*.js', '../../src/version.js'];
|
||||
const srcFiles = globs.flatMap(g => glob.sync(g, { cwd: __dirname }));
|
||||
const srcFiles = [
|
||||
...glob.sync('../../src/core/**/*.js', {
|
||||
ignore: '../../src/core/requireSuffix.js',
|
||||
cwd: __dirname
|
||||
}),
|
||||
'../../src/version.js',
|
||||
'../../src/core/requireCore.js'
|
||||
];
|
||||
|
||||
for (const file of srcFiles) {
|
||||
require(file);
|
||||
}
|
||||
for (const file of srcFiles) {
|
||||
require(file);
|
||||
}
|
||||
|
||||
getSourceFiles();
|
||||
global.jasmineUnderTest = jasmineUnderTestRequire.core(
|
||||
jasmineUnderTestRequire
|
||||
);
|
||||
delete global.getJasmineRequireObj;
|
||||
|
||||
// Alias the private namespace so tests can be less verbose
|
||||
global.privateUnderTest = global.jasmineUnderTest.private;
|
||||
const built = jasmineUnderTestRequire.core(jasmineUnderTestRequire);
|
||||
global.jasmineUnderTest = built.jasmine;
|
||||
global.privateUnderTest = built.private;
|
||||
})();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1396,4 +1396,6 @@ describe('HtmlReporterV2', function() {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
isNonMonkeyPatchableClass(jasmineUnderTest.HtmlReporterV2, setup);
|
||||
});
|
||||
|
||||
@@ -63,4 +63,8 @@ describe('HtmlReporterV2Urls', function() {
|
||||
return qs;
|
||||
}
|
||||
});
|
||||
|
||||
isNonMonkeyPatchableClass(jasmineUnderTest.HtmlReporterV2Urls, function() {
|
||||
return new jasmineUnderTest.HtmlReporterV2Urls({});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -77,4 +77,12 @@ describe('QueryString', function() {
|
||||
expect(queryString.getParam('baz')).toBeFalsy();
|
||||
});
|
||||
});
|
||||
|
||||
isNonMonkeyPatchableClass(jasmineUnderTest.QueryString, function() {
|
||||
return new jasmineUnderTest.QueryString({
|
||||
getWindowLocation: function() {
|
||||
return { search: '' };
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -77,7 +77,7 @@ describe('npm package', 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) {
|
||||
expect(fileName).toExistInPath(this.packagedCore.files.bootDir);
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
/* eslint-env node, es6 */
|
||||
const path = require('path'),
|
||||
jasmineBrowser = require('jasmine-browser-runner'),
|
||||
jasmineCore = require('../../lib/jasmine-core');
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
/* eslint-env node, es6 */
|
||||
module.exports = {
|
||||
srcDir: 'src',
|
||||
srcFiles: [
|
||||
@@ -7,13 +6,14 @@ module.exports = {
|
||||
'core/util.js',
|
||||
'core/Spec.js',
|
||||
'core/Env.js',
|
||||
'core/JsApiReporter.js',
|
||||
'core/PrettyPrinter.js',
|
||||
'core/Suite.js',
|
||||
'core/**/*.js',
|
||||
'html/**/*.js',
|
||||
'**/*.js',
|
||||
'!boot/**.js'
|
||||
'!boot/**.js',
|
||||
'!core/requireSuffix.js',
|
||||
'!html/requireSuffix.js'
|
||||
],
|
||||
specDir: 'spec',
|
||||
specFiles: ['**/*[Ss]pec.js', '!npmPackage/**/*'],
|
||||
@@ -24,6 +24,7 @@ module.exports = {
|
||||
'helpers/domHelpers.js',
|
||||
'helpers/integrationMatchers.js',
|
||||
'helpers/callerFilenameShim.js',
|
||||
'helpers/monkeyPatchingSpecs.js',
|
||||
'helpers/defineJasmineUnderTest.js',
|
||||
'helpers/resetEnv.js'
|
||||
],
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
"helpers/integrationMatchers.js",
|
||||
"helpers/callerFilenameShim.js",
|
||||
"helpers/overrideConsoleLogForCircleCi.js",
|
||||
"helpers/monkeyPatchingSpecs.js",
|
||||
"helpers/nodeDefineJasmineUnderTest.js",
|
||||
"helpers/resetEnv.js"
|
||||
],
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
<link rel="stylesheet" href="lib/jasmine-<%= jasmineVersion %>/jasmine.css">
|
||||
|
||||
<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 %>/jasmine-html.js"></script>
|
||||
<!-- 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... -->
|
||||
<script src="src/Player.js"></script>
|
||||
|
||||
@@ -1,18 +1,5 @@
|
||||
'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() {
|
||||
const env = jasmine.getEnv();
|
||||
const urls = new jasmine.HtmlReporterV2Urls();
|
||||
@@ -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 & 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];
|
||||
}
|
||||
})();
|
||||
@@ -1,69 +1,25 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Note: Only available on Node.
|
||||
* @module jasmine-core
|
||||
*/
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const {
|
||||
globals,
|
||||
installGlobals,
|
||||
version,
|
||||
private$
|
||||
} = require('./jasmine-core/jasmine.js');
|
||||
|
||||
const jasmineRequire = require('./jasmine-core/jasmine.js');
|
||||
module.exports = jasmineRequire;
|
||||
|
||||
const bootWithoutGlobals = (function() {
|
||||
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');
|
||||
function reset() {
|
||||
private$.currentEnv_ = null;
|
||||
const env = jasmine.getEnv({ suppressLoadErrors: true });
|
||||
rebindInterface(env);
|
||||
}
|
||||
|
||||
const rootPath = path.join(__dirname, 'jasmine-core'),
|
||||
bootFiles = ['boot0.js', 'boot1.js'],
|
||||
legacyBootFiles = ['boot.js'],
|
||||
bootFiles = ['boot.js'],
|
||||
cssFiles = [],
|
||||
jsFiles = [],
|
||||
jsFilesToSkip = ['jasmine.js'].concat(bootFiles, legacyBootFiles);
|
||||
jsFilesToSkip = ['jasmine.js'].concat(bootFiles);
|
||||
|
||||
fs.readdirSync(rootPath).forEach(function(file) {
|
||||
if (fs.statSync(path.join(rootPath, file)).isFile()) {
|
||||
@@ -80,12 +36,40 @@ fs.readdirSync(rootPath).forEach(function(file) {
|
||||
}
|
||||
});
|
||||
|
||||
module.exports.files = {
|
||||
self: __filename,
|
||||
path: rootPath,
|
||||
bootDir: rootPath,
|
||||
bootFiles: bootFiles,
|
||||
cssFiles: cssFiles,
|
||||
jsFiles: ['jasmine.js'].concat(jsFiles),
|
||||
imagesDir: path.join(__dirname, '../images')
|
||||
/**
|
||||
* Note: Only available on Node.
|
||||
*
|
||||
* In addition to the members documented here, this module's exports include all
|
||||
* {@link globals}.
|
||||
* @module jasmine-core
|
||||
*/
|
||||
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')
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().CallTracker = function(j$) {
|
||||
getJasmineRequireObj().CallTracker = function(j$, private$) {
|
||||
'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.
|
||||
* @function
|
||||
*/
|
||||
this.saveArgumentsByValue = function(
|
||||
argsCloner = j$.private.util.cloneArgs
|
||||
) {
|
||||
this.saveArgumentsByValue = function(argsCloner = private$.util.cloneArgs) {
|
||||
opts.cloneArgs = true;
|
||||
opts.argsCloner = argsCloner;
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Clock = function(j$) {
|
||||
getJasmineRequireObj().Clock = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
/* global process */
|
||||
@@ -192,7 +192,7 @@ callbacks to execute _before_ running the next one.
|
||||
setInterval[IsMockClockTimingFn] = true;
|
||||
clearInterval[IsMockClockTimingFn] = true;
|
||||
|
||||
j$.private.deprecateMonkeyPatching(this);
|
||||
Object.freeze(this);
|
||||
|
||||
return this;
|
||||
|
||||
@@ -347,5 +347,7 @@ callbacks to execute _before_ running the next one.
|
||||
};
|
||||
|
||||
Clock.IsMockClockTimingFn = IsMockClockTimingFn;
|
||||
Object.freeze(Clock);
|
||||
Object.freeze(Clock.prototype);
|
||||
return Clock;
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().CompleteOnFirstErrorSkipPolicy = function(j$) {
|
||||
getJasmineRequireObj().CompleteOnFirstErrorSkipPolicy = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function CompleteOnFirstErrorSkipPolicy(queueableFns) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Configuration = function(j$) {
|
||||
getJasmineRequireObj().Configuration = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().DelayedFunctionScheduler = function(j$) {
|
||||
getJasmineRequireObj().DelayedFunctionScheduler = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function DelayedFunctionScheduler() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Deprecator = function(j$) {
|
||||
getJasmineRequireObj().Deprecator = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function Deprecator(topSuite) {
|
||||
@@ -25,7 +25,7 @@ getJasmineRequireObj().Deprecator = function(j$) {
|
||||
) {
|
||||
options = options || {};
|
||||
|
||||
if (!this.verbose_ && !j$.private.isError(deprecation)) {
|
||||
if (!this.verbose_ && !private$.isError(deprecation)) {
|
||||
if (this.toSuppress_.indexOf(deprecation) !== -1) {
|
||||
return;
|
||||
}
|
||||
@@ -37,7 +37,7 @@ getJasmineRequireObj().Deprecator = function(j$) {
|
||||
};
|
||||
|
||||
Deprecator.prototype.log_ = function(runnable, deprecation, options) {
|
||||
if (j$.private.isError(deprecation)) {
|
||||
if (private$.isError(deprecation)) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(deprecation);
|
||||
return;
|
||||
@@ -66,7 +66,7 @@ getJasmineRequireObj().Deprecator = function(j$) {
|
||||
};
|
||||
|
||||
Deprecator.prototype.stackTrace_ = function() {
|
||||
const formatter = new j$.private.ExceptionFormatter();
|
||||
const formatter = new private$.ExceptionFormatter();
|
||||
return formatter.stack(new Error()).replace(/^Error\n/m, '');
|
||||
};
|
||||
|
||||
@@ -75,7 +75,7 @@ getJasmineRequireObj().Deprecator = function(j$) {
|
||||
runnable = this.topSuite_;
|
||||
}
|
||||
|
||||
if (j$.private.isError(deprecation)) {
|
||||
if (private$.isError(deprecation)) {
|
||||
runnable.addDeprecationWarning(deprecation);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Env = function(j$) {
|
||||
getJasmineRequireObj().Env = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const DEFAULT_IT_DESCRIBE_STACK_DEPTH = 3;
|
||||
@@ -15,18 +15,18 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
envOptions = envOptions || {};
|
||||
|
||||
const self = this;
|
||||
const GlobalErrors = envOptions.GlobalErrors || j$.private.GlobalErrors;
|
||||
const GlobalErrors = envOptions.GlobalErrors || private$.GlobalErrors;
|
||||
const global = envOptions.global || j$.getGlobal();
|
||||
|
||||
const realSetTimeout = global.setTimeout;
|
||||
const realClearTimeout = global.clearTimeout;
|
||||
const stackClearer = j$.private.getStackClearer(global);
|
||||
this.clock = new j$.private.Clock(
|
||||
const stackClearer = private$.getStackClearer(global);
|
||||
this.clock = new private$.Clock(
|
||||
global,
|
||||
function() {
|
||||
return new j$.private.DelayedFunctionScheduler();
|
||||
return new private$.DelayedFunctionScheduler();
|
||||
},
|
||||
new j$.private.MockDate(global)
|
||||
new private$.MockDate(global)
|
||||
);
|
||||
|
||||
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() {
|
||||
const r = runner.currentRunable();
|
||||
return r ? r.id : null;
|
||||
@@ -67,7 +67,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
let runner;
|
||||
let parallelLoadingState = null; // 'specs', 'helpers', or null for non-parallel
|
||||
|
||||
const config = new j$.private.Configuration();
|
||||
const config = new private$.Configuration();
|
||||
|
||||
if (!envOptions.suppressLoadErrors) {
|
||||
installGlobalErrors();
|
||||
@@ -137,11 +137,11 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
runableResources.customObjectFormatters().push(formatter);
|
||||
};
|
||||
|
||||
j$.private.Expectation.addCoreMatchers(j$.private.matchers);
|
||||
j$.private.Expectation.addAsyncCoreMatchers(j$.private.asyncMatchers);
|
||||
private$.Expectation.addCoreMatchers(private$.matchers);
|
||||
private$.Expectation.addAsyncCoreMatchers(private$.asyncMatchers);
|
||||
|
||||
const expectationFactory = function(actual, spec) {
|
||||
return j$.private.Expectation.factory({
|
||||
return private$.Expectation.factory({
|
||||
matchersUtil: runableResources.makeMatchersUtil(),
|
||||
customMatchers: runableResources.customMatchers(),
|
||||
actual: actual,
|
||||
@@ -174,7 +174,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
};
|
||||
|
||||
const throwUnlessFactory = function(actual, spec) {
|
||||
return j$.private.Expectation.factory({
|
||||
return private$.Expectation.factory({
|
||||
matchersUtil: runableResources.makeMatchersUtil(),
|
||||
customMatchers: runableResources.customMatchers(),
|
||||
actual: actual,
|
||||
@@ -183,7 +183,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
};
|
||||
|
||||
const throwUnlessAsyncFactory = function(actual, spec) {
|
||||
return j$.private.Expectation.asyncFactory({
|
||||
return private$.Expectation.asyncFactory({
|
||||
matchersUtil: runableResources.makeMatchersUtil(),
|
||||
customAsyncMatchers: runableResources.customAsyncMatchers(),
|
||||
actual: actual,
|
||||
@@ -198,7 +198,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
error.matcherName !== undefined && error.passed !== undefined;
|
||||
const result = isExpectationResult
|
||||
? error
|
||||
: j$.private.buildExpectationResult({
|
||||
: private$.buildExpectationResult({
|
||||
error,
|
||||
passed: false,
|
||||
matcherName: '',
|
||||
@@ -259,7 +259,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
}
|
||||
|
||||
const asyncExpectationFactory = function(actual, spec, runableType) {
|
||||
return j$.private.Expectation.asyncFactory({
|
||||
return private$.Expectation.asyncFactory({
|
||||
matchersUtil: runableResources.makeMatchersUtil(),
|
||||
customAsyncMatchers: runableResources.customAsyncMatchers(),
|
||||
actual: actual,
|
||||
@@ -318,10 +318,10 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
(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,
|
||||
expectationFactory,
|
||||
asyncExpectationFactory,
|
||||
@@ -330,7 +330,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
});
|
||||
topSuite = suiteBuilder.topSuite;
|
||||
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
|
||||
@@ -350,23 +350,23 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
* @interface Reporter
|
||||
* @see custom_reporter
|
||||
*/
|
||||
reportDispatcher = new j$.private.ReportDispatcher(
|
||||
j$.private.reporterEvents,
|
||||
reportDispatcher = new private$.ReportDispatcher(
|
||||
private$.reporterEvents,
|
||||
function(options) {
|
||||
options.SkipPolicy = j$.private.NeverSkipPolicy;
|
||||
options.SkipPolicy = private$.NeverSkipPolicy;
|
||||
return runQueue(options);
|
||||
},
|
||||
recordLateError
|
||||
);
|
||||
|
||||
runner = new j$.private.Runner({
|
||||
runner = new private$.Runner({
|
||||
topSuite,
|
||||
totalSpecsDefined: () => suiteBuilder.totalSpecsDefined,
|
||||
focusedRunables: () => suiteBuilder.focusedRunables,
|
||||
runableResources,
|
||||
reportDispatcher,
|
||||
runQueue,
|
||||
TreeProcessor: j$.private.TreeProcessor,
|
||||
TreeProcessor: private$.TreeProcessor,
|
||||
globalErrors,
|
||||
getConfig: () => config
|
||||
});
|
||||
@@ -411,7 +411,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
|
||||
// Karma incorrectly loads jasmine-core as an ES module. It isn't one,
|
||||
// and we don't test that configuration. Warn about it.
|
||||
if (j$.private.loadedAsBrowserEsm) {
|
||||
if (private$.loadedAsBrowserEsm) {
|
||||
this.deprecated(
|
||||
"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 {
|
||||
const maybePromise = fn(spy);
|
||||
|
||||
if (!j$.private.isPromiseLike(maybePromise)) {
|
||||
if (!private$.isPromiseLike(maybePromise)) {
|
||||
throw new Error(
|
||||
'The callback to spyOnGlobalErrorsAsync must be an async or promise-returning function'
|
||||
);
|
||||
@@ -783,7 +783,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
};
|
||||
|
||||
this.pending = function(message) {
|
||||
let fullMessage = j$.private.Spec.pendingSpecExceptionMessage;
|
||||
let fullMessage = private$.Spec.pendingSpecExceptionMessage;
|
||||
if (message) {
|
||||
fullMessage += message;
|
||||
}
|
||||
@@ -802,7 +802,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
message += ': ';
|
||||
if (error.message) {
|
||||
message += error.message;
|
||||
} else if (j$.private.isString(error)) {
|
||||
} else if (private$.isString(error)) {
|
||||
message += error;
|
||||
} else {
|
||||
// pretty print all kind of objects. This includes arrays.
|
||||
@@ -828,7 +828,7 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
this.pp = function(value) {
|
||||
const pp = runner.currentRunable()
|
||||
? runableResources.makePrettyPrinter()
|
||||
: j$.private.basicPrettyPrinter;
|
||||
: private$.basicPrettyPrinter;
|
||||
return pp(value);
|
||||
};
|
||||
|
||||
@@ -836,16 +836,18 @@ getJasmineRequireObj().Env = function(j$) {
|
||||
uninstallGlobalErrors();
|
||||
};
|
||||
|
||||
j$.private.deprecateMonkeyPatching(this, ['deprecated']);
|
||||
Object.freeze(this);
|
||||
}
|
||||
|
||||
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,
|
||||
// which bypass the global it/describe layer, but could be absent in case
|
||||
// of misconfiguration. Don't crash if it's absent.
|
||||
return frames[depth] && frames[depth].file;
|
||||
}
|
||||
|
||||
Object.freeze(Env);
|
||||
Object.freeze(Env.prototype);
|
||||
return Env;
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
||||
getJasmineRequireObj().ExceptionFormatter = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const ignoredProperties = [
|
||||
@@ -11,12 +11,13 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
||||
'lineNumber',
|
||||
'column',
|
||||
'description',
|
||||
'jasmineMessage'
|
||||
'jasmineMessage',
|
||||
'errors'
|
||||
];
|
||||
|
||||
function ExceptionFormatter(options) {
|
||||
const jasmineFile =
|
||||
(options && options.jasmineFile) || j$.private.util.jasmineFile();
|
||||
(options && options.jasmineFile) || private$.util.jasmineFile();
|
||||
this.message = function(error) {
|
||||
let message = '';
|
||||
|
||||
@@ -60,7 +61,7 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
||||
lines.pop();
|
||||
}
|
||||
|
||||
const stackTrace = new j$.private.StackTrace(error);
|
||||
const stackTrace = new private$.StackTrace(error);
|
||||
lines = lines.concat(filterJasmine(stackTrace));
|
||||
|
||||
if (messageHandling === 'require') {
|
||||
@@ -77,6 +78,19 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
||||
lines = lines.concat(substack);
|
||||
}
|
||||
|
||||
if (Array.isArray(error.errors)) {
|
||||
for (let i = 0; i < error.errors.length; i++) {
|
||||
if (error.errors[i] instanceof Error) {
|
||||
lines.push('');
|
||||
const substack = this.stack_(error.errors[i], {
|
||||
messageHandling: 'require'
|
||||
});
|
||||
substack[0] = 'Error ' + (i + 1) + ': ' + substack[0];
|
||||
lines = lines.concat(substack.map(x => ' ' + x));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return lines;
|
||||
};
|
||||
|
||||
@@ -114,7 +128,7 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
||||
|
||||
if (!empty) {
|
||||
return (
|
||||
'error properties: ' + j$.private.basicPrettyPrinter(result) + '\n'
|
||||
'error properties: ' + private$.basicPrettyPrinter(result) + '\n'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Expectation = function(j$) {
|
||||
getJasmineRequireObj().Expectation = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@@ -6,7 +6,7 @@ getJasmineRequireObj().Expectation = function(j$) {
|
||||
* @namespace matchers
|
||||
*/
|
||||
function Expectation(options) {
|
||||
this.expector = new j$.private.Expector(options);
|
||||
this.expector = new private$.Expector(options);
|
||||
|
||||
const customMatchers = options.customMatchers || {};
|
||||
for (const matcherName in customMatchers) {
|
||||
@@ -82,7 +82,7 @@ getJasmineRequireObj().Expectation = function(j$) {
|
||||
* @namespace async-matchers
|
||||
*/
|
||||
function AsyncExpectation(options) {
|
||||
this.expector = new j$.private.Expector(options);
|
||||
this.expector = new private$.Expector(options);
|
||||
|
||||
const customAsyncMatchers = options.customAsyncMatchers || {};
|
||||
for (const matcherName in customAsyncMatchers) {
|
||||
@@ -175,7 +175,7 @@ getJasmineRequireObj().Expectation = function(j$) {
|
||||
|
||||
function negatedFailureMessage(result, matcherName, args, matchersUtil) {
|
||||
if (result.message) {
|
||||
if (j$.private.isFunction(result.message)) {
|
||||
if (private$.isFunction(result.message)) {
|
||||
return result.message();
|
||||
} else {
|
||||
return result.message;
|
||||
@@ -220,7 +220,7 @@ getJasmineRequireObj().Expectation = function(j$) {
|
||||
return function(actual) {
|
||||
const matcherArgs = arguments;
|
||||
|
||||
return j$.private.isPending(actual).then(function(isPending) {
|
||||
return private$.isPending(actual).then(function(isPending) {
|
||||
if (isPending) {
|
||||
return {
|
||||
pass: false,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Expector = function(j$) {
|
||||
getJasmineRequireObj().Expector = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function Expector(options) {
|
||||
@@ -7,7 +7,7 @@ getJasmineRequireObj().Expector = function(j$) {
|
||||
};
|
||||
this.actual = options.actual;
|
||||
this.addExpectationResult = options.addExpectationResult || function() {};
|
||||
this.filters = new j$.private.ExpectationFilterChain();
|
||||
this.filters = new private$.ExpectationFilterChain();
|
||||
}
|
||||
|
||||
Expector.prototype.instantiateMatcher = function(
|
||||
@@ -41,7 +41,7 @@ getJasmineRequireObj().Expector = function(j$) {
|
||||
this.matchersUtil,
|
||||
args
|
||||
);
|
||||
} else if (j$.private.isFunction(result.message)) {
|
||||
} else if (private$.isFunction(result.message)) {
|
||||
return result.message();
|
||||
} else {
|
||||
return result.message;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().GlobalErrors = function(j$) {
|
||||
getJasmineRequireObj().GlobalErrors = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class GlobalErrors {
|
||||
@@ -26,7 +26,7 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
|
||||
if (
|
||||
global.process &&
|
||||
global.process.listeners &&
|
||||
j$.private.isFunction(global.process.on)
|
||||
private$.isFunction(global.process.on)
|
||||
) {
|
||||
this.#adapter = new NodeAdapter(global, dispatch);
|
||||
} else {
|
||||
@@ -183,7 +183,7 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
|
||||
const jasmineMessage = 'Unhandled promise rejection: ' + event.reason;
|
||||
let reason;
|
||||
|
||||
if (j$.private.isError(event.reason)) {
|
||||
if (private$.isError(event.reason)) {
|
||||
reason = event.reason;
|
||||
reason.jasmineMessage = jasmineMessage;
|
||||
} else {
|
||||
@@ -262,7 +262,7 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
|
||||
jasmineMessagePrefix = 'Uncaught exception';
|
||||
}
|
||||
|
||||
if (j$.private.isError(error)) {
|
||||
if (private$.isError(error)) {
|
||||
error.jasmineMessage = jasmineMessagePrefix + ': ' + error;
|
||||
return error;
|
||||
} else {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().MockDate = function(j$) {
|
||||
getJasmineRequireObj().MockDate = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function MockDate(global) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().NeverSkipPolicy = function(j$) {
|
||||
getJasmineRequireObj().NeverSkipPolicy = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function NeverSkipPolicy(queueableFns) {}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().ParallelReportDispatcher = function(j$) {
|
||||
getJasmineRequireObj().ParallelReportDispatcher = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@@ -15,43 +15,43 @@ getJasmineRequireObj().ParallelReportDispatcher = function(j$) {
|
||||
* 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
|
||||
*/
|
||||
function ParallelReportDispatcher(onError, deps = {}) {
|
||||
const ReportDispatcher =
|
||||
deps.ReportDispatcher || j$.private.ReportDispatcher;
|
||||
const QueueRunner = deps.QueueRunner || j$.private.QueueRunner;
|
||||
const globalErrors = deps.globalErrors || new j$.private.GlobalErrors();
|
||||
const dispatcher = new ReportDispatcher(
|
||||
j$.private.reporterEvents,
|
||||
function(queueRunnerOptions) {
|
||||
queueRunnerOptions = {
|
||||
...queueRunnerOptions,
|
||||
globalErrors,
|
||||
timeout: { setTimeout, clearTimeout },
|
||||
fail: function(error) {
|
||||
// A callback-style async reporter called either done.fail()
|
||||
// or done(anError).
|
||||
if (!error) {
|
||||
error = new Error('A reporter called done.fail()');
|
||||
class ParallelReportDispatcher {
|
||||
constructor(onError, deps = {}) {
|
||||
const ReportDispatcher =
|
||||
deps.ReportDispatcher || private$.ReportDispatcher;
|
||||
const QueueRunner = deps.QueueRunner || private$.QueueRunner;
|
||||
const globalErrors = deps.globalErrors || new private$.GlobalErrors();
|
||||
const dispatcher = new ReportDispatcher(
|
||||
private$.reporterEvents,
|
||||
function(queueRunnerOptions) {
|
||||
queueRunnerOptions = {
|
||||
...queueRunnerOptions,
|
||||
globalErrors,
|
||||
timeout: { setTimeout, clearTimeout },
|
||||
fail: function(error) {
|
||||
// A callback-style async reporter called either done.fail()
|
||||
// or done(anError).
|
||||
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.
|
||||
* @function
|
||||
@@ -59,13 +59,13 @@ getJasmineRequireObj().ParallelReportDispatcher = function(j$) {
|
||||
* @param {Reporter} reporterToAdd The reporter to be added.
|
||||
* @see custom_reporter
|
||||
*/
|
||||
addReporter: dispatcher.addReporter.bind(dispatcher),
|
||||
this.addReporter = dispatcher.addReporter.bind(dispatcher);
|
||||
/**
|
||||
* Clears all registered reporters.
|
||||
* @function
|
||||
* @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
|
||||
* unhandled exceptions or unhandled promise rejections will be passed to
|
||||
@@ -73,24 +73,25 @@ getJasmineRequireObj().ParallelReportDispatcher = function(j$) {
|
||||
* @function
|
||||
* @name ParallelReportDispatcher#installGlobalErrors
|
||||
*/
|
||||
installGlobalErrors: globalErrors.install.bind(globalErrors),
|
||||
this.installGlobalErrors = globalErrors.install.bind(globalErrors);
|
||||
/**
|
||||
* Uninstalls the global error handler.
|
||||
* @function
|
||||
* @name ParallelReportDispatcher#uninstallGlobalErrors
|
||||
*/
|
||||
uninstallGlobalErrors: function() {
|
||||
this.uninstallGlobalErrors = function() {
|
||||
// late-bind uninstall because it doesn't exist until install is called
|
||||
globalErrors.uninstall(globalErrors);
|
||||
};
|
||||
|
||||
for (const eventName of private$.reporterEvents) {
|
||||
this[eventName] = dispatcher[eventName].bind(dispatcher);
|
||||
}
|
||||
};
|
||||
|
||||
for (const eventName of j$.private.reporterEvents) {
|
||||
self[eventName] = dispatcher[eventName].bind(dispatcher);
|
||||
Object.freeze(this);
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
Object.freeze(ParallelReportDispatcher.prototype);
|
||||
return ParallelReportDispatcher;
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
getJasmineRequireObj().makePrettyPrinter = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class SinglePrettyPrintRun {
|
||||
@@ -28,7 +28,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
this.emitScalar('<global>');
|
||||
} else if (value.jasmineToString) {
|
||||
this.emitScalar(value.jasmineToString(this.pp_));
|
||||
} else if (j$.private.isString(value)) {
|
||||
} else if (private$.isString(value)) {
|
||||
this.emitString(value);
|
||||
} else if (j$.isSpy(value)) {
|
||||
this.emitScalar('spy on ' + value.and.identity);
|
||||
@@ -42,7 +42,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
} else {
|
||||
this.emitScalar('Function');
|
||||
}
|
||||
} else if (j$.private.isDomNode(value)) {
|
||||
} else if (private$.isDomNode(value)) {
|
||||
if (value.tagName) {
|
||||
this.emitDomElement(value);
|
||||
} else {
|
||||
@@ -50,11 +50,11 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
}
|
||||
} else if (value instanceof Date) {
|
||||
this.emitScalar('Date(' + value + ')');
|
||||
} else if (j$.private.isSet(value)) {
|
||||
} else if (private$.isSet(value)) {
|
||||
this.emitSet(value);
|
||||
} else if (j$.private.isMap(value)) {
|
||||
} else if (private$.isMap(value)) {
|
||||
this.emitMap(value);
|
||||
} else if (j$.private.isTypedArray(value)) {
|
||||
} else if (private$.isTypedArray(value)) {
|
||||
this.emitTypedArray(value);
|
||||
} else if (
|
||||
value.toString &&
|
||||
@@ -74,7 +74,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
(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);
|
||||
if (Array.isArray(value)) {
|
||||
this.emitArray(value);
|
||||
@@ -99,7 +99,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
for (let i = 0; i < length; i++) {
|
||||
@@ -208,7 +208,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
const ctor = obj.constructor;
|
||||
const constructorName =
|
||||
typeof ctor === 'function' && obj instanceof ctor
|
||||
? j$.private.fnNameFor(obj.constructor)
|
||||
? private$.fnNameFor(obj.constructor)
|
||||
: 'null';
|
||||
|
||||
this.append(constructorName);
|
||||
@@ -238,7 +238,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
}
|
||||
|
||||
emitTypedArray(arr) {
|
||||
const constructorName = j$.private.fnNameFor(arr.constructor);
|
||||
const constructorName = private$.fnNameFor(arr.constructor);
|
||||
const limitedArray = Array.prototype.slice.call(
|
||||
arr,
|
||||
0,
|
||||
@@ -307,7 +307,7 @@ getJasmineRequireObj().makePrettyPrinter = function(j$) {
|
||||
// iframe, web worker)
|
||||
try {
|
||||
return (
|
||||
j$.private.isFunction(value.toString) &&
|
||||
private$.isFunction(value.toString) &&
|
||||
value.toString !== Object.prototype.toString &&
|
||||
value.toString() !== Object.prototype.toString.call(value)
|
||||
);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
getJasmineRequireObj().QueueRunner = function(j$) {
|
||||
getJasmineRequireObj().QueueRunner = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
let nextid = 1;
|
||||
|
||||
function StopExecutionError() {}
|
||||
StopExecutionError.prototype = new Error();
|
||||
j$.private.StopExecutionError = StopExecutionError;
|
||||
private$.StopExecutionError = StopExecutionError;
|
||||
|
||||
function once(fn, onTwice) {
|
||||
let called = false;
|
||||
@@ -58,7 +58,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
||||
};
|
||||
this.onException = attrs.onException || emptyFn;
|
||||
this.onMultipleDone = attrs.onMultipleDone || fallbackOnMultipleDone;
|
||||
this.userContext = attrs.userContext || new j$.private.UserContext();
|
||||
this.userContext = attrs.userContext || new private$.UserContext();
|
||||
this.timeout = attrs.timeout || {
|
||||
setTimeout: setTimeout,
|
||||
clearTimeout: clearTimeout
|
||||
@@ -69,7 +69,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
||||
popListener: emptyFn
|
||||
};
|
||||
|
||||
const SkipPolicy = attrs.SkipPolicy || j$.private.NeverSkipPolicy;
|
||||
const SkipPolicy = attrs.SkipPolicy || private$.NeverSkipPolicy;
|
||||
this.skipPolicy_ = new SkipPolicy(this.queueableFns);
|
||||
this.errored_ = false;
|
||||
|
||||
@@ -192,7 +192,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
||||
if (queueableFn.fn.length === 0) {
|
||||
maybeThenable = queueableFn.fn.call(this.userContext);
|
||||
|
||||
if (maybeThenable && j$.private.isFunction(maybeThenable.then)) {
|
||||
if (maybeThenable && private$.isFunction(maybeThenable.then)) {
|
||||
maybeThenable.then(
|
||||
wrapInPromiseResolutionHandler(next),
|
||||
onPromiseRejection
|
||||
@@ -262,11 +262,11 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
||||
};
|
||||
|
||||
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.
|
||||
// Omit the stack trace because there's almost certainly no user code
|
||||
// on the stack at this point.
|
||||
if (j$.private.isAsyncFunction(fn)) {
|
||||
if (private$.isAsyncFunction(fn)) {
|
||||
this.onException(
|
||||
new Error(
|
||||
'An asynchronous before/it/after ' +
|
||||
@@ -290,7 +290,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
||||
|
||||
function wrapInPromiseResolutionHandler(fn) {
|
||||
return function(maybeArg) {
|
||||
if (j$.private.isError(maybeArg)) {
|
||||
if (private$.isError(maybeArg)) {
|
||||
fn(maybeArg);
|
||||
} else {
|
||||
fn();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().ReportDispatcher = function(j$) {
|
||||
getJasmineRequireObj().ReportDispatcher = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function ReportDispatcher(methods, runQueue, onLateError) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().RunableResources = function(j$) {
|
||||
getJasmineRequireObj().RunableResources = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class RunableResources {
|
||||
@@ -7,7 +7,7 @@ getJasmineRequireObj().RunableResources = function(j$) {
|
||||
this.getCurrentRunableId_ = options.getCurrentRunableId;
|
||||
this.globalErrors_ = options.globalErrors;
|
||||
|
||||
this.spyFactory = new j$.private.SpyFactory(
|
||||
this.spyFactory = new private$.SpyFactory(
|
||||
() => {
|
||||
if (this.getCurrentRunableId_()) {
|
||||
return this.customSpyStrategies();
|
||||
@@ -19,7 +19,7 @@ getJasmineRequireObj().RunableResources = function(j$) {
|
||||
() => this.makeMatchersUtil()
|
||||
);
|
||||
|
||||
this.spyRegistry = new j$.private.SpyRegistry({
|
||||
this.spyRegistry = new private$.SpyRegistry({
|
||||
currentSpies: () => this.spies(),
|
||||
createSpy: (name, originalFn) =>
|
||||
this.spyFactory.createSpy(name, originalFn)
|
||||
@@ -50,7 +50,7 @@ getJasmineRequireObj().RunableResources = function(j$) {
|
||||
];
|
||||
|
||||
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() {
|
||||
return j$.private.makePrettyPrinter(this.customObjectFormatters());
|
||||
return private$.makePrettyPrinter(this.customObjectFormatters());
|
||||
}
|
||||
|
||||
makeMatchersUtil() {
|
||||
if (this.getCurrentRunableId_()) {
|
||||
return new j$.private.MatchersUtil({
|
||||
return new private$.MatchersUtil({
|
||||
customTesters: this.customEqualityTesters(),
|
||||
pp: this.makePrettyPrinter()
|
||||
});
|
||||
} else {
|
||||
return new j$.private.MatchersUtil({
|
||||
pp: j$.private.basicPrettyPrinter
|
||||
return new private$.MatchersUtil({
|
||||
pp: private$.basicPrettyPrinter
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Runner = function(j$) {
|
||||
getJasmineRequireObj().Runner = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class Runner {
|
||||
@@ -26,7 +26,7 @@ getJasmineRequireObj().Runner = function(j$) {
|
||||
this.#reportDispatcher = options.reportDispatcher;
|
||||
this.#getConfig = options.getConfig;
|
||||
this.#executedBefore = false;
|
||||
this.#currentRunableTracker = new j$.private.CurrentRunableTracker();
|
||||
this.#currentRunableTracker = new private$.CurrentRunableTracker();
|
||||
}
|
||||
|
||||
currentSpec() {
|
||||
@@ -66,9 +66,9 @@ getJasmineRequireObj().Runner = function(j$) {
|
||||
}
|
||||
}
|
||||
|
||||
const order = new j$.private.Order({
|
||||
const order = new private$.Order({
|
||||
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({
|
||||
@@ -112,7 +112,7 @@ getJasmineRequireObj().Runner = function(j$) {
|
||||
});
|
||||
|
||||
this.#currentRunableTracker.pushSuite(this.#topSuite);
|
||||
const treeRunner = new j$.private.TreeRunner({
|
||||
const treeRunner = new private$.TreeRunner({
|
||||
executionTree: this.#executionTree,
|
||||
globalErrors: this.#globalErrors,
|
||||
runableResources: this.#runableResources,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().SkipAfterBeforeAllErrorPolicy = function(j$) {
|
||||
getJasmineRequireObj().SkipAfterBeforeAllErrorPolicy = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function SkipAfterBeforeAllErrorPolicy(queueableFns) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Spec = function(j$) {
|
||||
getJasmineRequireObj().Spec = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class Spec {
|
||||
@@ -46,7 +46,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
}
|
||||
|
||||
addExpectationResult(passed, data, isError) {
|
||||
const expectationResult = j$.private.buildExpectationResult(data);
|
||||
const expectationResult = private$.buildExpectationResult(data);
|
||||
|
||||
if (passed) {
|
||||
this.#executionState.passedExpectations.push(expectationResult);
|
||||
@@ -58,7 +58,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
}
|
||||
|
||||
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
|
||||
// thrown at that point if they aren't cloneable isn't very helpful.
|
||||
// Throw a better one now.
|
||||
if (!j$.private.isString(key)) {
|
||||
if (!private$.isString(key)) {
|
||||
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[key] = value;
|
||||
@@ -208,7 +208,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (e instanceof j$.private.errors.ExpectationFailed) {
|
||||
if (e instanceof private$.errors.ExpectationFailed) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -275,7 +275,7 @@ getJasmineRequireObj().Spec = function(j$) {
|
||||
deprecation = { message: deprecation };
|
||||
}
|
||||
this.#executionState.deprecationWarnings.push(
|
||||
j$.private.buildExpectationResult(deprecation)
|
||||
private$.buildExpectationResult(deprecation)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Spy = function(j$) {
|
||||
getJasmineRequireObj().Spy = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const nextOrder = (function() {
|
||||
@@ -55,7 +55,7 @@ getJasmineRequireObj().Spy = function(j$) {
|
||||
},
|
||||
matchersUtil
|
||||
),
|
||||
callTracker = new j$.private.CallTracker();
|
||||
callTracker = new private$.CallTracker();
|
||||
|
||||
function makeFunc(length, fn) {
|
||||
switch (length) {
|
||||
@@ -147,9 +147,9 @@ getJasmineRequireObj().Spy = function(j$) {
|
||||
}
|
||||
|
||||
function SpyStrategyDispatcher(strategyArgs, matchersUtil) {
|
||||
const baseStrategy = new j$.private.SpyStrategy(strategyArgs);
|
||||
const baseStrategy = new private$.SpyStrategy(strategyArgs);
|
||||
const argsStrategies = new StrategyDict(function() {
|
||||
return new j$.private.SpyStrategy(strategyArgs);
|
||||
return new private$.SpyStrategy(strategyArgs);
|
||||
}, matchersUtil);
|
||||
|
||||
this.and = baseStrategy;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().SpyFactory = function(j$) {
|
||||
getJasmineRequireObj().SpyFactory = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function SpyFactory(
|
||||
@@ -7,12 +7,12 @@ getJasmineRequireObj().SpyFactory = function(j$) {
|
||||
getMatchersUtil
|
||||
) {
|
||||
this.createSpy = function(name, originalFn) {
|
||||
if (j$.private.isFunction(name) && originalFn === undefined) {
|
||||
if (private$.isFunction(name) && originalFn === undefined) {
|
||||
originalFn = name;
|
||||
name = originalFn.name;
|
||||
}
|
||||
|
||||
return j$.private.Spy(name, getMatchersUtil(), {
|
||||
return private$.Spy(name, getMatchersUtil(), {
|
||||
originalFn,
|
||||
customStrategies: getCustomStrategies(),
|
||||
defaultStrategyFn: getDefaultStrategyFn()
|
||||
@@ -21,7 +21,7 @@ getJasmineRequireObj().SpyFactory = function(j$) {
|
||||
|
||||
this.createSpyObj = function(baseName, methodNames, propertyNames) {
|
||||
const baseNameIsCollection =
|
||||
j$.private.isObject(baseName) || Array.isArray(baseName);
|
||||
private$.isObject(baseName) || Array.isArray(baseName);
|
||||
|
||||
if (baseNameIsCollection) {
|
||||
propertyNames = methodNames;
|
||||
@@ -71,7 +71,7 @@ getJasmineRequireObj().SpyFactory = function(j$) {
|
||||
for (let i = 0; i < object.length; i++) {
|
||||
result.push([object[i]]);
|
||||
}
|
||||
} else if (j$.private.isObject(object)) {
|
||||
} else if (private$.isObject(object)) {
|
||||
for (const key in object) {
|
||||
if (object.hasOwnProperty(key)) {
|
||||
result.push([key, object[key]]);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
getJasmineRequireObj().SpyRegistry = function(j$) {
|
||||
getJasmineRequireObj().SpyRegistry = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const spyOnMsg = j$.private.formatErrorMsg(
|
||||
const spyOnMsg = private$.formatErrorMsg(
|
||||
'<spyOn>',
|
||||
'spyOn(<object>, <methodName>)'
|
||||
);
|
||||
const spyOnPropertyMsg = j$.private.formatErrorMsg(
|
||||
const spyOnPropertyMsg = private$.formatErrorMsg(
|
||||
'<spyOnProperty>',
|
||||
'spyOnProperty(<object>, <propName>, [accessType])'
|
||||
);
|
||||
@@ -47,7 +47,7 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
|
||||
// restored.
|
||||
if (
|
||||
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");
|
||||
}
|
||||
@@ -102,7 +102,7 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
|
||||
// localStorage in Firefox and later Safari versions, have no-op setters.
|
||||
if (obj[methodName] !== spiedMethod) {
|
||||
throw new Error(
|
||||
j$.private.formatErrorMsg('<spyOn>')(
|
||||
private$.formatErrorMsg('<spyOn>')(
|
||||
`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'));
|
||||
}
|
||||
|
||||
const descriptor = j$.private.util.getPropertyDescriptor(
|
||||
obj,
|
||||
propertyName
|
||||
);
|
||||
const descriptor = private$.util.getPropertyDescriptor(obj, propertyName);
|
||||
|
||||
if (!descriptor) {
|
||||
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]);
|
||||
let restoreStrategy;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().SpyStrategy = function(j$) {
|
||||
getJasmineRequireObj().SpyStrategy = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@@ -21,7 +21,7 @@ getJasmineRequireObj().SpyStrategy = function(j$) {
|
||||
|
||||
const cs = options.customStrategies || {};
|
||||
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]);
|
||||
}
|
||||
}
|
||||
@@ -59,7 +59,7 @@ getJasmineRequireObj().SpyStrategy = function(j$) {
|
||||
return function() {
|
||||
const plan = factory.apply(null, arguments);
|
||||
|
||||
if (!j$.private.isFunction(plan)) {
|
||||
if (!private$.isFunction(plan)) {
|
||||
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
|
||||
*/
|
||||
SpyStrategy.prototype.throwError = function(something) {
|
||||
const error = j$.private.isString(something)
|
||||
const error = private$.isString(something)
|
||||
? new Error(something)
|
||||
: something;
|
||||
this.plan = function() {
|
||||
@@ -150,9 +150,9 @@ getJasmineRequireObj().SpyStrategy = function(j$) {
|
||||
SpyStrategy.prototype.callFake = function(fn) {
|
||||
if (
|
||||
!(
|
||||
j$.private.isFunction(fn) ||
|
||||
j$.private.isAsyncFunction(fn) ||
|
||||
j$.private.isGeneratorFunction(fn)
|
||||
private$.isFunction(fn) ||
|
||||
private$.isAsyncFunction(fn) ||
|
||||
private$.isGeneratorFunction(fn)
|
||||
)
|
||||
) {
|
||||
throw new Error(
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().StackClearer = function(j$) {
|
||||
getJasmineRequireObj().StackClearer = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const maxInlineCallCount = 10;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().StackTrace = function(j$) {
|
||||
getJasmineRequireObj().StackTrace = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function StackTrace(error) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Suite = function(j$) {
|
||||
getJasmineRequireObj().Suite = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class Suite {
|
||||
@@ -37,10 +37,10 @@ getJasmineRequireObj().Suite = function(j$) {
|
||||
// Key and value will eventually be cloned during reporting. The error
|
||||
// thrown at that point if they aren't cloneable isn't very helpful.
|
||||
// Throw a better one now.
|
||||
if (!j$.private.isString(key)) {
|
||||
if (!private$.isString(key)) {
|
||||
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[key] = value;
|
||||
@@ -217,18 +217,18 @@ getJasmineRequireObj().Suite = function(j$) {
|
||||
if (!this.sharedContext) {
|
||||
this.sharedContext = this.parentSuite
|
||||
? this.parentSuite.clonedSharedUserContext()
|
||||
: new j$.private.UserContext();
|
||||
: new private$.UserContext();
|
||||
}
|
||||
|
||||
return this.sharedContext;
|
||||
}
|
||||
|
||||
clonedSharedUserContext() {
|
||||
return j$.private.UserContext.fromExisting(this.sharedUserContext());
|
||||
return private$.UserContext.fromExisting(this.sharedUserContext());
|
||||
}
|
||||
|
||||
handleException() {
|
||||
if (arguments[0] instanceof j$.private.errors.ExpectationFailed) {
|
||||
if (arguments[0] instanceof private$.errors.ExpectationFailed) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -237,7 +237,7 @@ getJasmineRequireObj().Suite = function(j$) {
|
||||
passed: false,
|
||||
error: arguments[0]
|
||||
};
|
||||
const failedExpectation = j$.private.buildExpectationResult(data);
|
||||
const failedExpectation = private$.buildExpectationResult(data);
|
||||
|
||||
if (!this.parentSuite) {
|
||||
failedExpectation.globalErrorType = 'afterAll';
|
||||
@@ -279,7 +279,7 @@ getJasmineRequireObj().Suite = function(j$) {
|
||||
return;
|
||||
}
|
||||
|
||||
const expectationResult = j$.private.buildExpectationResult(data);
|
||||
const expectationResult = private$.buildExpectationResult(data);
|
||||
|
||||
if (this.reportedDone) {
|
||||
this.onLateError(expectationResult);
|
||||
@@ -288,7 +288,7 @@ getJasmineRequireObj().Suite = function(j$) {
|
||||
}
|
||||
|
||||
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 };
|
||||
}
|
||||
this.#result.deprecationWarnings.push(
|
||||
j$.private.buildExpectationResult(deprecation)
|
||||
private$.buildExpectationResult(deprecation)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
getJasmineRequireObj().SuiteBuilder = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class SuiteBuilder {
|
||||
@@ -94,7 +94,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
ensureIsFunctionOrAsync(fn, 'fit');
|
||||
|
||||
if (timeout) {
|
||||
j$.private.util.validateTimeout(timeout);
|
||||
private$.util.validateTimeout(timeout);
|
||||
}
|
||||
const spec = this.specFactory_(description, fn, timeout, filename);
|
||||
this.currentDeclarationSuite_.addChild(spec);
|
||||
@@ -107,7 +107,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach');
|
||||
|
||||
if (timeout) {
|
||||
j$.private.util.validateTimeout(timeout);
|
||||
private$.util.validateTimeout(timeout);
|
||||
}
|
||||
|
||||
this.currentDeclarationSuite_.beforeEach({
|
||||
@@ -120,7 +120,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll');
|
||||
|
||||
if (timeout) {
|
||||
j$.private.util.validateTimeout(timeout);
|
||||
private$.util.validateTimeout(timeout);
|
||||
}
|
||||
|
||||
this.currentDeclarationSuite_.beforeAll({
|
||||
@@ -133,7 +133,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
ensureIsFunctionOrAsync(afterEachFunction, 'afterEach');
|
||||
|
||||
if (timeout) {
|
||||
j$.private.util.validateTimeout(timeout);
|
||||
private$.util.validateTimeout(timeout);
|
||||
}
|
||||
|
||||
afterEachFunction.isCleanup = true;
|
||||
@@ -147,7 +147,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
ensureIsFunctionOrAsync(afterAllFunction, 'afterAll');
|
||||
|
||||
if (timeout) {
|
||||
j$.private.util.validateTimeout(timeout);
|
||||
private$.util.validateTimeout(timeout);
|
||||
}
|
||||
|
||||
this.currentDeclarationSuite_.afterAll({
|
||||
@@ -158,7 +158,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
|
||||
it_(description, fn, timeout, filename) {
|
||||
if (timeout) {
|
||||
j$.private.util.validateTimeout(timeout);
|
||||
private$.util.validateTimeout(timeout);
|
||||
}
|
||||
|
||||
this.checkDuplicate_(description, 'spec');
|
||||
@@ -197,7 +197,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
const parentSuite = this.currentDeclarationSuite_;
|
||||
const reportedParentSuiteId =
|
||||
parentSuite === this.topSuite ? null : parentSuite.id;
|
||||
return new j$.private.Suite({
|
||||
return new private$.Suite({
|
||||
id: 'suite' + this.nextSuiteId_++,
|
||||
description,
|
||||
filename,
|
||||
@@ -239,7 +239,7 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
const config = this.env_.configuration();
|
||||
const suite = this.currentDeclarationSuite_;
|
||||
const parentSuiteId = suite === this.topSuite ? null : suite.id;
|
||||
const spec = new j$.private.Spec({
|
||||
const spec = new private$.Spec({
|
||||
id: 'spec' + this.nextSpecId_++,
|
||||
filename,
|
||||
parentSuiteId,
|
||||
@@ -302,21 +302,21 @@ getJasmineRequireObj().SuiteBuilder = function(j$) {
|
||||
}
|
||||
|
||||
function ensureIsFunction(fn, caller) {
|
||||
if (!j$.private.isFunction(fn)) {
|
||||
if (!private$.isFunction(fn)) {
|
||||
throw new Error(
|
||||
caller +
|
||||
' expects a function argument; received ' +
|
||||
j$.private.getType(fn)
|
||||
private$.getType(fn)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function ensureIsFunctionOrAsync(fn, caller) {
|
||||
if (!j$.private.isFunction(fn) && !j$.private.isAsyncFunction(fn)) {
|
||||
if (!private$.isFunction(fn) && !private$.isAsyncFunction(fn)) {
|
||||
throw new Error(
|
||||
caller +
|
||||
' expects a function argument; received ' +
|
||||
j$.private.getType(fn)
|
||||
private$.getType(fn)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,11 @@ getJasmineRequireObj().Timer = function() {
|
||||
this.elapsed = function() {
|
||||
return now() - startTime;
|
||||
};
|
||||
|
||||
Object.freeze(this);
|
||||
}
|
||||
|
||||
Object.freeze(Timer);
|
||||
Object.freeze(Timer.prototype);
|
||||
return Timer;
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().TreeProcessor = function(j$) {
|
||||
getJasmineRequireObj().TreeProcessor = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
const defaultMin = Infinity;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().TreeRunner = function(j$) {
|
||||
getJasmineRequireObj().TreeRunner = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class TreeRunner {
|
||||
@@ -83,14 +83,14 @@ getJasmineRequireObj().TreeRunner = function(j$) {
|
||||
},
|
||||
onComplete: () => {
|
||||
if (spec.status() === 'failed') {
|
||||
specOverallDone(new j$.private.StopExecutionError('spec failed'));
|
||||
specOverallDone(new private$.StopExecutionError('spec failed'));
|
||||
} else {
|
||||
specOverallDone();
|
||||
}
|
||||
},
|
||||
userContext: spec.userContext(),
|
||||
runnableName: spec.getFullName.bind(spec),
|
||||
SkipPolicy: j$.private.CompleteOnFirstErrorSkipPolicy
|
||||
SkipPolicy: private$.CompleteOnFirstErrorSkipPolicy
|
||||
});
|
||||
}
|
||||
|
||||
@@ -265,7 +265,7 @@ getJasmineRequireObj().TreeRunner = function(j$) {
|
||||
|
||||
async #reportChildrenOfBeforeAllFailure(suite) {
|
||||
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.#reportChildrenOfBeforeAllFailure(child);
|
||||
await this.#reportDispatcher.suiteDone(child.doneEvent());
|
||||
@@ -280,9 +280,9 @@ getJasmineRequireObj().TreeRunner = function(j$) {
|
||||
|
||||
#suiteSkipPolicy() {
|
||||
if (this.#getConfig().stopOnSpecFailure) {
|
||||
return j$.private.CompleteOnFirstErrorSkipPolicy;
|
||||
return private$.CompleteOnFirstErrorSkipPolicy;
|
||||
} else {
|
||||
return j$.private.SkipAfterBeforeAllErrorPolicy;
|
||||
return private$.SkipAfterBeforeAllErrorPolicy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().UserContext = function(j$) {
|
||||
getJasmineRequireObj().UserContext = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function UserContext() {}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().AllOf = function(j$) {
|
||||
getJasmineRequireObj().AllOf = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function AllOf() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Any = function(j$) {
|
||||
getJasmineRequireObj().Any = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function Any(expectedObject) {
|
||||
@@ -40,7 +40,7 @@ getJasmineRequireObj().Any = function(j$) {
|
||||
};
|
||||
|
||||
Any.prototype.jasmineToString = function() {
|
||||
return '<jasmine.any(' + j$.private.fnNameFor(this.expectedObject) + ')>';
|
||||
return '<jasmine.any(' + private$.fnNameFor(this.expectedObject) + ')>';
|
||||
};
|
||||
|
||||
return Any;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Anything = function(j$) {
|
||||
getJasmineRequireObj().Anything = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function Anything() {}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().ArrayContaining = function(j$) {
|
||||
getJasmineRequireObj().ArrayContaining = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function ArrayContaining(sample) {
|
||||
@@ -9,7 +9,7 @@ getJasmineRequireObj().ArrayContaining = function(j$) {
|
||||
if (!Array.isArray(this.sample)) {
|
||||
throw new Error(
|
||||
'You must provide an array to arrayContaining, not ' +
|
||||
j$.private.basicPrettyPrinter(this.sample) +
|
||||
private$.basicPrettyPrinter(this.sample) +
|
||||
'.'
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().ArrayWithExactContents = function(j$) {
|
||||
getJasmineRequireObj().ArrayWithExactContents = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function ArrayWithExactContents(sample) {
|
||||
@@ -12,7 +12,7 @@ getJasmineRequireObj().ArrayWithExactContents = function(j$) {
|
||||
if (!Array.isArray(this.sample)) {
|
||||
throw new Error(
|
||||
'You must provide an array to arrayWithExactContents, not ' +
|
||||
j$.private.basicPrettyPrinter(this.sample) +
|
||||
private$.basicPrettyPrinter(this.sample) +
|
||||
'.'
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
getJasmineRequireObj().Empty = function(j$) {
|
||||
getJasmineRequireObj().Empty = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function Empty() {}
|
||||
|
||||
Empty.prototype.asymmetricMatch = function(other) {
|
||||
if (
|
||||
j$.private.isString(other) ||
|
||||
private$.isString(other) ||
|
||||
Array.isArray(other) ||
|
||||
j$.private.isTypedArray(other)
|
||||
private$.isTypedArray(other)
|
||||
) {
|
||||
return other.length === 0;
|
||||
}
|
||||
|
||||
if (j$.private.isMap(other) || j$.private.isSet(other)) {
|
||||
if (private$.isMap(other) || private$.isSet(other)) {
|
||||
return other.size === 0;
|
||||
}
|
||||
|
||||
if (j$.private.isObject(other)) {
|
||||
if (private$.isObject(other)) {
|
||||
return Object.keys(other).length === 0;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Falsy = function(j$) {
|
||||
getJasmineRequireObj().Falsy = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function Falsy() {}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Is = function(j$) {
|
||||
getJasmineRequireObj().Is = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class Is {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
getJasmineRequireObj().MapContaining = function(j$) {
|
||||
getJasmineRequireObj().MapContaining = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function MapContaining(sample) {
|
||||
if (!j$.private.isMap(sample)) {
|
||||
if (!private$.isMap(sample)) {
|
||||
throw new Error(
|
||||
'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) {
|
||||
if (!j$.private.isMap(other)) {
|
||||
if (!private$.isMap(other)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
getJasmineRequireObj().NotEmpty = function(j$) {
|
||||
getJasmineRequireObj().NotEmpty = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function NotEmpty() {}
|
||||
|
||||
NotEmpty.prototype.asymmetricMatch = function(other) {
|
||||
if (
|
||||
j$.private.isString(other) ||
|
||||
private$.isString(other) ||
|
||||
Array.isArray(other) ||
|
||||
j$.private.isTypedArray(other)
|
||||
private$.isTypedArray(other)
|
||||
) {
|
||||
return other.length !== 0;
|
||||
}
|
||||
|
||||
if (j$.private.isMap(other) || j$.private.isSet(other)) {
|
||||
if (private$.isMap(other) || private$.isSet(other)) {
|
||||
return other.size !== 0;
|
||||
}
|
||||
|
||||
if (j$.private.isObject(other)) {
|
||||
if (private$.isObject(other)) {
|
||||
return Object.keys(other).length !== 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().ObjectContaining = function(j$) {
|
||||
getJasmineRequireObj().ObjectContaining = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function ObjectContaining(sample) {
|
||||
@@ -42,7 +42,7 @@ getJasmineRequireObj().ObjectContaining = function(j$) {
|
||||
};
|
||||
|
||||
ObjectContaining.prototype.valuesForDiff_ = function(other, pp) {
|
||||
if (!j$.private.isObject(other)) {
|
||||
if (!private$.isObject(other)) {
|
||||
return {
|
||||
self: this.jasmineToString(pp),
|
||||
other: other
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
getJasmineRequireObj().SetContaining = function(j$) {
|
||||
getJasmineRequireObj().SetContaining = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function SetContaining(sample) {
|
||||
if (!j$.private.isSet(sample)) {
|
||||
if (!private$.isSet(sample)) {
|
||||
throw new Error(
|
||||
'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) {
|
||||
if (!j$.private.isSet(other)) {
|
||||
if (!private$.isSet(other)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
getJasmineRequireObj().StringContaining = function(j$) {
|
||||
getJasmineRequireObj().StringContaining = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function StringContaining(expected) {
|
||||
if (!j$.private.isString(expected)) {
|
||||
if (!private$.isString(expected)) {
|
||||
throw new Error('Expected is not a String');
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ getJasmineRequireObj().StringContaining = function(j$) {
|
||||
}
|
||||
|
||||
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.
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
getJasmineRequireObj().StringMatching = function(j$) {
|
||||
getJasmineRequireObj().StringMatching = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
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');
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().Truthy = function(j$) {
|
||||
getJasmineRequireObj().Truthy = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function Truthy() {}
|
||||
|
||||
123
src/core/base.js
123
src/core/base.js
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
getJasmineRequireObj().base = function(j$, private$, jasmineGlobal) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@@ -22,7 +22,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
* Maximum number of characters to display when pretty printing objects.
|
||||
* Characters past this number will be ellipised.
|
||||
* @name jasmine.MAX_PRETTY_PRINT_CHARS
|
||||
* @default 100
|
||||
* @default 1000
|
||||
* @since 2.9.0
|
||||
*/
|
||||
j$.MAX_PRETTY_PRINT_CHARS = 1000;
|
||||
@@ -43,11 +43,12 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
*/
|
||||
let DEFAULT_TIMEOUT_INTERVAL = 5000;
|
||||
Object.defineProperty(j$, 'DEFAULT_TIMEOUT_INTERVAL', {
|
||||
enumerable: true,
|
||||
get: function() {
|
||||
return DEFAULT_TIMEOUT_INTERVAL;
|
||||
},
|
||||
set: function(newValue) {
|
||||
j$.private.util.validateTimeout(
|
||||
private$.util.validateTimeout(
|
||||
newValue,
|
||||
'jasmine.DEFAULT_TIMEOUT_INTERVAL'
|
||||
);
|
||||
@@ -70,58 +71,58 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
Object.defineProperty(j$, 'getEnv', {
|
||||
enumerable: true,
|
||||
value: function(options) {
|
||||
const env = (j$.private.currentEnv_ =
|
||||
j$.private.currentEnv_ || new j$.private.Env(options));
|
||||
const env = (private$.currentEnv_ =
|
||||
private$.currentEnv_ || new private$.Env(options));
|
||||
//jasmine. singletons in here (setTimeout blah blah).
|
||||
return env;
|
||||
}
|
||||
});
|
||||
|
||||
j$.private.isObject = function(value) {
|
||||
private$.isObject = function(value) {
|
||||
return (
|
||||
value !== undefined && value !== null && j$.private.isA('Object', value)
|
||||
value !== undefined && value !== null && private$.isA('Object', value)
|
||||
);
|
||||
};
|
||||
|
||||
j$.private.isString = function(value) {
|
||||
return j$.private.isA('String', value);
|
||||
private$.isString = function(value) {
|
||||
return private$.isA('String', value);
|
||||
};
|
||||
|
||||
j$.private.isNumber = function(value) {
|
||||
return j$.private.isA('Number', value);
|
||||
private$.isNumber = function(value) {
|
||||
return private$.isA('Number', value);
|
||||
};
|
||||
|
||||
j$.private.isFunction = function(value) {
|
||||
return j$.private.isA('Function', value);
|
||||
private$.isFunction = function(value) {
|
||||
return private$.isA('Function', value);
|
||||
};
|
||||
|
||||
j$.private.isAsyncFunction = function(value) {
|
||||
return j$.private.isA('AsyncFunction', value);
|
||||
private$.isAsyncFunction = function(value) {
|
||||
return private$.isA('AsyncFunction', value);
|
||||
};
|
||||
|
||||
j$.private.isGeneratorFunction = function(value) {
|
||||
return j$.private.isA('GeneratorFunction', value);
|
||||
private$.isGeneratorFunction = function(value) {
|
||||
return private$.isA('GeneratorFunction', value);
|
||||
};
|
||||
|
||||
j$.private.isTypedArray = function(value) {
|
||||
private$.isTypedArray = function(value) {
|
||||
return (
|
||||
j$.private.isA('Float32Array', value) ||
|
||||
j$.private.isA('Float64Array', value) ||
|
||||
j$.private.isA('Int16Array', value) ||
|
||||
j$.private.isA('Int32Array', value) ||
|
||||
j$.private.isA('Int8Array', value) ||
|
||||
j$.private.isA('Uint16Array', value) ||
|
||||
j$.private.isA('Uint32Array', value) ||
|
||||
j$.private.isA('Uint8Array', value) ||
|
||||
j$.private.isA('Uint8ClampedArray', value)
|
||||
private$.isA('Float32Array', value) ||
|
||||
private$.isA('Float64Array', value) ||
|
||||
private$.isA('Int16Array', value) ||
|
||||
private$.isA('Int32Array', value) ||
|
||||
private$.isA('Int8Array', value) ||
|
||||
private$.isA('Uint16Array', value) ||
|
||||
private$.isA('Uint32Array', value) ||
|
||||
private$.isA('Uint8Array', value) ||
|
||||
private$.isA('Uint8ClampedArray', value)
|
||||
);
|
||||
};
|
||||
|
||||
j$.private.isA = function(typeName, value) {
|
||||
return j$.private.getType(value) === '[object ' + typeName + ']';
|
||||
private$.isA = function(typeName, value) {
|
||||
return private$.getType(value) === '[object ' + typeName + ']';
|
||||
};
|
||||
|
||||
j$.private.isError = function(value) {
|
||||
private$.isError = function(value) {
|
||||
if (!value) {
|
||||
return false;
|
||||
}
|
||||
@@ -133,15 +134,15 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
return typeof value.stack === 'string' && typeof value.message === 'string';
|
||||
};
|
||||
|
||||
j$.private.isAsymmetricEqualityTester = function(obj) {
|
||||
return obj ? j$.private.isA('Function', obj.asymmetricMatch) : false;
|
||||
private$.isAsymmetricEqualityTester = function(obj) {
|
||||
return obj ? private$.isA('Function', obj.asymmetricMatch) : false;
|
||||
};
|
||||
|
||||
j$.private.getType = function(value) {
|
||||
private$.getType = function(value) {
|
||||
return Object.prototype.toString.apply(value);
|
||||
};
|
||||
|
||||
j$.private.isDomNode = function(obj) {
|
||||
private$.isDomNode = function(obj) {
|
||||
// Node is a function, because constructors
|
||||
return typeof jasmineGlobal.Node !== 'undefined'
|
||||
? obj instanceof jasmineGlobal.Node
|
||||
@@ -152,7 +153,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
// return obj.nodeType > 0;
|
||||
};
|
||||
|
||||
j$.private.isMap = function(obj) {
|
||||
private$.isMap = function(obj) {
|
||||
return (
|
||||
obj !== null &&
|
||||
typeof obj !== 'undefined' &&
|
||||
@@ -160,7 +161,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
);
|
||||
};
|
||||
|
||||
j$.private.isSet = function(obj) {
|
||||
private$.isSet = function(obj) {
|
||||
return (
|
||||
obj !== null &&
|
||||
typeof obj !== 'undefined' &&
|
||||
@@ -168,7 +169,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
);
|
||||
};
|
||||
|
||||
j$.private.isWeakMap = function(obj) {
|
||||
private$.isWeakMap = function(obj) {
|
||||
return (
|
||||
obj !== null &&
|
||||
typeof obj !== 'undefined' &&
|
||||
@@ -176,7 +177,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
);
|
||||
};
|
||||
|
||||
j$.private.isURL = function(obj) {
|
||||
private$.isURL = function(obj) {
|
||||
return (
|
||||
obj !== null &&
|
||||
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];
|
||||
};
|
||||
|
||||
j$.private.isDataView = function(obj) {
|
||||
private$.isDataView = function(obj) {
|
||||
return (
|
||||
obj !== null &&
|
||||
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;
|
||||
};
|
||||
|
||||
j$.private.isPromiseLike = function(obj) {
|
||||
return !!obj && j$.private.isFunction(obj.then);
|
||||
private$.isPromiseLike = function(obj) {
|
||||
return !!obj && private$.isFunction(obj.then);
|
||||
};
|
||||
|
||||
j$.private.fnNameFor = function(func) {
|
||||
private$.fnNameFor = function(func) {
|
||||
if (func.name) {
|
||||
return func.name;
|
||||
}
|
||||
@@ -216,7 +217,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
return matches ? matches[1] : '<anonymous>';
|
||||
};
|
||||
|
||||
j$.private.isPending = function(promise) {
|
||||
private$.isPending = function(promise) {
|
||||
const sentinel = {};
|
||||
return Promise.race([promise, Promise.resolve(sentinel)]).then(
|
||||
function(result) {
|
||||
@@ -251,7 +252,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
* @param {Constructor} clazz - The constructor to check against.
|
||||
*/
|
||||
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
|
||||
*/
|
||||
j$.anything = function() {
|
||||
return new j$.private.Anything();
|
||||
return new private$.Anything();
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -275,7 +276,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
* @function
|
||||
*/
|
||||
j$.truthy = function() {
|
||||
return new j$.private.Truthy();
|
||||
return new private$.Truthy();
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -288,7 +289,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
* @function
|
||||
*/
|
||||
j$.falsy = function() {
|
||||
return new j$.private.Falsy();
|
||||
return new private$.Falsy();
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -300,7 +301,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
||||
* @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.
|
||||
*/
|
||||
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
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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
|
||||
*/
|
||||
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
|
||||
*/
|
||||
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
|
||||
*/
|
||||
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
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
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 (
|
||||
putativeSpy.and instanceof j$.private.SpyStrategy &&
|
||||
putativeSpy.calls instanceof j$.private.CallTracker
|
||||
putativeSpy.and instanceof private$.SpyStrategy &&
|
||||
putativeSpy.calls instanceof private$.CallTracker
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//TODO: expectation result may make more sense as a presentation of an expectation.
|
||||
getJasmineRequireObj().buildExpectationResult = function(j$) {
|
||||
getJasmineRequireObj().buildExpectationResult = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
function buildExpectationResult(options) {
|
||||
const exceptionFormatter = new j$.private.ExceptionFormatter();
|
||||
const exceptionFormatter = new private$.ExceptionFormatter();
|
||||
|
||||
/**
|
||||
* Describes the result of evaluating an expectation
|
||||
@@ -33,7 +33,7 @@ getJasmineRequireObj().buildExpectationResult = function(j$) {
|
||||
}
|
||||
|
||||
if (!result.passed) {
|
||||
if (options.error && !j$.private.isString(options.error)) {
|
||||
if (options.error && !private$.isString(options.error)) {
|
||||
if ('code' in options.error) {
|
||||
result.code = options.error.code;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
@@ -1,12 +1,12 @@
|
||||
getJasmineRequireObj().DiffBuilder = function(j$) {
|
||||
getJasmineRequireObj().DiffBuilder = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class DiffBuilder {
|
||||
constructor(config) {
|
||||
this.prettyPrinter_ =
|
||||
(config || {}).prettyPrinter || j$.private.makePrettyPrinter();
|
||||
this.mismatches_ = new j$.private.MismatchTree();
|
||||
this.path_ = new j$.private.ObjectPath();
|
||||
(config || {}).prettyPrinter || private$.makePrettyPrinter();
|
||||
this.mismatches_ = new private$.MismatchTree();
|
||||
this.path_ = new private$.ObjectPath();
|
||||
this.actualRoot_ = undefined;
|
||||
this.expectedRoot_ = undefined;
|
||||
}
|
||||
@@ -67,8 +67,8 @@ getJasmineRequireObj().DiffBuilder = function(j$) {
|
||||
|
||||
const handleAsymmetricExpected = () => {
|
||||
if (
|
||||
j$.private.isAsymmetricEqualityTester(expected) &&
|
||||
j$.private.isFunction(expected.valuesForDiff_)
|
||||
private$.isAsymmetricEqualityTester(expected) &&
|
||||
private$.isFunction(expected.valuesForDiff_)
|
||||
) {
|
||||
const asymmetricResult = expected.valuesForDiff_(
|
||||
actual,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().MismatchTree = function(j$) {
|
||||
getJasmineRequireObj().MismatchTree = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
/*
|
||||
@@ -10,7 +10,7 @@ getJasmineRequireObj().MismatchTree = function(j$) {
|
||||
*/
|
||||
class MismatchTree {
|
||||
constructor(path) {
|
||||
this.path = path || new j$.private.ObjectPath([]);
|
||||
this.path = path || new private$.ObjectPath([]);
|
||||
this.formatter = undefined;
|
||||
this.children = [];
|
||||
this.isMismatch = false;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().NullDiffBuilder = function(j$) {
|
||||
getJasmineRequireObj().NullDiffBuilder = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
return function() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().ObjectPath = function(j$) {
|
||||
getJasmineRequireObj().ObjectPath = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
class ObjectPath {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
getJasmineRequireObj().toBePending = function(j$) {
|
||||
getJasmineRequireObj().toBePending = function(j$, private$) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@@ -13,7 +13,7 @@ getJasmineRequireObj().toBePending = function(j$) {
|
||||
return function toBePending() {
|
||||
return {
|
||||
compare: function(actual) {
|
||||
if (!j$.private.isPromiseLike(actual)) {
|
||||
if (!private$.isPromiseLike(actual)) {
|
||||
throw new Error(
|
||||
`Expected toBePending 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
Reference in New Issue
Block a user