jasmine
Advanced tools
Comparing version 4.2.1 to 4.3.0
@@ -56,3 +56,3 @@ const path = require('path'); | ||
} else { | ||
await runJasmine(jasmine, env, print); | ||
await runJasmine(jasmine, env); | ||
} | ||
@@ -80,4 +80,3 @@ } | ||
for (let i in argv) { | ||
const arg = argv[i]; | ||
for (const arg of argv) { | ||
if (arg === '--no-color') { | ||
@@ -111,51 +110,52 @@ color = false; | ||
} | ||
return { | ||
color: color, | ||
configPath: configPath, | ||
filter: filter, | ||
failFast: failFast, | ||
helpers: helpers, | ||
requires: requires, | ||
reporter: reporter, | ||
files: files, | ||
random: random, | ||
seed: seed, | ||
unknownOptions: unknownOptions | ||
color, | ||
configPath, | ||
filter, | ||
failFast, | ||
helpers, | ||
requires, | ||
reporter, | ||
files, | ||
random, | ||
seed, | ||
unknownOptions | ||
}; | ||
} | ||
async function runJasmine(jasmine, env, print) { | ||
await jasmine.loadConfigFile(env.configPath || process.env.JASMINE_CONFIG_PATH); | ||
async function runJasmine(jasmine, options) { | ||
await jasmine.loadConfigFile(options.configPath || process.env.JASMINE_CONFIG_PATH); | ||
if (env.failFast !== undefined) { | ||
if (options.failFast !== undefined) { | ||
jasmine.env.configure({ | ||
stopSpecOnExpectationFailure: env.failFast, | ||
stopOnSpecFailure: env.failFast | ||
stopSpecOnExpectationFailure: options.failFast, | ||
stopOnSpecFailure: options.failFast | ||
}); | ||
} | ||
if (env.seed !== undefined) { | ||
jasmine.seed(env.seed); | ||
if (options.seed !== undefined) { | ||
jasmine.seed(options.seed); | ||
} | ||
if (env.random !== undefined) { | ||
jasmine.randomizeTests(env.random); | ||
if (options.random !== undefined) { | ||
jasmine.randomizeTests(options.random); | ||
} | ||
if (env.helpers !== undefined && env.helpers.length) { | ||
jasmine.addMatchingHelperFiles(env.helpers); | ||
if (options.helpers !== undefined && options.helpers.length) { | ||
jasmine.addMatchingHelperFiles(options.helpers); | ||
} | ||
if (env.requires !== undefined && env.requires.length) { | ||
jasmine.addRequires(env.requires); | ||
if (options.requires !== undefined && options.requires.length) { | ||
jasmine.addRequires(options.requires); | ||
} | ||
if (env.reporter !== undefined) { | ||
await registerReporter(env.reporter, jasmine); | ||
if (options.reporter !== undefined) { | ||
await registerReporter(options.reporter, jasmine); | ||
} | ||
jasmine.showColors(env.color); | ||
jasmine.showColors(options.color); | ||
try { | ||
await jasmine.execute(env.files, env.filter); | ||
await jasmine.execute(options.files, options.filter); | ||
} catch (error) { | ||
@@ -162,0 +162,0 @@ console.error(error); |
@@ -8,5 +8,2 @@ const path = require('path'); | ||
module.exports = Jasmine; | ||
module.exports.ConsoleReporter = require('./reporters/console_reporter'); | ||
/** | ||
@@ -45,327 +42,445 @@ * Options for the {@link Jasmine} constructor | ||
*/ | ||
function Jasmine(options) { | ||
options = options || {}; | ||
this.loader = options.loader || new Loader(); | ||
const jasmineCore = options.jasmineCore || require('jasmine-core'); | ||
class Jasmine { | ||
constructor(options) { | ||
options = options || {}; | ||
this.loader = options.loader || new Loader(); | ||
const jasmineCore = options.jasmineCore || require('jasmine-core'); | ||
if (options.globals === false) { | ||
this.jasmine = jasmineCore.noGlobals().jasmine; | ||
} else { | ||
this.jasmine = jasmineCore.boot(jasmineCore); | ||
if (options.globals === false) { | ||
this.jasmine = jasmineCore.noGlobals().jasmine; | ||
} else { | ||
this.jasmine = jasmineCore.boot(jasmineCore); | ||
} | ||
this.projectBaseDir = options.projectBaseDir || path.resolve(); | ||
this.specDir = ''; | ||
this.specFiles = []; | ||
this.helperFiles = []; | ||
this.requires = []; | ||
/** | ||
* The Jasmine environment. | ||
* @name Jasmine#env | ||
* @readonly | ||
* @see {@link https://jasmine.github.io/api/edge/Env.html|Env} | ||
* @type {Env} | ||
*/ | ||
this.env = this.jasmine.getEnv({suppressLoadErrors: true}); | ||
this.reportersCount = 0; | ||
this.exit = process.exit; | ||
this.showingColors = true; | ||
this.alwaysListPendingSpecs_ = true; | ||
this.reporter = new module.exports.ConsoleReporter(); | ||
this.addReporter(this.reporter); | ||
this.defaultReporterConfigured = false; | ||
/** | ||
* @function | ||
* @name Jasmine#coreVersion | ||
* @return {string} The version of jasmine-core in use | ||
*/ | ||
this.coreVersion = function() { | ||
return jasmineCore.version(); | ||
}; | ||
/** | ||
* Whether to cause the Node process to exit when the suite finishes executing. | ||
* | ||
* @name Jasmine#exitOnCompletion | ||
* @type {boolean} | ||
* @default true | ||
*/ | ||
this.exitOnCompletion = true; | ||
} | ||
this.projectBaseDir = options.projectBaseDir || path.resolve(); | ||
this.specDir = ''; | ||
this.specFiles = []; | ||
this.helperFiles = []; | ||
this.requires = []; | ||
/** | ||
* The Jasmine environment. | ||
* @name Jasmine#env | ||
* @readonly | ||
* @see {@link https://jasmine.github.io/api/edge/Env.html|Env} | ||
* @type {Env} | ||
* Sets whether to randomize the order of specs. | ||
* @function | ||
* @name Jasmine#randomizeTests | ||
* @param {boolean} value Whether to randomize | ||
*/ | ||
this.env = this.jasmine.getEnv({suppressLoadErrors: true}); | ||
this.reportersCount = 0; | ||
this.exit = process.exit; | ||
this.showingColors = true; | ||
this.reporter = new module.exports.ConsoleReporter(); | ||
this.addReporter(this.reporter); | ||
this.defaultReporterConfigured = false; | ||
randomizeTests(value) { | ||
this.env.configure({random: value}); | ||
} | ||
/** | ||
* Sets the random seed. | ||
* @function | ||
* @name Jasmine#coreVersion | ||
* @return {string} The version of jasmine-core in use | ||
* @name Jasmine#seed | ||
* @param {number} seed The random seed | ||
*/ | ||
this.coreVersion = function() { | ||
return jasmineCore.version(); | ||
}; | ||
seed(value) { | ||
this.env.configure({seed: value}); | ||
} | ||
/** | ||
* Whether to cause the Node process to exit when the suite finishes executing. | ||
* | ||
* @name Jasmine#exitOnCompletion | ||
* @type {boolean} | ||
* @default true | ||
* Sets whether to show colors in the console reporter. | ||
* @function | ||
* @name Jasmine#showColors | ||
* @param {boolean} value Whether to show colors | ||
*/ | ||
this.exitOnCompletion = true; | ||
} | ||
showColors(value) { | ||
this.showingColors = value; | ||
} | ||
/** | ||
* Sets whether to randomize the order of specs. | ||
* @function | ||
* @name Jasmine#randomizeTests | ||
* @param {boolean} value Whether to randomize | ||
*/ | ||
Jasmine.prototype.randomizeTests = function(value) { | ||
this.env.configure({random: value}); | ||
}; | ||
/** | ||
* Sets the random seed. | ||
* @function | ||
* @name Jasmine#seed | ||
* @param {number} seed The random seed | ||
*/ | ||
Jasmine.prototype.seed = function(value) { | ||
this.env.configure({seed: value}); | ||
}; | ||
/** | ||
* Sets whether to show colors in the console reporter. | ||
* @function | ||
* @name Jasmine#showColors | ||
* @param {boolean} value Whether to show colors | ||
*/ | ||
Jasmine.prototype.showColors = function(value) { | ||
this.showingColors = value; | ||
}; | ||
/** | ||
* Adds a spec file to the list that will be loaded when the suite is executed. | ||
* @function | ||
* @name Jasmine#addSpecFile | ||
* @param {string} filePath The path to the file to be loaded. | ||
*/ | ||
Jasmine.prototype.addSpecFile = function(filePath) { | ||
this.specFiles.push(filePath); | ||
}; | ||
/** | ||
* Adds a helper file to the list that will be loaded when the suite is executed. | ||
* @function | ||
* @name Jasmine#addHelperFile | ||
* @param {string} filePath The path to the file to be loaded. | ||
*/ | ||
Jasmine.prototype.addHelperFile = function(filePath) { | ||
this.helperFiles.push(filePath); | ||
}; | ||
/** | ||
* Add a custom reporter to the Jasmine environment. | ||
* @function | ||
* @name Jasmine#addReporter | ||
* @param {Reporter} reporter The reporter to add | ||
* @see custom_reporter | ||
*/ | ||
Jasmine.prototype.addReporter = function(reporter) { | ||
this.env.addReporter(reporter); | ||
this.reportersCount++; | ||
}; | ||
/** | ||
* Clears all registered reporters. | ||
* @function | ||
* @name Jasmine#clearReporters | ||
*/ | ||
Jasmine.prototype.clearReporters = function() { | ||
this.env.clearReporters(); | ||
this.reportersCount = 0; | ||
}; | ||
/** | ||
* Provide a fallback reporter if no other reporters have been specified. | ||
* @function | ||
* @name Jasmine#provideFallbackReporter | ||
* @param reporter The fallback reporter | ||
* @see custom_reporter | ||
*/ | ||
Jasmine.prototype.provideFallbackReporter = function(reporter) { | ||
this.env.provideFallbackReporter(reporter); | ||
}; | ||
/** | ||
* Configures the default reporter that is installed if no other reporter is | ||
* specified. | ||
* @param {ConsoleReporterOptions} options | ||
*/ | ||
Jasmine.prototype.configureDefaultReporter = function(options) { | ||
options.print = options.print || function() { | ||
process.stdout.write(util.format.apply(this, arguments)); | ||
}; | ||
options.showColors = options.hasOwnProperty('showColors') ? options.showColors : true; | ||
this.reporter.setOptions(options); | ||
this.defaultReporterConfigured = true; | ||
}; | ||
/** | ||
* Add custom matchers for the current scope of specs. | ||
* | ||
* _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. | ||
* @function | ||
* @name Jasmine#addMatchers | ||
* @param {Object} matchers - Keys from this object will be the new matcher names. | ||
* @see custom_matcher | ||
*/ | ||
Jasmine.prototype.addMatchers = function(matchers) { | ||
this.env.addMatchers(matchers); | ||
}; | ||
Jasmine.prototype.loadSpecs = async function() { | ||
await this._loadFiles(this.specFiles); | ||
}; | ||
Jasmine.prototype.loadHelpers = async function() { | ||
await this._loadFiles(this.helperFiles); | ||
}; | ||
Jasmine.prototype._loadFiles = async function(files) { | ||
for (const file of files) { | ||
await this.loader.load(file); | ||
/** | ||
* Sets whether the console reporter should list pending specs even when there | ||
* are failures. | ||
* @name Jasmine#alwaysListPendingSpecs | ||
* @param value {boolean} | ||
*/ | ||
alwaysListPendingSpecs(value) { | ||
this.alwaysListPendingSpecs_ = value; | ||
} | ||
}; | ||
Jasmine.prototype.loadRequires = async function() { | ||
await this._loadFiles(this.requires); | ||
}; | ||
/** | ||
* Loads configuration from the specified file. The file can be a JSON file or | ||
* any JS file that's loadable via require and provides a Jasmine config | ||
* as its default export. | ||
* @param {string} [configFilePath=spec/support/jasmine.json] | ||
* @return Promise | ||
*/ | ||
Jasmine.prototype.loadConfigFile = async function(configFilePath) { | ||
if (configFilePath) { | ||
await this.loadSpecificConfigFile_(configFilePath); | ||
} else { | ||
for (const ext of ['json', 'js']) { | ||
try { | ||
await this.loadSpecificConfigFile_(`spec/support/jasmine.${ext}`); | ||
} catch (e) { | ||
if (e.code !== 'MODULE_NOT_FOUND' && e.code !== 'ERR_MODULE_NOT_FOUND') { | ||
throw e; | ||
} | ||
} | ||
} | ||
/** | ||
* Adds a spec file to the list that will be loaded when the suite is executed. | ||
* @function | ||
* @name Jasmine#addSpecFile | ||
* @param {string} filePath The path to the file to be loaded. | ||
*/ | ||
addSpecFile(filePath) { | ||
this.specFiles.push(filePath); | ||
} | ||
}; | ||
Jasmine.prototype.loadSpecificConfigFile_ = async function(relativePath) { | ||
const absolutePath = path.resolve(this.projectBaseDir, relativePath); | ||
const config = await this.loader.load(absolutePath); | ||
this.loadConfig(config); | ||
}; | ||
/** | ||
* Loads configuration from the specified object. | ||
* @param {Configuration} config | ||
*/ | ||
Jasmine.prototype.loadConfig = function(config) { | ||
/** | ||
* @interface Configuration | ||
* Adds a helper file to the list that will be loaded when the suite is executed. | ||
* @function | ||
* @name Jasmine#addHelperFile | ||
* @param {string} filePath The path to the file to be loaded. | ||
*/ | ||
const envConfig = {...config.env}; | ||
addHelperFile(filePath) { | ||
this.helperFiles.push(filePath); | ||
} | ||
/** | ||
* The directory that spec files are contained in, relative to the project | ||
* base directory. | ||
* @name Configuration#spec_dir | ||
* @type string | undefined | ||
* Add a custom reporter to the Jasmine environment. | ||
* @function | ||
* @name Jasmine#addReporter | ||
* @param {Reporter} reporter The reporter to add | ||
* @see custom_reporter | ||
*/ | ||
this.specDir = config.spec_dir || this.specDir; | ||
addReporter(reporter) { | ||
this.env.addReporter(reporter); | ||
this.reportersCount++; | ||
} | ||
/** | ||
* Whether to fail specs that contain no expectations. | ||
* @name Configuration#failSpecWithNoExpectations | ||
* @type boolean | undefined | ||
* @default false | ||
* Clears all registered reporters. | ||
* @function | ||
* @name Jasmine#clearReporters | ||
*/ | ||
if (config.failSpecWithNoExpectations !== undefined) { | ||
envConfig.failSpecWithNoExpectations = config.failSpecWithNoExpectations; | ||
clearReporters() { | ||
this.env.clearReporters(); | ||
this.reportersCount = 0; | ||
} | ||
/** | ||
* Whether to stop each spec on the first expectation failure. | ||
* @name Configuration#stopSpecOnExpectationFailure | ||
* @type boolean | undefined | ||
* @default false | ||
* Provide a fallback reporter if no other reporters have been specified. | ||
* @function | ||
* @name Jasmine#provideFallbackReporter | ||
* @param reporter The fallback reporter | ||
* @see custom_reporter | ||
*/ | ||
if (config.stopSpecOnExpectationFailure !== undefined) { | ||
envConfig.stopSpecOnExpectationFailure = config.stopSpecOnExpectationFailure; | ||
provideFallbackReporter(reporter) { | ||
this.env.provideFallbackReporter(reporter); | ||
} | ||
/** | ||
* Whether to stop suite execution on the first spec failure. | ||
* @name Configuration#stopOnSpecFailure | ||
* @type boolean | undefined | ||
* @default false | ||
* Configures the default reporter that is installed if no other reporter is | ||
* specified. | ||
* @param {ConsoleReporterOptions} options | ||
*/ | ||
if (config.stopOnSpecFailure !== undefined) { | ||
envConfig.stopOnSpecFailure = config.stopOnSpecFailure; | ||
configureDefaultReporter(options) { | ||
options.print = options.print || function() { | ||
process.stdout.write(util.format.apply(this, arguments)); | ||
}; | ||
options.showColors = options.hasOwnProperty('showColors') ? options.showColors : true; | ||
this.reporter.setOptions(options); | ||
this.defaultReporterConfigured = true; | ||
} | ||
/** | ||
* Whether to run specs in a random order. | ||
* @name Configuration#random | ||
* @type boolean | undefined | ||
* @default true | ||
* Add custom matchers for the current scope of specs. | ||
* | ||
* _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. | ||
* @function | ||
* @name Jasmine#addMatchers | ||
* @param {Object} matchers - Keys from this object will be the new matcher names. | ||
* @see custom_matcher | ||
*/ | ||
if (config.random !== undefined) { | ||
envConfig.random = config.random; | ||
addMatchers(matchers) { | ||
this.env.addMatchers(matchers); | ||
} | ||
if (config.verboseDeprecations !== undefined) { | ||
envConfig.verboseDeprecations = config.verboseDeprecations; | ||
async loadSpecs() { | ||
await this._loadFiles(this.specFiles); | ||
} | ||
async loadHelpers() { | ||
await this._loadFiles(this.helperFiles); | ||
} | ||
async _loadFiles(files) { | ||
for (const file of files) { | ||
await this.loader.load(file); | ||
} | ||
} | ||
async loadRequires() { | ||
await this._loadFiles(this.requires); | ||
} | ||
/** | ||
* Specifies how to load files with names ending in .js. Valid values are | ||
* "require" and "import". "import" should be safe in all cases, and is | ||
* required if your project contains ES modules with filenames ending in .js. | ||
* @name Configuration#jsLoader | ||
* @type string | undefined | ||
* @default "require" | ||
* Loads configuration from the specified file. The file can be a JSON file or | ||
* any JS file that's loadable via require and provides a Jasmine config | ||
* as its default export. | ||
* @param {string} [configFilePath=spec/support/jasmine.json] | ||
* @return Promise | ||
*/ | ||
if (config.jsLoader === 'import' || config.jsLoader === undefined) { | ||
this.loader.alwaysImport = true; | ||
} else if (config.jsLoader === 'require') { | ||
this.loader.alwaysImport = false; | ||
} else { | ||
throw new Error(`"${config.jsLoader}" is not a valid value for the ` + | ||
'jsLoader configuration property. Valid values are "import", ' + | ||
'"require", and undefined.'); | ||
async loadConfigFile(configFilePath) { | ||
if (configFilePath) { | ||
await this.loadSpecificConfigFile_(configFilePath); | ||
} else { | ||
for (const ext of ['json', 'js']) { | ||
try { | ||
await this.loadSpecificConfigFile_(`spec/support/jasmine.${ext}`); | ||
} catch (e) { | ||
if (e.code !== 'MODULE_NOT_FOUND' && e.code !== 'ERR_MODULE_NOT_FOUND') { | ||
throw e; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
if (Object.keys(envConfig).length > 0) { | ||
this.env.configure(envConfig); | ||
async loadSpecificConfigFile_(relativePath) { | ||
const absolutePath = path.resolve(this.projectBaseDir, relativePath); | ||
const config = await this.loader.load(absolutePath); | ||
this.loadConfig(config); | ||
} | ||
/** | ||
* An array of helper file paths or {@link https://github.com/isaacs/node-glob#glob-primer|globs} | ||
* that match helper files. Each path or glob will be evaluated relative to | ||
* the spec directory. Helpers are loaded before specs. | ||
* @name Configuration#helpers | ||
* @type string[] | undefined | ||
* Loads configuration from the specified object. | ||
* @param {Configuration} config | ||
*/ | ||
if(config.helpers) { | ||
this.addMatchingHelperFiles(config.helpers); | ||
loadConfig(config) { | ||
/** | ||
* @interface Configuration | ||
*/ | ||
const envConfig = {...config.env}; | ||
/** | ||
* The directory that spec files are contained in, relative to the project | ||
* base directory. | ||
* @name Configuration#spec_dir | ||
* @type string | undefined | ||
*/ | ||
this.specDir = config.spec_dir || this.specDir; | ||
/** | ||
* Whether to fail specs that contain no expectations. | ||
* @name Configuration#failSpecWithNoExpectations | ||
* @type boolean | undefined | ||
* @default false | ||
*/ | ||
if (config.failSpecWithNoExpectations !== undefined) { | ||
envConfig.failSpecWithNoExpectations = config.failSpecWithNoExpectations; | ||
} | ||
/** | ||
* Whether to stop each spec on the first expectation failure. | ||
* @name Configuration#stopSpecOnExpectationFailure | ||
* @type boolean | undefined | ||
* @default false | ||
*/ | ||
if (config.stopSpecOnExpectationFailure !== undefined) { | ||
envConfig.stopSpecOnExpectationFailure = config.stopSpecOnExpectationFailure; | ||
} | ||
/** | ||
* Whether to stop suite execution on the first spec failure. | ||
* @name Configuration#stopOnSpecFailure | ||
* @type boolean | undefined | ||
* @default false | ||
*/ | ||
if (config.stopOnSpecFailure !== undefined) { | ||
envConfig.stopOnSpecFailure = config.stopOnSpecFailure; | ||
} | ||
/** | ||
* Whether the default reporter should list pending specs even if there are | ||
* failures. | ||
* @name Configuration#alwaysListPendingSpecs | ||
* @type boolean | undefined | ||
* @default false | ||
*/ | ||
if (config.alwaysListPendingSpecs !== undefined) { | ||
this.alwaysListPendingSpecs(config.alwaysListPendingSpecs); | ||
} | ||
/** | ||
* Whether to run specs in a random order. | ||
* @name Configuration#random | ||
* @type boolean | undefined | ||
* @default true | ||
*/ | ||
if (config.random !== undefined) { | ||
envConfig.random = config.random; | ||
} | ||
if (config.verboseDeprecations !== undefined) { | ||
envConfig.verboseDeprecations = config.verboseDeprecations; | ||
} | ||
/** | ||
* Specifies how to load files with names ending in .js. Valid values are | ||
* "require" and "import". "import" should be safe in all cases, and is | ||
* required if your project contains ES modules with filenames ending in .js. | ||
* @name Configuration#jsLoader | ||
* @type string | undefined | ||
* @default "require" | ||
*/ | ||
if (config.jsLoader === 'import' || config.jsLoader === undefined) { | ||
this.loader.alwaysImport = true; | ||
} else if (config.jsLoader === 'require') { | ||
this.loader.alwaysImport = false; | ||
} else { | ||
throw new Error(`"${config.jsLoader}" is not a valid value for the ` + | ||
'jsLoader configuration property. Valid values are "import", ' + | ||
'"require", and undefined.'); | ||
} | ||
if (Object.keys(envConfig).length > 0) { | ||
this.env.configure(envConfig); | ||
} | ||
/** | ||
* An array of helper file paths or {@link https://github.com/isaacs/node-glob#glob-primer|globs} | ||
* that match helper files. Each path or glob will be evaluated relative to | ||
* the spec directory. Helpers are loaded before specs. | ||
* @name Configuration#helpers | ||
* @type string[] | undefined | ||
*/ | ||
if(config.helpers) { | ||
this.addMatchingHelperFiles(config.helpers); | ||
} | ||
/** | ||
* An array of module names to load via require() at the start of execution. | ||
* @name Configuration#requires | ||
* @type string[] | undefined | ||
*/ | ||
if(config.requires) { | ||
this.addRequires(config.requires); | ||
} | ||
/** | ||
* An array of spec file paths or {@link https://github.com/isaacs/node-glob#glob-primer|globs} | ||
* that match helper files. Each path or glob will be evaluated relative to | ||
* the spec directory. | ||
* @name Configuration#spec_files | ||
* @type string[] | undefined | ||
*/ | ||
if(config.spec_files) { | ||
this.addMatchingSpecFiles(config.spec_files); | ||
} | ||
} | ||
addRequires(requires) { | ||
const jasmineRunner = this; | ||
requires.forEach(function(r) { | ||
jasmineRunner.requires.push(r); | ||
}); | ||
} | ||
/** | ||
* An array of module names to load via require() at the start of execution. | ||
* @name Configuration#requires | ||
* @type string[] | undefined | ||
* Sets whether to cause specs to only have one expectation failure. | ||
* @function | ||
* @name Jasmine#stopSpecOnExpectationFailure | ||
* @param {boolean} value Whether to cause specs to only have one expectation | ||
* failure | ||
*/ | ||
if(config.requires) { | ||
this.addRequires(config.requires); | ||
stopSpecOnExpectationFailure(value) { | ||
this.env.configure({stopSpecOnExpectationFailure: value}); | ||
} | ||
/** | ||
* An array of spec file paths or {@link https://github.com/isaacs/node-glob#glob-primer|globs} | ||
* that match helper files. Each path or glob will be evaluated relative to | ||
* the spec directory. | ||
* @name Configuration#spec_files | ||
* @type string[] | undefined | ||
* Sets whether to stop execution of the suite after the first spec failure. | ||
* @function | ||
* @name Jasmine#stopOnSpecFailure | ||
* @param {boolean} value Whether to stop execution of the suite after the | ||
* first spec failure | ||
*/ | ||
if(config.spec_files) { | ||
this.addMatchingSpecFiles(config.spec_files); | ||
stopOnSpecFailure(value) { | ||
this.env.configure({stopOnSpecFailure: value}); | ||
} | ||
}; | ||
async flushOutput() { | ||
// Ensure that all data has been written to stdout and stderr, | ||
// then exit with an appropriate status code. Otherwise, we | ||
// might exit before all previous writes have actually been | ||
// written when Jasmine is piped to another process that isn't | ||
// reading quickly enough. | ||
var streams = [process.stdout, process.stderr]; | ||
var promises = streams.map(stream => { | ||
return new Promise(resolve => stream.write('', null, resolve)); | ||
}); | ||
return Promise.all(promises); | ||
} | ||
/** | ||
* Runs the test suite. | ||
* | ||
* _Note_: Set {@link Jasmine#exitOnCompletion|exitOnCompletion} to false if you | ||
* intend to use the returned promise. Otherwise, the Node process will | ||
* ordinarily exit before the promise is settled. | ||
* @param {Array.<string>} [files] Spec files to run instead of the previously | ||
* configured set | ||
* @param {string} [filterString] Regex used to filter specs. If specified, only | ||
* specs with matching full names will be run. | ||
* @return {Promise<JasmineDoneInfo>} Promise that is resolved when the suite completes. | ||
*/ | ||
async execute(files, filterString) { | ||
await this.loadRequires(); | ||
await this.loadHelpers(); | ||
if (!this.defaultReporterConfigured) { | ||
this.configureDefaultReporter({ | ||
showColors: this.showingColors, | ||
alwaysListPendingSpecs: this.alwaysListPendingSpecs_ | ||
}); | ||
} | ||
if (filterString) { | ||
const specFilter = new ConsoleSpecFilter({ | ||
filterString: filterString | ||
}); | ||
this.env.configure({specFilter: function(spec) { | ||
return specFilter.matches(spec.getFullName()); | ||
}}); | ||
} | ||
if (files && files.length > 0) { | ||
this.specDir = ''; | ||
this.specFiles = []; | ||
this.addMatchingSpecFiles(files); | ||
} | ||
await this.loadSpecs(); | ||
const prematureExitHandler = new ExitHandler(() => this.exit(4)); | ||
prematureExitHandler.install(); | ||
const overallResult = await this.env.execute(); | ||
await this.flushOutput(); | ||
prematureExitHandler.uninstall(); | ||
if (this.exitOnCompletion) { | ||
this.exit(exitCodeForStatus(overallResult.overallStatus)); | ||
} | ||
return overallResult; | ||
} | ||
} | ||
/** | ||
@@ -390,9 +505,2 @@ * Adds files that match the specified patterns to the list of spec files. | ||
Jasmine.prototype.addRequires = function(requires) { | ||
const jasmineRunner = this; | ||
requires.forEach(function(r) { | ||
jasmineRunner.requires.push(r); | ||
}); | ||
}; | ||
function addFiles(kind) { | ||
@@ -436,86 +544,2 @@ return function (files) { | ||
/** | ||
* Sets whether to cause specs to only have one expectation failure. | ||
* @function | ||
* @name Jasmine#stopSpecOnExpectationFailure | ||
* @param {boolean} value Whether to cause specs to only have one expectation | ||
* failure | ||
*/ | ||
Jasmine.prototype.stopSpecOnExpectationFailure = function(value) { | ||
this.env.configure({stopSpecOnExpectationFailure: value}); | ||
}; | ||
/** | ||
* Sets whether to stop execution of the suite after the first spec failure. | ||
* @function | ||
* @name Jasmine#stopOnSpecFailure | ||
* @param {boolean} value Whether to stop execution of the suite after the | ||
* first spec failure | ||
*/ | ||
Jasmine.prototype.stopOnSpecFailure = function(value) { | ||
this.env.configure({stopOnSpecFailure: value}); | ||
}; | ||
Jasmine.prototype.flushOutput = async function() { | ||
// Ensure that all data has been written to stdout and stderr, | ||
// then exit with an appropriate status code. Otherwise, we | ||
// might exit before all previous writes have actually been | ||
// written when Jasmine is piped to another process that isn't | ||
// reading quickly enough. | ||
var streams = [process.stdout, process.stderr]; | ||
var promises = streams.map(stream => { | ||
return new Promise(resolve => stream.write('', null, resolve)); | ||
}); | ||
return Promise.all(promises); | ||
}; | ||
/** | ||
* Runs the test suite. | ||
* | ||
* _Note_: Set {@link Jasmine#exitOnCompletion|exitOnCompletion} to false if you | ||
* intend to use the returned promise. Otherwise, the Node process will | ||
* ordinarily exit before the promise is settled. | ||
* @param {Array.<string>} [files] Spec files to run instead of the previously | ||
* configured set | ||
* @param {string} [filterString] Regex used to filter specs. If specified, only | ||
* specs with matching full names will be run. | ||
* @return {Promise<JasmineDoneInfo>} Promise that is resolved when the suite completes. | ||
*/ | ||
Jasmine.prototype.execute = async function(files, filterString) { | ||
await this.loadRequires(); | ||
await this.loadHelpers(); | ||
if (!this.defaultReporterConfigured) { | ||
this.configureDefaultReporter({ showColors: this.showingColors }); | ||
} | ||
if (filterString) { | ||
const specFilter = new ConsoleSpecFilter({ | ||
filterString: filterString | ||
}); | ||
this.env.configure({specFilter: function(spec) { | ||
return specFilter.matches(spec.getFullName()); | ||
}}); | ||
} | ||
if (files && files.length > 0) { | ||
this.specDir = ''; | ||
this.specFiles = []; | ||
this.addMatchingSpecFiles(files); | ||
} | ||
await this.loadSpecs(); | ||
const prematureExitHandler = new ExitHandler(() => this.exit(4)); | ||
prematureExitHandler.install(); | ||
const overallResult = await this.env.execute(); | ||
await this.flushOutput(); | ||
prematureExitHandler.uninstall(); | ||
if (this.exitOnCompletion) { | ||
this.exit(exitCodeForStatus(overallResult.overallStatus)); | ||
} | ||
return overallResult; | ||
}; | ||
function exitCodeForStatus(status) { | ||
@@ -534,1 +558,4 @@ switch (status) { | ||
} | ||
module.exports = Jasmine; | ||
module.exports.ConsoleReporter = require('./reporters/console_reporter'); |
const path = require('path'); | ||
module.exports = Loader; | ||
function Loader(options) { | ||
options = options || {}; | ||
this.require_ = options.requireShim || requireShim; | ||
this.import_ = options.importShim || importShim; | ||
this.resolvePath_ = options.resolvePath || path.resolve.bind(path); | ||
this.alwaysImport = true; | ||
} | ||
class Loader { | ||
constructor(options) { | ||
options = options || {}; | ||
this.require_ = options.requireShim || requireShim; | ||
this.import_ = options.importShim || importShim; | ||
this.resolvePath_ = options.resolvePath || path.resolve.bind(path); | ||
this.alwaysImport = true; | ||
} | ||
Loader.prototype.load = function(modulePath) { | ||
if ((this.alwaysImport && !modulePath.endsWith('.json')) || modulePath.endsWith('.mjs')) { | ||
let importSpecifier; | ||
load(modulePath) { | ||
if ((this.alwaysImport && !modulePath.endsWith('.json')) || modulePath.endsWith('.mjs')) { | ||
let importSpecifier; | ||
if (modulePath.indexOf(path.sep) === -1 && modulePath.indexOf('/') === -1) { | ||
importSpecifier = modulePath; | ||
if (modulePath.indexOf(path.sep) === -1 && modulePath.indexOf('/') === -1) { | ||
importSpecifier = modulePath; | ||
} else { | ||
// The ES module spec requires import paths to be valid URLs. As of v14, | ||
// Node enforces this on Windows but not on other OSes. On OS X, import | ||
// paths that are URLs must not contain parent directory references. | ||
importSpecifier = `file://${this.resolvePath_(modulePath)}`; | ||
} | ||
return this.import_(importSpecifier) | ||
.then( | ||
mod => mod.default, | ||
e => { | ||
if (e.code === 'ERR_UNKNOWN_FILE_EXTENSION') { | ||
// Extension isn't supported by import, e.g. .jsx. Fall back to | ||
// require(). This could lead to confusing error messages if someone | ||
// tries to use ES module syntax without transpiling in a file with | ||
// an unsupported extension, but it shouldn't break anything and it | ||
// should work well in the normal case where the file is loadable | ||
// as a CommonJS module, either directly or with the help of a | ||
// loader like `@babel/register`. | ||
return this.require_(modulePath); | ||
} else { | ||
return Promise.reject(fixupImportException(e, modulePath)); | ||
} | ||
} | ||
); | ||
} else { | ||
// The ES module spec requires import paths to be valid URLs. As of v14, | ||
// Node enforces this on Windows but not on other OSes. On OS X, import | ||
// paths that are URLs must not contain parent directory references. | ||
importSpecifier = `file://${this.resolvePath_(modulePath)}`; | ||
return new Promise(resolve => { | ||
const result = this.require_(modulePath); | ||
resolve(result); | ||
}); | ||
} | ||
return this.import_(importSpecifier) | ||
.then( | ||
mod => mod.default, | ||
e => { | ||
if (e.code === 'ERR_UNKNOWN_FILE_EXTENSION') { | ||
// Extension isn't supported by import, e.g. .jsx. Fall back to | ||
// require(). This could lead to confusing error messages if someone | ||
// tries to use ES module syntax without transpiling in a file with | ||
// an unsupported extension, but it shouldn't break anything and it | ||
// should work well in the normal case where the file is loadable | ||
// as a CommonJS module, either directly or with the help of a | ||
// loader like `@babel/register`. | ||
return this.require_(modulePath); | ||
} else { | ||
return Promise.reject(fixupImportException(e, modulePath)); | ||
} | ||
} | ||
); | ||
} else { | ||
return new Promise(resolve => { | ||
const result = this.require_(modulePath); | ||
resolve(result); | ||
}); | ||
} | ||
}; | ||
} | ||
@@ -152,1 +153,3 @@ function requireShim(modulePath) { | ||
} | ||
module.exports = Loader; |
@@ -20,2 +20,3 @@ module.exports = exports = ConsoleReporter; | ||
pendingSpecs = [], | ||
alwaysListPendingSpecs = true, | ||
ansi = { | ||
@@ -64,2 +65,12 @@ green: '\x1B[32m', | ||
} | ||
/** | ||
* Whether to list pending specs even if there are failures. | ||
* @name ConsoleReporterOptions#alwaysListPendingSpecs | ||
* @type Boolean|undefined | ||
* @default true | ||
*/ | ||
if (options.alwaysListPendingSpecs !== undefined) { | ||
alwaysListPendingSpecs = options.alwaysListPendingSpecs; | ||
} | ||
}; | ||
@@ -101,8 +112,10 @@ | ||
if (pendingSpecs.length > 0) { | ||
print("Pending:"); | ||
if (alwaysListPendingSpecs || result.overallStatus === 'passed') { | ||
if (pendingSpecs.length > 0) { | ||
print("Pending:"); | ||
} | ||
for (let i = 0; i < pendingSpecs.length; i++) { | ||
pendingSpecDetails(pendingSpecs[i], i + 1); | ||
} | ||
} | ||
for (let i = 0; i < pendingSpecs.length; i++) { | ||
pendingSpecDetails(pendingSpecs[i], i + 1); | ||
} | ||
@@ -109,0 +122,0 @@ if(specCount > 0) { |
@@ -13,3 +13,3 @@ { | ||
"license": "MIT", | ||
"version": "4.2.1", | ||
"version": "4.3.0", | ||
"repository": { | ||
@@ -33,3 +33,3 @@ "type": "git", | ||
"glob": "^7.1.6", | ||
"jasmine-core": "^4.2.0" | ||
"jasmine-core": "^4.3.0" | ||
}, | ||
@@ -36,0 +36,0 @@ "bin": "./bin/jasmine.js", |
46106
1208
Updatedjasmine-core@^4.3.0