157 lines
4.9 KiB
JavaScript
157 lines
4.9 KiB
JavaScript
|
/*
|
||
|
* tst.verror.js: tests basic functionality of the VError class.
|
||
|
*/
|
||
|
|
||
|
var mod_assert = require('assert');
|
||
|
var mod_verror = require('../lib/verror');
|
||
|
|
||
|
var VError = mod_verror.VError;
|
||
|
var WError = mod_verror.WError;
|
||
|
|
||
|
var err, suberr, stack, substack;
|
||
|
|
||
|
/*
|
||
|
* Remove full paths and relative line numbers from stack traces so that we can
|
||
|
* compare against "known-good" output.
|
||
|
*/
|
||
|
function cleanStack(stacktxt)
|
||
|
{
|
||
|
var re = new RegExp(__filename + ':\\d+:\\d+', 'gm');
|
||
|
stacktxt = stacktxt.replace(re, 'tst.verror.js');
|
||
|
return (stacktxt);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Save the generic parts of all stack traces so we can avoid hardcoding
|
||
|
* Node-specific implementation details in our testing of stack traces.
|
||
|
*/
|
||
|
var nodestack = new Error().stack.split('\n').slice(2).join('\n');
|
||
|
|
||
|
/* no arguments */
|
||
|
err = new VError();
|
||
|
mod_assert.equal(err.name, 'VError');
|
||
|
mod_assert.ok(err instanceof Error);
|
||
|
mod_assert.ok(err instanceof VError);
|
||
|
mod_assert.equal(err.message, '');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
stack = cleanStack(err.stack);
|
||
|
mod_assert.equal(stack, [
|
||
|
'VError',
|
||
|
' at Object.<anonymous> (tst.verror.js)'
|
||
|
].join('\n') + '\n' + nodestack);
|
||
|
|
||
|
/* options-argument form */
|
||
|
err = new VError({});
|
||
|
mod_assert.equal(err.message, '');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
|
||
|
/* simple message */
|
||
|
err = new VError('my error');
|
||
|
mod_assert.equal(err.message, 'my error');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
stack = cleanStack(err.stack);
|
||
|
mod_assert.equal(stack, [
|
||
|
'VError: my error',
|
||
|
' at Object.<anonymous> (tst.verror.js)'
|
||
|
].join('\n') + '\n' + nodestack);
|
||
|
|
||
|
err = new VError({}, 'my error');
|
||
|
mod_assert.equal(err.message, 'my error');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
|
||
|
/* printf-style message */
|
||
|
err = new VError('%s error: %3d problems', 'very bad', 15);
|
||
|
mod_assert.equal(err.message, 'very bad error: 15 problems');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
|
||
|
err = new VError({}, '%s error: %3d problems', 'very bad', 15);
|
||
|
mod_assert.equal(err.message, 'very bad error: 15 problems');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
|
||
|
/* caused by another error, with no additional message */
|
||
|
suberr = new Error('root cause');
|
||
|
err = new VError(suberr);
|
||
|
mod_assert.equal(err.message, ': root cause');
|
||
|
mod_assert.ok(err.cause() === suberr);
|
||
|
|
||
|
err = new VError({ 'cause': suberr });
|
||
|
mod_assert.equal(err.message, ': root cause');
|
||
|
mod_assert.ok(err.cause() === suberr);
|
||
|
|
||
|
/* caused by another error, with annotation */
|
||
|
err = new VError(suberr, 'proximate cause: %d issues', 3);
|
||
|
mod_assert.equal(err.message, 'proximate cause: 3 issues: root cause');
|
||
|
mod_assert.ok(err.cause() === suberr);
|
||
|
stack = cleanStack(err.stack);
|
||
|
mod_assert.equal(stack, [
|
||
|
'VError: proximate cause: 3 issues: root cause',
|
||
|
' at Object.<anonymous> (tst.verror.js)'
|
||
|
].join('\n') + '\n' + nodestack);
|
||
|
|
||
|
err = new VError({ 'cause': suberr }, 'proximate cause: %d issues', 3);
|
||
|
mod_assert.equal(err.message, 'proximate cause: 3 issues: root cause');
|
||
|
mod_assert.ok(err.cause() === suberr);
|
||
|
stack = cleanStack(err.stack);
|
||
|
mod_assert.equal(stack, [
|
||
|
'VError: proximate cause: 3 issues: root cause',
|
||
|
' at Object.<anonymous> (tst.verror.js)'
|
||
|
].join('\n') + '\n' + nodestack);
|
||
|
|
||
|
/* caused by another VError, with annotation. */
|
||
|
suberr = err;
|
||
|
err = new VError(suberr, 'top');
|
||
|
mod_assert.equal(err.message, 'top: proximate cause: 3 issues: root cause');
|
||
|
mod_assert.ok(err.cause() === suberr);
|
||
|
|
||
|
err = new VError({ 'cause': suberr }, 'top');
|
||
|
mod_assert.equal(err.message, 'top: proximate cause: 3 issues: root cause');
|
||
|
mod_assert.ok(err.cause() === suberr);
|
||
|
|
||
|
/* caused by a WError */
|
||
|
suberr = new WError(new Error('root cause'), 'mid');
|
||
|
err = new VError(suberr, 'top');
|
||
|
mod_assert.equal(err.message, 'top: mid');
|
||
|
mod_assert.ok(err.cause() === suberr);
|
||
|
|
||
|
/* null cause (for backwards compatibility with older versions) */
|
||
|
err = new VError(null, 'my error');
|
||
|
mod_assert.equal(err.message, 'my error');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
stack = cleanStack(err.stack);
|
||
|
mod_assert.equal(stack, [
|
||
|
'VError: my error',
|
||
|
' at Object.<anonymous> (tst.verror.js)'
|
||
|
].join('\n') + '\n' + nodestack);
|
||
|
|
||
|
err = new VError({ 'cause': null }, 'my error');
|
||
|
mod_assert.equal(err.message, 'my error');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
|
||
|
err = new VError(null);
|
||
|
mod_assert.equal(err.message, '');
|
||
|
mod_assert.ok(err.cause() === undefined);
|
||
|
stack = cleanStack(err.stack);
|
||
|
mod_assert.equal(stack, [
|
||
|
'VError',
|
||
|
' at Object.<anonymous> (tst.verror.js)'
|
||
|
].join('\n') + '\n' + nodestack);
|
||
|
|
||
|
/* constructorOpt */
|
||
|
function makeErr(options) {
|
||
|
return (new VError(options, 'test error'));
|
||
|
}
|
||
|
err = makeErr({});
|
||
|
stack = cleanStack(err.stack);
|
||
|
mod_assert.equal(stack, [
|
||
|
'VError: test error',
|
||
|
' at makeErr (tst.verror.js)',
|
||
|
' at Object.<anonymous> (tst.verror.js)'
|
||
|
].join('\n') + '\n' + nodestack);
|
||
|
|
||
|
err = makeErr({ 'constructorOpt': makeErr });
|
||
|
stack = cleanStack(err.stack);
|
||
|
mod_assert.equal(stack, [
|
||
|
'VError: test error',
|
||
|
' at Object.<anonymous> (tst.verror.js)'
|
||
|
].join('\n') + '\n' + nodestack);
|