Skip to content

Commit bc86f09

Browse files
author
charlierudolph
committed
Extract features result logic
1 parent d6ca062 commit bc86f09

File tree

6 files changed

+201
-169
lines changed

6 files changed

+201
-169
lines changed

features/dryrun_mode.feature

+9-20
Original file line numberDiff line numberDiff line change
@@ -71,31 +71,20 @@ Feature: Dryrun mode
7171
When I run cucumber.js with `-f progress features/a.feature --dry-run`
7272
Then it outputs this text:
7373
"""
74-
-
74+
U
7575
76-
1 scenario (1 skipped)
77-
1 step (1 skipped)
76+
1 scenario (1 undefined)
77+
1 step (1 undefined)
7878
<duration-stat>
79-
"""
80-
And the exit status should be 0
8179
82-
Scenario: Skipped Scenario with pending step with --dry-run
83-
Given a file named "features/step_definitions/cucumber_steps.js" with:
84-
"""
85-
var cucumberSteps = function() {
86-
this.Given(/^this step passes$/, function(callback) { callback.pending(); });
87-
};
88-
module.exports = cucumberSteps;
89-
"""
90-
When I run cucumber.js with `-f progress features/a.feature --dry-run`
91-
Then it outputs this text:
92-
"""
93-
-
80+
You can implement step definitions for undefined steps with these snippets:
9481
95-
1 scenario (1 skipped)
96-
1 step (1 skipped)
97-
<duration-stat>
82+
this.Given(/^this step passes$/, function (callback) {
83+
// Write code here that turns the phrase above into concrete actions
84+
callback.pending();
85+
});
9886
"""
87+
And the exit status should be 0
9988

10089
Scenario: Skipped scenario with defined step with -d
10190
Given a file named "features/step_definitions/cucumber_steps.js" with:

lib/cucumber/runtime.js

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ function Runtime(configuration) {
5050
Runtime.START_MISSING_CALLBACK_ERROR = 'Cucumber.Runtime.start() expects a callback';
5151
Runtime.AstTreeWalker = require('./runtime/ast_tree_walker');
5252
Runtime.Attachment = require('./runtime/attachment');
53+
Runtime.FeaturesResult = require('./runtime/features_result');
5354
Runtime.ScenarioResult = require('./runtime/scenario_result');
5455
Runtime.StackTraceFilter = require('./runtime/stack_trace_filter');
5556
Runtime.StepResult = require('./runtime/step_result');

lib/cucumber/runtime/ast_tree_walker.js

+9-45
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
44
var Cucumber = require('../../cucumber');
55

66
var world;
7-
var allFeaturesSucceeded = true;
7+
var featuresResult = Cucumber.Runtime.FeaturesResult(options.strict);
88
var emptyHook = Cucumber.SupportCode.Hook(function (callback) { callback(); }, {});
99
var beforeSteps = Cucumber.Type.Collection();
1010
var afterSteps = Cucumber.Type.Collection();
@@ -20,8 +20,7 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
2020
self.visitFeatures(features, function () {
2121
if (walkDomain.exit)
2222
walkDomain.exit();
23-
var featuresResult = self.didAllFeaturesSucceed();
24-
callback(featuresResult);
23+
callback(featuresResult.isSuccessful());
2524
});
2625
},
2726

@@ -36,7 +35,7 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
3635
},
3736

