wallet-rpc: fix listsinceblock height wdb: fix getWalletPaths() always return nothing wallet: add unlockCoins() for lockunspent rpc wallet-rpc: correct num args for some rpc calls wallet-rpc: fix args for importwallet and importprunedfunds wallet-rpc: importprunedfunds error misleading wallet-rpc: importPubkey args wallet-rpc: listsinceblock arg count error wallet-rpc: listTransactions ignoring account param wallet-rpc: better sendMany error msgs wallet-rpc: sendMany subtractfee is bool not obj wallet-rpc: dont check if not implemented test: add rpc-test
228 lines
5.1 KiB
JavaScript
228 lines
5.1 KiB
JavaScript
'use strict';
|
|
|
|
const _assert = require('assert');
|
|
const util = require('util');
|
|
|
|
const assert = function assert(value, message) {
|
|
if (!value) {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual: value,
|
|
expected: true,
|
|
operator: '==',
|
|
stackStartFunction: assert
|
|
});
|
|
}
|
|
};
|
|
|
|
Object.setPrototypeOf(assert, _assert);
|
|
|
|
assert.typeOf = function typeOf(value, expected, message) {
|
|
_isString(expected, '`expected` must be a string.', typeOf);
|
|
|
|
const actual = _typeOf(value);
|
|
|
|
if (actual !== expected) {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual,
|
|
expected,
|
|
operator: 'typeof ==',
|
|
stackStartFunction: typeOf
|
|
});
|
|
}
|
|
};
|
|
|
|
assert.notTypeOf = function notTypeOf(value, expected, message) {
|
|
_isString(expected, '`expected` must be a string.', notTypeOf);
|
|
|
|
const actual = _typeOf(value);
|
|
|
|
if (actual === expected) {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual,
|
|
expected,
|
|
operator: 'typeof !=',
|
|
stackStartFunction: notTypeOf
|
|
});
|
|
}
|
|
};
|
|
|
|
assert.instanceOf = function instanceOf(object, parent, message) {
|
|
_isFunction(parent, '`parent` must be a constructor.', instanceOf);
|
|
|
|
if (!(object instanceof parent)) {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual: _getConstructorName(object),
|
|
expected: _getFunctionName(parent),
|
|
operator: 'instanceof',
|
|
stackStartFunction: instanceOf
|
|
});
|
|
}
|
|
};
|
|
|
|
assert.notInstanceOf = function notInstanceOf(object, parent, message) {
|
|
_isFunction(parent, '`parent` must be a constructor.', notInstanceOf);
|
|
|
|
if (object instanceof parent) {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual: _getConstructorName(object),
|
|
expected: _getFunctionName(parent),
|
|
operator: 'not instanceof',
|
|
stackStartFunction: notInstanceOf
|
|
});
|
|
}
|
|
};
|
|
|
|
assert.bufferEqual = function bufferEqual(actual, expected, message) {
|
|
_isBuffer(actual, '`actual` must be a buffer.', bufferEqual);
|
|
_isBuffer(expected, '`expected` must be a buffer.', bufferEqual);
|
|
|
|
if (actual !== expected && !actual.equals(expected)) {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual: actual.toString('hex'),
|
|
expected: expected.toString('hex'),
|
|
operator: '===',
|
|
stackStartFunction: bufferEqual
|
|
});
|
|
}
|
|
};
|
|
|
|
assert.notBufferEqual = function notBufferEqual(actual, expected, message) {
|
|
_isBuffer(actual, '`actual` must be a buffer.', notBufferEqual);
|
|
_isBuffer(expected, '`expected` must be a buffer.', notBufferEqual);
|
|
|
|
if (actual === expected || actual.equals(expected)) {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual: actual.toString('hex'),
|
|
expected: expected.toString('hex'),
|
|
operator: '!==',
|
|
stackStartFunction: notBufferEqual
|
|
});
|
|
}
|
|
};
|
|
|
|
// node V10 implements assert.rejects() but this is compatible with V8
|
|
assert.asyncThrows = async function asyncThrows(func, expectedError) {
|
|
let err = null;
|
|
try {
|
|
await func();
|
|
} catch (e) {
|
|
err = e;
|
|
}
|
|
const re = new RegExp('^' + expectedError);
|
|
assert(re.test(err.message));
|
|
};
|
|
|
|
function _isString(value, message, stackStartFunction) {
|
|
if (typeof value !== 'string') {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual: _typeOf(value),
|
|
expected: 'string',
|
|
operator: 'typeof ==',
|
|
stackStartFunction
|
|
});
|
|
}
|
|
}
|
|
|
|
function _isFunction(value, message, stackStartFunction) {
|
|
if (typeof value !== 'function') {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual: _typeOf(value),
|
|
expected: 'function',
|
|
operator: 'typeof ==',
|
|
stackStartFunction
|
|
});
|
|
}
|
|
}
|
|
|
|
function _isBuffer(value, message, stackStartFunction) {
|
|
if (!Buffer.isBuffer(value)) {
|
|
throw new assert.AssertionError({
|
|
message,
|
|
actual: _typeOf(value),
|
|
expected: 'buffer',
|
|
operator: 'typeof ==',
|
|
stackStartFunction
|
|
});
|
|
}
|
|
}
|
|
|
|
function _typeOf(value) {
|
|
const type = typeof value;
|
|
|
|
switch (type) {
|
|
case 'object':
|
|
if (value === null)
|
|
return 'null';
|
|
|
|
if (Array.isArray(value))
|
|
return 'array';
|
|
|
|
if (Buffer.isBuffer(value))
|
|
return 'buffer';
|
|
|
|
if (ArrayBuffer.isView(value))
|
|
return 'arraybuffer';
|
|
|
|
if (util.isError(value))
|
|
return 'error';
|
|
|
|
if (util.isDate(value))
|
|
return 'date';
|
|
|
|
if (util.isRegExp(value))
|
|
return 'regexp';
|
|
|
|
break;
|
|
case 'number':
|
|
if (!isFinite(value))
|
|
return 'nan';
|
|
break;
|
|
}
|
|
|
|
return type;
|
|
}
|
|
|
|
function _getConstructorName(object) {
|
|
if (object === undefined)
|
|
return 'undefined';
|
|
|
|
if (object === null)
|
|
return 'null';
|
|
|
|
const proto = Object.getPrototypeOf(object);
|
|
|
|
// Should never happen.
|
|
if (proto === undefined)
|
|
throw new Error('Bad prototype.');
|
|
|
|
// Inherited from `null`.
|
|
if (proto === null)
|
|
return 'Null';
|
|
|
|
// Someone overwrote their
|
|
// constructor property?
|
|
if (!proto.constructor)
|
|
return 'Object';
|
|
|
|
// Non-named constructor function.
|
|
if (!proto.constructor.name)
|
|
return 'Unknown';
|
|
|
|
return proto.constructor.name;
|
|
}
|
|
|
|
function _getFunctionName(func) {
|
|
return func.name || 'Unknown';
|
|
}
|
|
|
|
module.exports = assert;
|