UNPKG

cucumber

Version:

The official JavaScript implementation of Cucumber.

132 lines (107 loc) 4.12 kB
function Assembler(features, filter) { var currentFeature, currentFeatureElement, currentStep, suggestedFeature; var stashedTags = []; var self = { setCurrentFeature: function setCurrentFeature(feature) { currentFeature = feature; self.setCurrentFeatureElement(undefined); }, getCurrentFeature: function getCurrentFeature() { return currentFeature; }, setCurrentFeatureElement: function setCurrentFeatureElement(featureElement) { currentFeatureElement = featureElement; self.setCurrentStep(undefined); }, getCurrentFeatureElement: function getCurrentFeatureElement() { return currentFeatureElement; }, setCurrentStep: function setCurrentStep(step) { currentStep = step; }, getCurrentStep: function getCurrentStep() { return currentStep; }, stashTag: function stashTag(tag) { stashedTags.push(tag); }, revealTags: function revealTags() { var revealedTags = stashedTags; stashedTags = []; return revealedTags; }, applyCurrentFeatureTagsToElement: function applyCurrentFeatureTagsToElement(element) { var currentFeature = self.getCurrentFeature(); var featureTags = currentFeature.getTags(); element.addInheritedTags(featureTags); }, applyStashedTagsToElement: function applyStashedTagsToElement(element) { var revealedTags = self.revealTags(); element.addTags(revealedTags); }, insertBackground: function insertBackground(background) { self.setCurrentFeatureElement(background); var currentFeature = self.getCurrentFeature(); currentFeature.setBackground(background); }, insertDataTableRow: function insertDataTableRow(dataTableRow) { var currentStep = self.getCurrentStep(); currentStep.attachDataTableRow(dataTableRow); }, insertDocString: function insertDocString(docString) { var currentStep = self.getCurrentStep(); currentStep.attachDocString(docString); }, insertFeature: function insertFeature(feature) { self.tryEnrollingSuggestedFeature(); self.applyStashedTagsToElement(feature); self.setCurrentFeature(feature); self.suggestFeature(feature); }, insertScenario: function insertScenario(scenario) { self.applyCurrentFeatureTagsToElement(scenario); self.applyStashedTagsToElement(scenario); self.setCurrentFeatureElement(scenario); if (filter.isElementEnrolled(scenario)) { var currentFeature = self.getCurrentFeature(); currentFeature.addFeatureElement(scenario); } }, insertExamples: function insertExamples(examples) { var currentFeatureElement = self.getCurrentFeatureElement(); if (!currentFeatureElement.isScenarioOutline()) throw new Error('Examples are allowed inside scenario outlines only'); currentFeatureElement.addExamples(examples); self.setCurrentStep(examples); }, insertStep: function insertStep(step) { self.setCurrentStep(step); var currentFeatureElement = self.getCurrentFeatureElement(); currentFeatureElement.addStep(step); }, insertTag: function insertTag(tag) { self.stashTag(tag); }, finish: function finish() { self.getCurrentFeature().convertScenarioOutlinesToScenarios(); self.tryEnrollingSuggestedFeature(); }, suggestFeature: function suggestFeature(feature) { suggestedFeature = feature; }, isSuggestedFeatureEnrollable: function isSuggestedFeatureEnrollable() { var enrollable = suggestedFeature && (suggestedFeature.hasFeatureElements() || filter.isElementEnrolled(suggestedFeature)); return enrollable; }, tryEnrollingSuggestedFeature: function tryEnrollingSuggestedFeature() { if (self.isSuggestedFeatureEnrollable()) self.enrollSuggestedFeature(); }, enrollSuggestedFeature: function enrollSuggestedFeature() { features.addFeature(suggestedFeature); suggestedFeature = null; } }; return self; } module.exports = Assembler;