bdd-lazy-var
Advanced tools
Comparing version 0.0.2 to 0.0.3
@@ -11,7 +11,6 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | ||
var currentlyDefinedSuite = rootSuite; | ||
var currentlyRetrievedVarName; | ||
var currentlyRunningSuite = null; | ||
var currentTestContext; | ||
Mocha.interfaces.bdd(rootSuite); | ||
rootSuite.on('pre-require', function(context, file, mocha) { | ||
rootSuite.on('pre-require', function(context) { | ||
context.subject = function(definition) { | ||
@@ -21,25 +20,25 @@ return arguments.length === 1 ? context.def('subject', definition) : context.get('subject'); | ||
context.get = function(name) { | ||
var originalSuite = currentlyRunningSuite; | ||
context.get = function(varName) { | ||
var originalSuite = currentTestContext; | ||
if (name === currentlyRetrievedVarName) { | ||
currentlyRunningSuite = Object.getPrototypeOf(originalSuite); | ||
if (varName === currentTestContext._definesVariable) { | ||
currentTestContext = getParentContextFor(varName, currentTestContext); | ||
} | ||
try { | ||
currentlyRetrievedVarName = name; | ||
currentTestContext._definesVariable = varName; | ||
// console.log('get "%s" for "%s"', name, currentlyRunningSuite.title); | ||
return lazyVar.getOrCreate(currentlyRunningSuite, name); | ||
return lazyVar.getOrCreate(currentTestContext, varName); | ||
} finally { | ||
currentlyRetrievedVarName = null; | ||
currentlyRunningSuite = originalSuite; | ||
// console.log('restore to "%s"', currentlyRunningSuite.title); | ||
delete currentTestContext._definesVariable; | ||
currentTestContext = originalSuite; | ||
} | ||
}; | ||
context.def = function(name, definition) { | ||
return lazyVar.register(currentlyDefinedSuite.ctx, name, definition); | ||
context.def = function(varName, definition) { | ||
if (lazyVar.isDefined(currentlyDefinedSuite.ctx, varName)) { | ||
registerParentContextFor(varName, currentlyDefinedSuite); | ||
} | ||
return lazyVar.register(currentlyDefinedSuite.ctx, varName, definition); | ||
}; | ||
@@ -52,2 +51,6 @@ | ||
context.before(function() { | ||
this.title = title; | ||
}); | ||
context.before(registerSuite); | ||
@@ -66,5 +69,17 @@ context.beforeEach(registerSuite); | ||
function registerSuite() { | ||
currentlyRunningSuite = this; | ||
currentTestContext = this; | ||
} | ||
function registerParentContextFor(varName, suite) { | ||
if (!suite.ctx.hasOwnProperty('_parentContextForLazyVars')) { | ||
suite.ctx._parentContextForLazyVars = {}; | ||
} | ||
suite.ctx._parentContextForLazyVars[varName] = suite.parent.ctx; | ||
} | ||
function getParentContextFor(varName, testContext) { | ||
return testContext._parentContextForLazyVars ? testContext._parentContextForLazyVars[varName] : null; | ||
} | ||
context.context = context.describe; | ||
@@ -79,12 +94,30 @@ context.context.skip = context.describe.skip = describe.skip; | ||
var varsToClean = []; | ||
var prop = require('./symbol').for; | ||
var createdVarsPropName = prop('__createdVars'); | ||
function propNameFor(varName) { | ||
var name = '_lazy_' + varName + '_definition'; | ||
function definitionNameFor(varName) { | ||
return prop('__' + varName + 'LazyDefinition'); | ||
} | ||
return typeof Symbol !== 'undefined' ? Symbol.for(name) : name; | ||
function getDefinition(context, definitionName) { | ||
return context[definitionName]; | ||
} | ||
function markVarAsCreated(context, definitionName) { | ||
if (!context.hasOwnProperty(createdVarsPropName)) { | ||
context[createdVarsPropName] = {}; | ||
} | ||
context[createdVarsPropName][definitionName] = getDefinition(context, definitionName); | ||
} | ||
function isCreated(context, definitionName) { | ||
var calledDefinitions = context[createdVarsPropName] || {}; | ||
return calledDefinitions[definitionName] === getDefinition(context, definitionName); | ||
} | ||
var lazyVar = { | ||
register: function(context, name, definition) { | ||
var propName = propNameFor(name); | ||
var propName = definitionNameFor(name); | ||
@@ -98,11 +131,17 @@ if (context.hasOwnProperty(propName)) { | ||
isDefined: function(context, name) { | ||
return context && definitionNameFor(name) in context; | ||
}, | ||
getOrCreate: function(context, name) { | ||
if (!(propNameFor(name) in context)) { | ||
throw new Error('"' + name + '" is not defined.'); | ||
if (!lazyVar.isDefined(context, name)) { | ||
throw new Error('Lazy variable "' + name + '" is not defined.'); | ||
} | ||
var definition = lazyVar.getDefinition(context, name); | ||
var definitionName = definitionNameFor(name); | ||
var definition = getDefinition(context, definitionName); | ||
if (!context.hasOwnProperty(name)) { | ||
if (!(name in context) || !isCreated(context, definitionName)) { | ||
context[name] = typeof definition === 'function' ? definition() : definition; | ||
markVarAsCreated(context, definitionName); | ||
varsToClean.push({ context: context, name: name }); | ||
@@ -114,6 +153,2 @@ } | ||
getDefinition: function(context, name) { | ||
return context[propNameFor(name)]; | ||
}, | ||
cleanUp: function() { | ||
@@ -127,2 +162,3 @@ varsToClean.forEach(lazyVar.destroy); | ||
delete variable.context[variable.name]; | ||
delete variable.context[createdVarsPropName]; | ||
} | ||
@@ -134,2 +170,11 @@ } | ||
},{"./symbol":4}],4:[function(require,module,exports){ | ||
var indentity = function(value) { | ||
return value; | ||
}; | ||
module.exports = { | ||
for: typeof Symbol === 'undefined' ? indentity : Symbol.for | ||
}; | ||
},{}]},{},[1]); |
@@ -6,7 +6,6 @@ var Mocha = require('mocha'); | ||
var currentlyDefinedSuite = rootSuite; | ||
var currentlyRetrievedVarName; | ||
var currentlyRunningSuite = null; | ||
var currentTestContext; | ||
Mocha.interfaces.bdd(rootSuite); | ||
rootSuite.on('pre-require', function(context, file, mocha) { | ||
rootSuite.on('pre-require', function(context) { | ||
context.subject = function(definition) { | ||
@@ -16,25 +15,25 @@ return arguments.length === 1 ? context.def('subject', definition) : context.get('subject'); | ||
context.get = function(name) { | ||
var originalSuite = currentlyRunningSuite; | ||
context.get = function(varName) { | ||
var originalSuite = currentTestContext; | ||
if (name === currentlyRetrievedVarName) { | ||
currentlyRunningSuite = Object.getPrototypeOf(originalSuite); | ||
if (varName === currentTestContext._definesVariable) { | ||
currentTestContext = getParentContextFor(varName, currentTestContext); | ||
} | ||
try { | ||
currentlyRetrievedVarName = name; | ||
currentTestContext._definesVariable = varName; | ||
// console.log('get "%s" for "%s"', name, currentlyRunningSuite.title); | ||
return lazyVar.getOrCreate(currentlyRunningSuite, name); | ||
return lazyVar.getOrCreate(currentTestContext, varName); | ||
} finally { | ||
currentlyRetrievedVarName = null; | ||
currentlyRunningSuite = originalSuite; | ||
// console.log('restore to "%s"', currentlyRunningSuite.title); | ||
delete currentTestContext._definesVariable; | ||
currentTestContext = originalSuite; | ||
} | ||
}; | ||
context.def = function(name, definition) { | ||
return lazyVar.register(currentlyDefinedSuite.ctx, name, definition); | ||
context.def = function(varName, definition) { | ||
if (lazyVar.isDefined(currentlyDefinedSuite.ctx, varName)) { | ||
registerParentContextFor(varName, currentlyDefinedSuite); | ||
} | ||
return lazyVar.register(currentlyDefinedSuite.ctx, varName, definition); | ||
}; | ||
@@ -47,2 +46,6 @@ | ||
context.before(function() { | ||
this.title = title; | ||
}); | ||
context.before(registerSuite); | ||
@@ -61,5 +64,17 @@ context.beforeEach(registerSuite); | ||
function registerSuite() { | ||
currentlyRunningSuite = this; | ||
currentTestContext = this; | ||
} | ||
function registerParentContextFor(varName, suite) { | ||
if (!suite.ctx.hasOwnProperty('_parentContextForLazyVars')) { | ||
suite.ctx._parentContextForLazyVars = {}; | ||
} | ||
suite.ctx._parentContextForLazyVars[varName] = suite.parent.ctx; | ||
} | ||
function getParentContextFor(varName, testContext) { | ||
return testContext._parentContextForLazyVars ? testContext._parentContextForLazyVars[varName] : null; | ||
} | ||
context.context = context.describe; | ||
@@ -66,0 +81,0 @@ context.context.skip = context.describe.skip = describe.skip; |
var varsToClean = []; | ||
var prop = require('./symbol').for; | ||
var createdVarsPropName = prop('__createdVars'); | ||
function propNameFor(varName) { | ||
var name = '_lazy_' + varName + '_definition'; | ||
function definitionNameFor(varName) { | ||
return prop('__' + varName + 'LazyDefinition'); | ||
} | ||
return typeof Symbol !== 'undefined' ? Symbol.for(name) : name; | ||
function getDefinition(context, definitionName) { | ||
return context[definitionName]; | ||
} | ||
function markVarAsCreated(context, definitionName) { | ||
if (!context.hasOwnProperty(createdVarsPropName)) { | ||
context[createdVarsPropName] = {}; | ||
} | ||
context[createdVarsPropName][definitionName] = getDefinition(context, definitionName); | ||
} | ||
function isCreated(context, definitionName) { | ||
var calledDefinitions = context[createdVarsPropName] || {}; | ||
return calledDefinitions[definitionName] === getDefinition(context, definitionName); | ||
} | ||
var lazyVar = { | ||
register: function(context, name, definition) { | ||
var propName = propNameFor(name); | ||
var propName = definitionNameFor(name); | ||
@@ -20,11 +38,17 @@ if (context.hasOwnProperty(propName)) { | ||
isDefined: function(context, name) { | ||
return context && definitionNameFor(name) in context; | ||
}, | ||
getOrCreate: function(context, name) { | ||
if (!(propNameFor(name) in context)) { | ||
throw new Error('"' + name + '" is not defined.'); | ||
if (!lazyVar.isDefined(context, name)) { | ||
throw new Error('Lazy variable "' + name + '" is not defined.'); | ||
} | ||
var definition = lazyVar.getDefinition(context, name); | ||
var definitionName = definitionNameFor(name); | ||
var definition = getDefinition(context, definitionName); | ||
if (!context.hasOwnProperty(name)) { | ||
if (!(name in context) || !isCreated(context, definitionName)) { | ||
context[name] = typeof definition === 'function' ? definition() : definition; | ||
markVarAsCreated(context, definitionName); | ||
varsToClean.push({ context: context, name: name }); | ||
@@ -36,6 +60,2 @@ } | ||
getDefinition: function(context, name) { | ||
return context[propNameFor(name)]; | ||
}, | ||
cleanUp: function() { | ||
@@ -49,2 +69,3 @@ varsToClean.forEach(lazyVar.destroy); | ||
delete variable.context[variable.name]; | ||
delete variable.context[createdVarsPropName]; | ||
} | ||
@@ -51,0 +72,0 @@ } |
{ | ||
"name": "bdd-lazy-var", | ||
"version": "0.0.2", | ||
"version": "0.0.3", | ||
"author": "Sergii Stotskyi", | ||
@@ -5,0 +5,0 @@ "description": "Provides \"ui\" for mocha.js which allows to define lazy variables and subjects", |
@@ -145,2 +145,28 @@ describe('Lazy variables interface', function() { | ||
}); | ||
describe('when fallbacks to parent variable definition through suites tree', function() { | ||
def('var', 'John'); | ||
describe('nested suite without variable definition', function() { | ||
it('fallbacks to parent variable definition', function() { | ||
expect(get('var')).to.equal('John'); | ||
}); | ||
describe('nested suite with variable definition', function() { | ||
def('var', function() { | ||
return get('var') + ' Doe'; | ||
}); | ||
it('uses correct parent variable definition', function() { | ||
expect(get('var')).to.equal('John Doe'); | ||
}); | ||
describe('one more nested suite without variable definition', function() { | ||
it('uses correct parent variable definition', function() { | ||
expect(get('var')).to.equal('John Doe'); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); |
22975
12
401