| 'use strict' |
| |
| var test = require('tape') |
| |
| var nextTick = typeof setImmediate !== 'undefined' |
| ? setImmediate : process.nextTick |
| |
| function noop () {} |
| |
| module.exports = function (opts) { |
| var invoked = false |
| var id = opts.id |
| var testPrefix = id || '' |
| |
| var harness = {} |
| |
| harness.tests = [] |
| harness.checkLeaks = typeof opts.checkLeaks === 'boolean' |
| ? opts.checkLeaks : true |
| harness.globalCount = Object.keys(global).length |
| |
| harness.timeout = +(opts.timeout || 200) |
| harness.locals = opts.locals || {} |
| |
| // |
| // locals must be available here |
| // |
| harness.setup = opts.setup || noop |
| harness.teardown = opts.teardown || noop |
| |
| function runTest (name, next, onEnd) { |
| test(testPrefix + '\n## ' + name, function (assert) { |
| nextTick(function () { next.call(harness.locals, assert) }) |
| |
| var tmout = setTimeout(function () { |
| assert.fail('timed out') |
| assert.end() |
| }, harness.timeout) |
| |
| assert.on('end', function () { |
| if (onEnd) { |
| onEnd(assert) |
| } |
| clearTimeout(tmout) |
| }) |
| }) |
| } |
| |
| harness.it = function (name, next) { |
| harness.tests.push({ name: name, next: next }) |
| if (!invoked) { |
| invoked = true |
| nextTick(function () { |
| runTest('setup', harness.setup) |
| harness.tests.forEach(function (elem) { |
| runTest(elem.name, elem.next) |
| }) |
| runTest('teardown', harness.teardown, function (assert) { |
| if (harness.checkLeaks) { |
| assert.deepEqual(Object.keys(global) |
| .splice(harness.globalCount, Number.MAX_VALUE), |
| [], 'No leaks') |
| } |
| }) |
| }) |
| } |
| } |
| |
| return harness |
| } |