-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
step_definition.js
89 lines (77 loc) · 3.23 KB
/
step_definition.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
var StepDefinition = function(pattern, code) {
var Cucumber = require('../../cucumber');
var self = {
getPatternRegexp: function getPatternRegexp() {
var regexp;
if (pattern.replace) {
var regexpString = pattern
.replace(StepDefinition.QUOTED_DOLLAR_PARAMETER_REGEXP, StepDefinition.QUOTED_DOLLAR_PARAMETER_SUBSTITUTION)
.replace(StepDefinition.DOLLAR_PARAMETER_REGEXP, StepDefinition.DOLLAR_PARAMETER_SUBSTITUTION);
regexp = RegExp(regexpString);
}
else
regexp = pattern;
return regexp;
},
matchesStepName: function matchesStepName(stepName) {
var regexp = self.getPatternRegexp();
return regexp.test(stepName);
},
invoke: function invoke(step, world, callback) {
var cleanUp = function cleanUp() {
Cucumber.Util.Exception.unregisterUncaughtExceptionHandler(handleException);
};
var codeCallback = function() {
var successfulStepResult = Cucumber.Runtime.SuccessfulStepResult({step: step});
cleanUp();
callback(successfulStepResult);
};
codeCallback.pending = function pending(reason) {
var pendingStepResult = Cucumber.Runtime.PendingStepResult({step: step, pendingReason: reason});
cleanUp();
callback(pendingStepResult);
};
codeCallback.fail = function fail(failureReason) {
var failureException = failureReason || new Error(StepDefinition.UNKNOWN_STEP_FAILURE_MESSAGE);
var failedStepResult = Cucumber.Runtime.FailedStepResult({step: step, failureException: failureException});
cleanUp();
callback(failedStepResult);
};
var parameters = self.buildInvocationParameters(step, codeCallback);
var handleException = self.buildExceptionHandlerToCodeCallback(codeCallback);
Cucumber.Util.Exception.registerUncaughtExceptionHandler(handleException);
try {
code.apply(world, parameters);
} catch (exception) {
handleException(exception);
}
},
buildInvocationParameters: function buildInvocationParameters(step, callback) {
var stepName = step.getName();
var patternRegexp = self.getPatternRegexp();
var parameters = patternRegexp.exec(stepName);
parameters.shift();
if (step.hasAttachment()) {
var attachmentContents = step.getAttachmentContents();
parameters.push(attachmentContents);
}
parameters.push(callback);
return parameters;
},
buildExceptionHandlerToCodeCallback: function buildExceptionHandlerToCodeCallback(codeCallback) {
var exceptionHandler = function handleScenarioException(exception) {
if (exception)
Cucumber.Debug.warn(exception.stack || exception, 'exception inside feature', 3);
codeCallback.fail(exception);
};
return exceptionHandler;
}
};
return self;
};
StepDefinition.DOLLAR_PARAMETER_REGEXP = /\$[a-zA-Z_-]+/;
StepDefinition.DOLLAR_PARAMETER_SUBSTITUTION = '(.*)';
StepDefinition.QUOTED_DOLLAR_PARAMETER_REGEXP = /"\$[a-zA-Z_-]+"/;
StepDefinition.QUOTED_DOLLAR_PARAMETER_SUBSTITUTION = '"([^"]*)"';
StepDefinition.UNKNOWN_STEP_FAILURE_MESSAGE = "Step failure";
module.exports = StepDefinition;