bitcoinjs-lib/test/mockme.js
2018-03-20 14:03:38 +11:00

66 lines
1.4 KiB
JavaScript

// TODO: move to own dependency
function mockme (f) {
var mocks = []
function mock (constructor, functionName, func, n) {
n = n || Infinity
var initial = constructor[functionName]
var context = constructor.constructor.name !== 'Function' ? constructor : null
function __mock () {
if (func.calls > n) throw new RangeError('Exceeded expected number of calls')
var r = func.apply(context, arguments)
++func.calls
return r
}
func.calls = 0
func.expected = n
func.reset = function reset () {
constructor[functionName] = initial
}
constructor[functionName] = __mock
mocks.push(func)
}
function stub (func, n) {
n = n || Infinity
function __stub () {
if (func.calls > n) throw new RangeError('Exceeded expected number of calls')
var r = func.apply(null, arguments)
++func.calls
return r
}
func.calls = 0
func.expected = n
mocks.push(func)
return __stub
}
return function run () {
var err
try {
f.apply({
mock: mock,
stub: stub
}, arguments)
} catch (e) {
err = e
}
mocks.forEach(function (x) {
if (!err) {
if (x.expected !== Infinity && x.calls !== x.expected) {
err = new RangeError('Too few calls')
}
}
if (x.reset) x.reset()
})
if (err) throw err
}
}
module.exports = mockme