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(