3837
visitFeature: function visitFeature(feature, callback) {
39-
if (!allFeaturesSucceeded && options.failFast) {
38+
if (!featuresResult.isSuccessful() && options.failFast) {
4039
return callback();
4140
}
4241
var payload = { feature: feature };
@@ -55,7 +54,7 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
5554
},
5655

5756
visitScenario: function visitScenario(scenario, callback) {
58-
if (!allFeaturesSucceeded && options.failFast) {
57+
if (!featuresResult.isSuccessful() && options.failFast) {
5958
return callback();
6059
}
6160
supportCodeLibrary.instantiateNewWorld(function (world) {
@@ -140,10 +139,7 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
140139

141140
visitStepResult: function visitStepResult(stepResult, callback) {
142141
scenarioResult.witnessStepResult(stepResult);
143-
var status = stepResult.getStatus();
144-
if (status === Cucumber.Status.FAILED || (options.strict && (status === Cucumber.Status.PENDING))) {
145-
allFeaturesSucceeded = false;
146-
}
142+
featuresResult.witnessStepResult(stepResult);
147143
var payload = { stepResult: stepResult };
148144
var event = AstTreeWalker.Event(AstTreeWalker.STEP_RESULT_EVENT_NAME, payload);
149145
self.broadcastEvent(event, callback);
@@ -212,10 +208,6 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
212208
return !supportCodeLibrary.isStepDefinitionNameDefined(stepName);
213209
},
214210

215-
didAllFeaturesSucceed: function didAllFeaturesSucceed() {
216-
return allFeaturesSucceeded;
217-
},
218-
219211
getScenarioStatus: function getScenarioStatus() {
220212
return scenarioResult.getStatus();
221213
},
@@ -240,34 +232,13 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
240232
attachments.clear();
241233
},
242234

243-
witnessUndefinedStep: function witnessUndefinedStep() {
244-
if (options.strict) {
245-
allFeaturesSucceeded = false;
246-
}
247-
scenarioResult.witnessStepStatus(Cucumber.Status.UNDEFINED);
248-
},
249-
250-
witnessSkippedStep: function witnessSkippedStep() {
251-
scenarioResult.witnessStepStatus(Cucumber.Status.SKIPPED);
252-
},
253-
254235
witnessNewScenario: function witnessNewScenario(scenario) {
255236
apiScenario = Cucumber.Api.Scenario(self, scenario);
256237
scenarioResult = Cucumber.Runtime.ScenarioResult();
257238
beforeSteps.clear();
258239
afterSteps.clear();
259240
},
260241

261-
processDryRunStep: function processDryRunStep(step, callback) {
262-
if (options.strict && self.isStepUndefined(step)) {
263-
self.witnessUndefinedStep();
264-
self.skipUndefinedStep(step, callback);
265-
} else {
266-
self.witnessSkippedStep();
267-
self.skipStep(step, callback);
268-
}
269-
},
270-
271242
getScenario: function getScenario() {
272243
return apiScenario;
273244
},
@@ -281,12 +252,9 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
281252
},
282253

283254
processStep: function processStep(step, callback) {
284-
if (options.dryRun) {
285-
self.processDryRunStep(step, callback);
286-
} else if (self.isStepUndefined(step)) {
287-
self.witnessUndefinedStep();
255+
if (self.isStepUndefined(step)) {
288256
self.skipUndefinedStep(step, callback);
289-
} else if (self.isSkippingSteps()) {
257+
} else if (options.dryRun || self.isSkippingSteps()) {
290258
self.skipStep(step, callback);
291259
} else {
292260
self.executeStep(step, callback);
@@ -299,16 +267,12 @@ function AstTreeWalker(features, supportCodeLibrary, listeners, options) {
299267

300268
skipStep: function skipStep(step, callback) {
301269
var skippedStepResult = Cucumber.Runtime.StepResult({step: step, status: Cucumber.Status.SKIPPED});
302-
var payload = { stepResult: skippedStepResult };
303-
var event = AstTreeWalker.Event(AstTreeWalker.STEP_RESULT_EVENT_NAME, payload);
304-
self.broadcastEvent(event, callback);
270+
self.visitStepResult(skippedStepResult, callback);
305271
},
306272

307273
skipUndefinedStep: function skipUndefinedStep(step, callback) {
308274
var undefinedStepResult = Cucumber.Runtime.StepResult({step: step, status: Cucumber.Status.UNDEFINED});
309-
var payload = { stepResult: undefinedStepResult };
310-
var event = AstTreeWalker.Event(AstTreeWalker.STEP_RESULT_EVENT_NAME, payload);
311-
self.broadcastEvent(event, callback);
275+
self.visitStepResult(undefinedStepResult, callback);
312276
}
313277
};
314278
return self;
+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
function FeaturesResult(strict) {
2+
var Cucumber = require('../../cucumber');
3+
4+
var success = true;
5+
6+
var self = {
7+
isSuccessful: function isSuccessful() {
8+
return success;
9+
},
10+
11+
witnessStepResult: function witnessStepResult(stepResult) {
12+
var stepStatus = stepResult.getStatus();
13+
switch (stepStatus) {
14+
case Cucumber.Status.FAILED:
15+
success = false;
16+
break;
17+
case Cucumber.Status.PENDING:
18+
case Cucumber.Status.UNDEFINED:
19+
if (strict) {
20+
success = false;
21+
}
22+
break;
23+
}
24+
}
25+
};
26+
27+
return self;
28+
}
29+
30+
module.exports = FeaturesResult;

0 commit comments

Comments
 (0)