return this.each(function(test, next) { var empty = function(next) { next() } var context = test.context || this if (test.setUp) var setUp = async.makeAsync(0, test.setUp, context) else setUp = empty tearDownCalled = false if (test.tearDown) var tearDownInner = async.makeAsync(0, test.tearDown, context) else tearDownInner = empty function tearDown(next) { tearDownCalled = true tearDownInner.call(test.context, next) } var testFn = async.makeAsync(0, test.fn, context) test.test = function(callback) { var called function errorListener(e) { if (called) return called = true //process.removeListener('uncaughtException', errorListener) if (!tearDownCalled) { async.list([tearDown]) .call() .timeout(test.timeout) .end(function() { callback(e, false) }) } else callback(e, false) } //process.addListener('uncaughtException', errorListener) async.list([setUp, testFn, tearDown]) .delay(0) .call(context) .timeout(test.timeout) .toArray(false, function(errors, values) { if (called) return called = true var err = errors[1] //process.removeListener('uncaughtException', errorListener) callback(err, !err) }) } next() })
exports.testcase = function(testcase, suiteName, timeout) { var methods = [] for (var method in testcase) methods.push(method) var setUp = testcase.setUp || null var tearDown = testcase.tearDown || null var single methods.forEach(function(name) { if (name.charAt(0) == '>') single = name }) if (single) methods = [single] var testNames = methods.filter(function(method) { return method.match(/^>?test/) && typeof(testcase[method]) == "function" }) var count = testNames.length var i=1 tests = testNames.map(function(name) { return { suiteName: suiteName || testcase.name || "", name: name, setUp: setUp, tearDown: tearDown, context: testcase, timeout: timeout === undefined ? 3000 : timeout, fn: testcase[name], count: count, index: i++ } }) if (testcase.setUpSuite) { tests[0].setUpSuite = async.makeAsync(0, testcase.setUpSuite, testcase) } if (testcase.tearDownSuite) { tests[tests.length-1].tearDownSuite = async.makeAsync(0, testcase.tearDownSuite, testcase) } return async.list(tests, exports.TestGenerator) }