diff --git a/lib/jasmine-core/jasmine-html.js b/lib/jasmine-core/jasmine-html.js index 43edd002..2eb408cf 100644 --- a/lib/jasmine-core/jasmine-html.js +++ b/lib/jasmine-core/jasmine-html.js @@ -569,17 +569,20 @@ jasmineRequire.HtmlReporter = function(j$) { ); var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast'); - failFastCheckbox.checked = config.failFast; + failFastCheckbox.checked = config.stopOnSpecFailure; failFastCheckbox.onclick = function() { - navigateWithNewParam('failFast', !config.failFast); + navigateWithNewParam('failFast', !config.stopOnSpecFailure); }; var throwCheckbox = optionsMenuDom.querySelector( '#jasmine-throw-failures' ); - throwCheckbox.checked = config.oneFailurePerSpec; + throwCheckbox.checked = config.stopSpecOnExpectationFailure; throwCheckbox.onclick = function() { - navigateWithNewParam('oneFailurePerSpec', !config.oneFailurePerSpec); + navigateWithNewParam( + 'oneFailurePerSpec', + !config.stopSpecOnExpectationFailure + ); }; var randomCheckbox = optionsMenuDom.querySelector( diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 39fd9d0b..cd065645 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -1103,8 +1103,17 @@ getJasmineRequireObj().Env = function(j$) { * @since 3.3.0 * @type Boolean * @default false + * @deprecated Use the `stopOnSpecFailure` config property instead. */ failFast: false, + /** + * Whether to stop execution of the suite after the first spec failure + * @name Configuration#stopOnSpecFailure + * @since 3.9.0 + * @type Boolean + * @default false + */ + stopOnSpecFailure: false, /** * Whether to fail the spec if it ran no expectations. By default * a spec that ran no expectations is reported as passed. Setting this @@ -1121,8 +1130,17 @@ getJasmineRequireObj().Env = function(j$) { * @since 3.3.0 * @type Boolean * @default false + * @deprecated Use the `stopSpecOnExpectationFailure` config property instead. */ oneFailurePerSpec: false, + /** + * Whether to cause specs to only have one expectation failure. + * @name Configuration#stopSpecOnExpectationFailure + * @since 3.3.0 + * @type Boolean + * @default false + */ + stopSpecOnExpectationFailure: false, /** * A function that takes a spec and returns true if it should be executed * or false if it should be skipped. @@ -1222,9 +1240,7 @@ getJasmineRequireObj().Env = function(j$) { this.configure = function(configuration) { var booleanProps = [ 'random', - 'failFast', 'failSpecWithNoExpectations', - 'oneFailurePerSpec', 'hideDisabled' ]; @@ -1234,6 +1250,46 @@ getJasmineRequireObj().Env = function(j$) { } }); + if (typeof configuration.failFast !== 'undefined') { + if (typeof configuration.stopOnSpecFailure !== 'undefined') { + if (configuration.stopOnSpecFailure !== configuration.failFast) { + throw new Error( + 'stopOnSpecFailure and failFast are aliases for ' + + "each other. Don't set failFast if you also set stopOnSpecFailure." + ); + } + } + + config.failFast = configuration.failFast; + config.stopOnSpecFailure = configuration.failFast; + } else if (typeof configuration.stopOnSpecFailure !== 'undefined') { + config.failFast = configuration.stopOnSpecFailure; + config.stopOnSpecFailure = configuration.stopOnSpecFailure; + } + + if (typeof configuration.oneFailurePerSpec !== 'undefined') { + if (typeof configuration.stopSpecOnExpectationFailure !== 'undefined') { + if ( + configuration.stopSpecOnExpectationFailure !== + configuration.oneFailurePerSpec + ) { + throw new Error( + 'stopSpecOnExpectationFailure and oneFailurePerSpec are aliases for ' + + "each other. Don't set oneFailurePerSpec if you also set stopSpecOnExpectationFailure." + ); + } + } + + config.oneFailurePerSpec = configuration.oneFailurePerSpec; + config.stopSpecOnExpectationFailure = configuration.oneFailurePerSpec; + } else if ( + typeof configuration.stopSpecOnExpectationFailure !== 'undefined' + ) { + config.oneFailurePerSpec = configuration.stopSpecOnExpectationFailure; + config.stopSpecOnExpectationFailure = + configuration.stopSpecOnExpectationFailure; + } + if (configuration.specFilter) { config.specFilter = configuration.specFilter; } @@ -1570,13 +1626,13 @@ getJasmineRequireObj().Env = function(j$) { * @since 2.3.0 * @function * @param {Boolean} value Whether to throw when a expectation fails - * @deprecated Use the `oneFailurePerSpec` option with {@link Env#configure} + * @deprecated Use the `stopSpecOnExpectationFailure` option with {@link Env#configure} */ this.throwOnExpectationFailure = function(value) { this.deprecated( - 'Setting throwOnExpectationFailure directly on Env is deprecated ' + - 'and will be removed in a future version of Jasmine. Please use the ' + - 'oneFailurePerSpec option in `configure` instead.', + 'Setting throwOnExpectationFailure directly on Env is deprecated and ' + + 'will be removed in a future version of Jasmine. Please use the ' + + 'stopSpecOnExpectationFailure option in `configure`.', { ignoreRunnable: true } ); this.configure({ oneFailurePerSpec: !!value }); @@ -1584,10 +1640,9 @@ getJasmineRequireObj().Env = function(j$) { this.throwingExpectationFailures = function() { this.deprecated( - 'Getting throwingExpectationFailures directly from Env is ' + - 'deprecated and will be removed in a future version of Jasmine. ' + - 'Please check the oneFailurePerSpec option from `configuration` ' + - 'instead.', + 'Getting throwingExpectationFailures directly from Env is deprecated ' + + 'and will be removed in a future version of Jasmine. Please check ' + + 'the stopSpecOnExpectationFailure option from `configuration`.', { ignoreRunnable: true } ); return config.oneFailurePerSpec; @@ -1599,23 +1654,23 @@ getJasmineRequireObj().Env = function(j$) { * @since 2.7.0 * @function * @param {Boolean} value Whether to stop suite execution when a spec fails - * @deprecated Use the `failFast` option with {@link Env#configure} + * @deprecated Use the `stopOnSpecFailure` option with {@link Env#configure} */ this.stopOnSpecFailure = function(value) { this.deprecated( 'Setting stopOnSpecFailure directly is deprecated and will be ' + - 'removed in a future version of Jasmine. Please use the failFast ' + - 'option in `configure` instead.', + 'removed in a future version of Jasmine. Please use the ' + + 'stopOnSpecFailure option in `configure`.', { ignoreRunnable: true } ); - this.configure({ failFast: !!value }); + this.configure({ stopOnSpecFailure: !!value }); }; this.stoppingOnSpecFailure = function() { this.deprecated( - 'Getting stoppingOnSpecFailure directly from Env is deprecated ' + - 'and will be removed in a future version of Jasmine. Please check ' + - 'the failFast option from `configuration` instead.', + 'Getting stoppingOnSpecFailure directly from Env is deprecated and ' + + 'will be removed in a future version of Jasmine. Please check the ' + + 'stopOnSpecFailure option from `configuration`.', { ignoreRunnable: true } ); return config.failFast; @@ -1726,9 +1781,9 @@ getJasmineRequireObj().Env = function(j$) { var queueRunnerFactory = function(options, args) { var failFast = false; if (options.isLeaf) { - failFast = config.oneFailurePerSpec; + failFast = config.stopSpecOnExpectationFailure; } else if (!options.isReporter) { - failFast = config.failFast; + failFast = config.stopOnSpecFailure; } options.clearStack = options.clearStack || clearStack; options.timeout = { diff --git a/spec/core/EnvSpec.js b/spec/core/EnvSpec.js index 7bf29af6..97b73575 100644 --- a/spec/core/EnvSpec.js +++ b/spec/core/EnvSpec.js @@ -286,6 +286,8 @@ describe('Env', function() { failFast: true, failSpecWithNoExpectations: true, oneFailurePerSpec: true, + stopSpecOnExpectationFailure: true, + stopOnSpecFailure: true, hideDisabled: true }; env.configure(initialConfig); @@ -296,6 +298,8 @@ describe('Env', function() { failFast: undefined, failSpecWithNoExpectations: undefined, oneFailurePerSpec: undefined, + stopSpecOnExpectationFailure: undefined, + stopOnSpecFailure: undefined, hideDisabled: undefined }); @@ -304,6 +308,64 @@ describe('Env', function() { ); }); + it('sets stopOnSpecFailure when failFast is set, and vice versa', function() { + env.configure({ failFast: true }); + expect(env.configuration()).toEqual( + jasmine.objectContaining({ + failFast: true, + stopOnSpecFailure: true + }) + ); + + env.configure({ stopOnSpecFailure: false }); + expect(env.configuration()).toEqual( + jasmine.objectContaining({ + failFast: false, + stopOnSpecFailure: false + }) + ); + }); + + it('rejects a single call that sets stopOnSpecFailure and failFast to different values', function() { + expect(function() { + env.configure({ failFast: true, stopOnSpecFailure: false }); + }).toThrowError( + 'stopOnSpecFailure and failFast are aliases for each ' + + "other. Don't set failFast if you also set stopOnSpecFailure." + ); + }); + + it('sets stopSpecOnExpectationFailure when oneFailurePerSpec is set, and vice versa', function() { + env.configure({ oneFailurePerSpec: true }); + expect(env.configuration()).toEqual( + jasmine.objectContaining({ + oneFailurePerSpec: true, + stopSpecOnExpectationFailure: true + }) + ); + + env.configure({ stopSpecOnExpectationFailure: false }); + expect(env.configuration()).toEqual( + jasmine.objectContaining({ + oneFailurePerSpec: false, + stopSpecOnExpectationFailure: false + }) + ); + }); + + it('rejects a single call that sets stopSpecOnExpectationFailure and oneFailurePerSpec to different values', function() { + expect(function() { + env.configure({ + oneFailurePerSpec: true, + stopSpecOnExpectationFailure: false + }); + }).toThrowError( + 'stopSpecOnExpectationFailure and oneFailurePerSpec are ' + + "aliases for each other. Don't set oneFailurePerSpec if you also set " + + 'stopSpecOnExpectationFailure.' + ); + }); + describe('promise library', function() { it('can be configured without a custom library', function() { env.configure({}); diff --git a/spec/core/integration/SpecRunningSpec.js b/spec/core/integration/SpecRunningSpec.js index aa8b79b9..bb2604a0 100644 --- a/spec/core/integration/SpecRunningSpec.js +++ b/spec/core/integration/SpecRunningSpec.js @@ -987,35 +987,10 @@ describe('spec running', function() { }); }); - describe('when stopOnSpecFailure is on', function() { + function behavesLikeStopOnSpecFailureIsOn(configureFn) { it('does not run further specs when one fails', function(done) { - var actions = []; - - env.describe('wrapper', function() { - env.it('fails', function() { - actions.push('fails'); - env.expect(1).toBe(2); - }); - }); - - env.describe('holder', function() { - env.it('does not run', function() { - actions.push('does not run'); - }); - }); - - env.configure({ random: false, failFast: true }); - - env.execute(null, function() { - expect(actions).toEqual(['fails']); - done(); - }); - }); - - it('does not run further specs when one fails when configured with deprecated option', function(done) { - var actions = []; - - spyOn(env, 'deprecated'); + var actions = [], + config; env.describe('wrapper', function() { env.it('fails', function() { @@ -1031,13 +1006,31 @@ describe('spec running', function() { }); env.configure({ random: false }); - env.stopOnSpecFailure(true); + configureFn(env); env.execute(null, function() { expect(actions).toEqual(['fails']); - expect(env.deprecated).toHaveBeenCalled(); done(); }); }); + } + + describe('when failFast is on', function() { + behavesLikeStopOnSpecFailureIsOn(function(env) { + env.configure({ failFast: true }); + }); + }); + + describe('when stopOnSpecFailure is on', function() { + behavesLikeStopOnSpecFailureIsOn(function(env) { + env.configure({ stopOnSpecFailure: true }); + }); + }); + + describe('when stopOnSpecFailure is enabled via the deprecated method', function() { + behavesLikeStopOnSpecFailureIsOn(function(env) { + spyOn(env, 'deprecated'); + env.stopOnSpecFailure(true); + }); }); }); diff --git a/spec/html/HtmlReporterSpec.js b/spec/html/HtmlReporterSpec.js index a245e82d..d098fbc1 100644 --- a/spec/html/HtmlReporterSpec.js +++ b/spec/html/HtmlReporterSpec.js @@ -785,7 +785,7 @@ describe('HtmlReporter', function() { } }); - env.configure({ failFast: true }); + env.configure({ stopOnSpecFailure: true }); reporter.initialize(); reporter.jasmineDone({}); @@ -839,7 +839,7 @@ describe('HtmlReporter', function() { } }); - env.configure({ failFast: true }); + env.configure({ stopOnSpecFailure: true }); reporter.initialize(); reporter.jasmineDone({}); @@ -891,7 +891,7 @@ describe('HtmlReporter', function() { } }); - env.configure({ oneFailurePerSpec: true }); + env.configure({ stopSpecOnExpectationFailure: true }); reporter.initialize(); reporter.jasmineDone({}); @@ -945,7 +945,7 @@ describe('HtmlReporter', function() { } }); - env.configure({ oneFailurePerSpec: true }); + env.configure({ stopSpecOnExpectationFailure: true }); reporter.initialize(); reporter.jasmineDone({}); diff --git a/src/core/Env.js b/src/core/Env.js index 1efa1d37..77e888c3 100644 --- a/src/core/Env.js +++ b/src/core/Env.js @@ -65,8 +65,17 @@ getJasmineRequireObj().Env = function(j$) { * @since 3.3.0 * @type Boolean * @default false + * @deprecated Use the `stopOnSpecFailure` config property instead. */ failFast: false, + /** + * Whether to stop execution of the suite after the first spec failure + * @name Configuration#stopOnSpecFailure + * @since 3.9.0 + * @type Boolean + * @default false + */ + stopOnSpecFailure: false, /** * Whether to fail the spec if it ran no expectations. By default * a spec that ran no expectations is reported as passed. Setting this @@ -83,8 +92,17 @@ getJasmineRequireObj().Env = function(j$) { * @since 3.3.0 * @type Boolean * @default false + * @deprecated Use the `stopSpecOnExpectationFailure` config property instead. */ oneFailurePerSpec: false, + /** + * Whether to cause specs to only have one expectation failure. + * @name Configuration#stopSpecOnExpectationFailure + * @since 3.3.0 + * @type Boolean + * @default false + */ + stopSpecOnExpectationFailure: false, /** * A function that takes a spec and returns true if it should be executed * or false if it should be skipped. @@ -184,9 +202,7 @@ getJasmineRequireObj().Env = function(j$) { this.configure = function(configuration) { var booleanProps = [ 'random', - 'failFast', 'failSpecWithNoExpectations', - 'oneFailurePerSpec', 'hideDisabled' ]; @@ -196,6 +212,46 @@ getJasmineRequireObj().Env = function(j$) { } }); + if (typeof configuration.failFast !== 'undefined') { + if (typeof configuration.stopOnSpecFailure !== 'undefined') { + if (configuration.stopOnSpecFailure !== configuration.failFast) { + throw new Error( + 'stopOnSpecFailure and failFast are aliases for ' + + "each other. Don't set failFast if you also set stopOnSpecFailure." + ); + } + } + + config.failFast = configuration.failFast; + config.stopOnSpecFailure = configuration.failFast; + } else if (typeof configuration.stopOnSpecFailure !== 'undefined') { + config.failFast = configuration.stopOnSpecFailure; + config.stopOnSpecFailure = configuration.stopOnSpecFailure; + } + + if (typeof configuration.oneFailurePerSpec !== 'undefined') { + if (typeof configuration.stopSpecOnExpectationFailure !== 'undefined') { + if ( + configuration.stopSpecOnExpectationFailure !== + configuration.oneFailurePerSpec + ) { + throw new Error( + 'stopSpecOnExpectationFailure and oneFailurePerSpec are aliases for ' + + "each other. Don't set oneFailurePerSpec if you also set stopSpecOnExpectationFailure." + ); + } + } + + config.oneFailurePerSpec = configuration.oneFailurePerSpec; + config.stopSpecOnExpectationFailure = configuration.oneFailurePerSpec; + } else if ( + typeof configuration.stopSpecOnExpectationFailure !== 'undefined' + ) { + config.oneFailurePerSpec = configuration.stopSpecOnExpectationFailure; + config.stopSpecOnExpectationFailure = + configuration.stopSpecOnExpectationFailure; + } + if (configuration.specFilter) { config.specFilter = configuration.specFilter; } @@ -532,13 +588,13 @@ getJasmineRequireObj().Env = function(j$) { * @since 2.3.0 * @function * @param {Boolean} value Whether to throw when a expectation fails - * @deprecated Use the `oneFailurePerSpec` option with {@link Env#configure} + * @deprecated Use the `stopSpecOnExpectationFailure` option with {@link Env#configure} */ this.throwOnExpectationFailure = function(value) { this.deprecated( - 'Setting throwOnExpectationFailure directly on Env is deprecated ' + - 'and will be removed in a future version of Jasmine. Please use the ' + - 'oneFailurePerSpec option in `configure` instead.', + 'Setting throwOnExpectationFailure directly on Env is deprecated and ' + + 'will be removed in a future version of Jasmine. Please use the ' + + 'stopSpecOnExpectationFailure option in `configure`.', { ignoreRunnable: true } ); this.configure({ oneFailurePerSpec: !!value }); @@ -546,10 +602,9 @@ getJasmineRequireObj().Env = function(j$) { this.throwingExpectationFailures = function() { this.deprecated( - 'Getting throwingExpectationFailures directly from Env is ' + - 'deprecated and will be removed in a future version of Jasmine. ' + - 'Please check the oneFailurePerSpec option from `configuration` ' + - 'instead.', + 'Getting throwingExpectationFailures directly from Env is deprecated ' + + 'and will be removed in a future version of Jasmine. Please check ' + + 'the stopSpecOnExpectationFailure option from `configuration`.', { ignoreRunnable: true } ); return config.oneFailurePerSpec; @@ -561,23 +616,23 @@ getJasmineRequireObj().Env = function(j$) { * @since 2.7.0 * @function * @param {Boolean} value Whether to stop suite execution when a spec fails - * @deprecated Use the `failFast` option with {@link Env#configure} + * @deprecated Use the `stopOnSpecFailure` option with {@link Env#configure} */ this.stopOnSpecFailure = function(value) { this.deprecated( 'Setting stopOnSpecFailure directly is deprecated and will be ' + - 'removed in a future version of Jasmine. Please use the failFast ' + - 'option in `configure` instead.', + 'removed in a future version of Jasmine. Please use the ' + + 'stopOnSpecFailure option in `configure`.', { ignoreRunnable: true } ); - this.configure({ failFast: !!value }); + this.configure({ stopOnSpecFailure: !!value }); }; this.stoppingOnSpecFailure = function() { this.deprecated( - 'Getting stoppingOnSpecFailure directly from Env is deprecated ' + - 'and will be removed in a future version of Jasmine. Please check ' + - 'the failFast option from `configuration` instead.', + 'Getting stoppingOnSpecFailure directly from Env is deprecated and ' + + 'will be removed in a future version of Jasmine. Please check the ' + + 'stopOnSpecFailure option from `configuration`.', { ignoreRunnable: true } ); return config.failFast; @@ -688,9 +743,9 @@ getJasmineRequireObj().Env = function(j$) { var queueRunnerFactory = function(options, args) { var failFast = false; if (options.isLeaf) { - failFast = config.oneFailurePerSpec; + failFast = config.stopSpecOnExpectationFailure; } else if (!options.isReporter) { - failFast = config.failFast; + failFast = config.stopOnSpecFailure; } options.clearStack = options.clearStack || clearStack; options.timeout = { diff --git a/src/html/HtmlReporter.js b/src/html/HtmlReporter.js index 86061385..ac5a4213 100644 --- a/src/html/HtmlReporter.js +++ b/src/html/HtmlReporter.js @@ -538,17 +538,20 @@ jasmineRequire.HtmlReporter = function(j$) { ); var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast'); - failFastCheckbox.checked = config.failFast; + failFastCheckbox.checked = config.stopOnSpecFailure; failFastCheckbox.onclick = function() { - navigateWithNewParam('failFast', !config.failFast); + navigateWithNewParam('failFast', !config.stopOnSpecFailure); }; var throwCheckbox = optionsMenuDom.querySelector( '#jasmine-throw-failures' ); - throwCheckbox.checked = config.oneFailurePerSpec; + throwCheckbox.checked = config.stopSpecOnExpectationFailure; throwCheckbox.onclick = function() { - navigateWithNewParam('oneFailurePerSpec', !config.oneFailurePerSpec); + navigateWithNewParam( + 'oneFailurePerSpec', + !config.stopSpecOnExpectationFailure + ); }; var randomCheckbox = optionsMenuDom.querySelector(