cucumber
Version:
The official JavaScript implementation of Cucumber.
153 lines (124 loc) • 4.5 kB
JavaScript
var Step = function(keyword, name, line) {
var Cucumber = require('../../cucumber');
var docString, dataTable, previousStep;
var self = {
setPreviousStep: function setPreviousStep(newPreviousStep) {
previousStep = newPreviousStep;
},
getKeyword: function getKeyword() {
return keyword;
},
getName: function getName() {
return name;
},
getLine: function getLine() {
return line;
},
getPreviousStep: function getPreviousStep() {
return previousStep;
},
hasPreviousStep: function hasPreviousStep() {
return !!previousStep;
},
getAttachment: function getAttachment() {
var attachment;
if (self.hasDocString()) {
attachment = self.getDocString();
} else if (self.hasDataTable()) {
attachment = self.getDataTable();
}
return attachment;
},
getDocString: function getDocString() { return docString; },
getDataTable: function getDataTable() { return dataTable; },
hasDocString: function hasDocString() {
return !!docString;
},
hasDataTable: function hasDataTable() {
return !!dataTable;
},
attachDocString: function attachDocString(_docString) { docString = _docString; },
attachDataTable: function attachDataTable(_dataTable) { dataTable = _dataTable; },
attachDataTableRow: function attachDataTableRow(row) {
self.ensureDataTableIsAttached();
var dataTable = self.getDataTable();
dataTable.attachRow(row);
},
ensureDataTableIsAttached: function ensureDataTableIsAttached() {
var dataTable = self.getDataTable();
if (!dataTable) {
dataTable = Cucumber.Ast.DataTable();
self.attachDataTable(dataTable);
}
},
isOutcomeStep: function isOutcomeStep() {
var isOutcomeStep =
self.hasOutcomeStepKeyword() || self.isRepeatingOutcomeStep();
return isOutcomeStep;
},
isEventStep: function isEventStep() {
var isEventStep =
self.hasEventStepKeyword() || self.isRepeatingEventStep();
return isEventStep;
},
hasOutcomeStepKeyword: function hasOutcomeStepKeyword() {
var hasOutcomeStepKeyword =
keyword == Step.OUTCOME_STEP_KEYWORD;
return hasOutcomeStepKeyword;
},
hasEventStepKeyword: function hasEventStepKeyword() {
var hasEventStepKeyword =
keyword == Step.EVENT_STEP_KEYWORD;
return hasEventStepKeyword;
},
isRepeatingOutcomeStep: function isRepeatingOutcomeStep() {
var isRepeatingOutcomeStep =
self.hasRepeatStepKeyword() && self.isPrecededByOutcomeStep();
return isRepeatingOutcomeStep;
},
isRepeatingEventStep: function isRepeatingEventStep() {
var isRepeatingEventStep =
self.hasRepeatStepKeyword() && self.isPrecededByEventStep();
return isRepeatingEventStep;
},
hasRepeatStepKeyword: function hasRepeatStepKeyword() {
var hasRepeatStepKeyword =
keyword == Step.AND_STEP_KEYWORD || keyword == Step.BUT_STEP_KEYWORD || keyword == Step.STAR_STEP_KEYWORD;
return hasRepeatStepKeyword;
},
isPrecededByOutcomeStep: function isPrecededByOutcomeStep() {
var isPrecededByOutcomeStep = false;
if (self.hasPreviousStep()) {
var previousStep = self.getPreviousStep();
var isPrecededByOutcomeStep = previousStep.isOutcomeStep();
}
return isPrecededByOutcomeStep;
},
isPrecededByEventStep: function isPrecededByEventStep() {
var isPrecededByEventStep = false;
if (self.hasPreviousStep()) {
var previousStep = self.getPreviousStep();
var isPrecededByEventStep = previousStep.isEventStep();
}
return isPrecededByEventStep;
},
acceptVisitor: function acceptVisitor(visitor, callback) {
self.execute(visitor, function(stepResult) {
visitor.visitStepResult(stepResult, callback);
});
},
execute: function execute(visitor, callback) {
var stepDefinition = visitor.lookupStepDefinitionByName(name);
var world = visitor.getWorld();
var attachment = self.getAttachment();
stepDefinition.invoke(name, world, attachment, callback);
}
};
return self;
};
Step.EVENT_STEP_KEYWORD = 'When ';
Step.OUTCOME_STEP_KEYWORD = 'Then ';
Step.AND_STEP_KEYWORD = 'And ';
Step.BUT_STEP_KEYWORD = 'But ';
Step.STAR_STEP_KEYWORD = '* ';
module.exports = Step;