cucumber
Version:
The official JavaScript implementation of Cucumber.
97 lines (86 loc) • 4.34 kB
JavaScript
var _ = require('underscore');
_.str = require('underscore.string');
function StepDefinitionSnippetBuilder(step, syntax) {
var Cucumber = require('../../cucumber');
var self = {
buildSnippet: function buildSnippet() {
var functionName = self.buildStepDefinitionFunctionName();
var pattern = self.buildStepDefinitionPattern();
var parameters = self.buildStepDefinitionParameters();
var snippet =
syntax.getStepDefinitionStart() +
functionName +
syntax.getStepDefinitionInner1() +
pattern +
syntax.getStepDefinitionInner2() +
parameters +
syntax.getStepDefinitionEnd();
return snippet;
},
buildStepDefinitionFunctionName: function buildStepDefinitionFunctionName() {
var functionName;
if (step.isOutcomeStep())
functionName = syntax.getOutcomeStepDefinitionFunctionName();
else if (step.isEventStep())
functionName = syntax.getEventStepDefinitionFunctionName();
else
functionName = syntax.getContextStepDefinitionFunctionName();
return functionName;
},
buildStepDefinitionPattern: function buildStepDefinitionPattern() {
var stepName = step.isOutlineStep() ? step.getOriginalStep().getName() : step.getName();
var escapedStepName = Cucumber.Util.RegExp.escapeString(stepName);
var parameterizedStepName = self.parameterizeStepName(escapedStepName);
var pattern =
syntax.getPatternStart() +
parameterizedStepName +
syntax.getPatternEnd();
return pattern;
},
buildStepDefinitionParameters: function buildStepDefinitionParameters() {
var parameters = self.getStepDefinitionPatternMatchingGroupParameters();
if (step.hasDocString())
parameters = parameters.concat([syntax.getStepDefinitionDocString()]);
else if (step.hasDataTable())
parameters = parameters.concat([syntax.getStepDefinitionDataTable()]);
var parametersAndCallback = parameters.concat([syntax.getStepDefinitionCallback()]);
var parameterString = parametersAndCallback.join(syntax.getFunctionParameterSeparator());
return parameterString;
},
getStepDefinitionPatternMatchingGroupParameters: function getStepDefinitionPatternMatchingGroupParameters() {
var parameterCount = self.countStepDefinitionPatternMatchingGroups();
var parameters = [];
_(parameterCount).times(function (n) {
var offset = n + 1;
parameters.push('arg' + offset);
});
var stepName = step.isOutlineStep() ? step.getOriginalStep().getName() : step.getName();
var outlineParams = stepName.match(StepDefinitionSnippetBuilder.OUTLINE_STRING_PATTERN);
function cleanParam(param) {
return _.str.camelize(param.substr(1,param.length - 2));
}
var cleaned = _.map(outlineParams, cleanParam);
return parameters.concat(cleaned);
},
countStepDefinitionPatternMatchingGroups: function countStepDefinitionPatternMatchingGroups() {
var stepDefinitionPattern = self.buildStepDefinitionPattern();
var numberMatchingGroupCount = Cucumber.Util.String.count(stepDefinitionPattern, syntax.getNumberMatchingGroup());
var quotedStringMatchingGroupCount = Cucumber.Util.String.count(stepDefinitionPattern, syntax.getQuotedStringMatchingGroup());
var count = numberMatchingGroupCount + quotedStringMatchingGroupCount;
return count;
},
parameterizeStepName: function parameterizeStepName(stepName) {
var parameterizedStepName =
stepName
.replace(StepDefinitionSnippetBuilder.NUMBER_PATTERN, syntax.getNumberMatchingGroup())
.replace(StepDefinitionSnippetBuilder.QUOTED_STRING_PATTERN, syntax.getQuotedStringMatchingGroup())
.replace(StepDefinitionSnippetBuilder.OUTLINE_STRING_PATTERN, syntax.getOutlineExampleMatchingGroup());
return parameterizedStepName;
}
};
return self;
}
StepDefinitionSnippetBuilder.NUMBER_PATTERN = /\d+/gi;
StepDefinitionSnippetBuilder.QUOTED_STRING_PATTERN = /"[^"]*"/gi;
StepDefinitionSnippetBuilder.OUTLINE_STRING_PATTERN = /<[^>]*>/gi;
module.exports = StepDefinitionSnippetBuilder;