cucumber
Version:
The official JavaScript implementation of Cucumber.
77 lines (63 loc) • 2.62 kB
JavaScript
var Hooker = function() {
var Cucumber = require('../../../cucumber');
var aroundHooks = Cucumber.Type.Collection();
var beforeHooks = Cucumber.Type.Collection();
var afterHooks = Cucumber.Type.Collection();
var self = {
addAroundHookCode: function addAroundHookCode(code, options) {
var aroundHook = Cucumber.SupportCode.Hook(code, options);
aroundHooks.add(aroundHook);
},
addBeforeHookCode: function addBeforeHookCode(code, options) {
var beforeHook = Cucumber.SupportCode.Hook(code, options);
beforeHooks.add(beforeHook);
},
addAfterHookCode: function addAfterHookCode(code, options) {
var afterHook = Cucumber.SupportCode.Hook(code, options);
afterHooks.unshift(afterHook);
},
hookUpFunction: function hookUpFunction(userFunction, scenario, world) {
var hookedUpFunction = function(callback) {
var postScenarioAroundHookCallbacks = Cucumber.Type.Collection();
aroundHooks.forEach(callPreScenarioAroundHook, callBeforeHooks);
function callPreScenarioAroundHook(aroundHook, preScenarioAroundHookCallback) {
aroundHook.invokeBesideScenario(scenario, world, function(postScenarioAroundHookCallback) {
postScenarioAroundHookCallbacks.unshift(postScenarioAroundHookCallback);
preScenarioAroundHookCallback();
});
}
function callBeforeHooks() {
self.triggerBeforeHooks(scenario, world, callUserFunction);
}
function callUserFunction() {
userFunction(callAfterHooks);
}
function callAfterHooks() {
self.triggerAfterHooks(scenario, world, callPostScenarioAroundHooks);
}
function callPostScenarioAroundHooks() {
postScenarioAroundHookCallbacks.forEach(
callPostScenarioAroundHook,
callback
);
}
function callPostScenarioAroundHook(postScenarioAroundHookCallback, callback) {
postScenarioAroundHookCallback.call(world, callback);
}
};
return hookedUpFunction;
},
triggerBeforeHooks: function triggerBeforeHooks(scenario, world, callback) {
beforeHooks.forEach(function(beforeHook, callback) {
beforeHook.invokeBesideScenario(scenario, world, callback);
}, callback);
},
triggerAfterHooks: function triggerAfterHooks(scenario, world, callback) {
afterHooks.forEach(function(afterHook, callback) {
afterHook.invokeBesideScenario(scenario, world, callback);
}, callback);
}
};
return self;
};
module.exports = Hooker;