var EventEmitter = require('events').EventEmitter, | |
assert = require('assert'), | |
tests = {}; | |
module.exports = test; | |
test.run = run; | |
// ## Test helpers | |
function test(msg, handler) { | |
tests[msg] = handler; | |
} | |
function run() { | |
var specs = Object.keys(tests), | |
specsRemaining = specs.length; | |
specs.forEach(function(spec) { | |
var handler = tests[spec]; | |
// grab the set of asserts for this spec | |
var shoulds = handler(), | |
keys = Object.keys(shoulds), | |
remaining = keys.length; | |
keys.forEach(function(should) { | |
var em = new EventEmitter(), | |
to = setTimeout(function() { | |
assert.fail('never ended'); | |
}, 5000); | |
em | |
.on('error', function assertFail(err) { assert.fail(err) }) | |
.on('end', function assertOk() { | |
clearTimeout(to); | |
shoulds[should].status = true; | |
// till we get to 0 | |
if(!(--remaining)) { | |
console.log([ | |
'', | |
'» ' + spec, | |
keys.map(function(k) { return ' » ' + k; }).join('\n'), | |
'', | |
' Total: ' + keys.length, | |
' Failed: ' + keys.map(function(item) { return shoulds[should].status; }).filter(function(status) { return !status; }).length, | |
'' | |
].join('\n')); | |
if(!(--specsRemaining)) { | |
console.log('All done'); | |
} | |
} | |
}); | |
shoulds[should](em); | |
}); | |
}); | |
} |