blob: c8cdc615afaefafb097d74e392a881287d94cfaf [file] [log] [blame]
/*
* tst.werror.js: tests basic functionality of the WError 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.werror.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 WError();
mod_assert.equal(err.name, 'WError');
mod_assert.ok(err instanceof Error);
mod_assert.ok(err instanceof WError);
mod_assert.equal(err.message, '');
mod_assert.equal(err.toString(), 'WError');
mod_assert.ok(err.cause() === undefined);
stack = cleanStack(err.stack);
mod_assert.equal(stack, [
'WError',
' at Object.<anonymous> (tst.werror.js)'
].join('\n') + '\n' + nodestack);
/* options-argument form */
err = new WError({});
mod_assert.equal(err.message, '');
mod_assert.equal(err.toString(), 'WError');
mod_assert.ok(err.cause() === undefined);
/* simple message */
err = new WError('my error');
mod_assert.equal(err.message, 'my error');
mod_assert.equal(err.toString(), 'WError: my error');
mod_assert.ok(err.cause() === undefined);
stack = cleanStack(err.stack);
mod_assert.equal(stack, [
'WError: my error',
' at Object.<anonymous> (tst.werror.js)'
].join('\n') + '\n' + nodestack);
err = new WError({}, 'my error');
mod_assert.equal(err.message, 'my error');
mod_assert.equal(err.toString(), 'WError: my error');
mod_assert.ok(err.cause() === undefined);
/* printf-style message */
err = new WError('%s error: %3d problems', 'very bad', 15);
mod_assert.equal(err.message, 'very bad error: 15 problems');
mod_assert.equal(err.toString(), 'WError: very bad error: 15 problems');
mod_assert.ok(err.cause() === undefined);
err = new WError({}, '%s error: %3d problems', 'very bad', 15);
mod_assert.equal(err.message, 'very bad error: 15 problems');
mod_assert.equal(err.toString(), 'WError: 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 WError(suberr);
mod_assert.equal(err.message, '');
mod_assert.equal(err.toString(), 'WError; caused by Error: root cause');
mod_assert.ok(err.cause() === suberr);
err = new WError({ 'cause': suberr });
mod_assert.equal(err.message, '');
mod_assert.equal(err.toString(), 'WError; caused by Error: root cause');
mod_assert.ok(err.cause() === suberr);
/* caused by another error, with annotation */
err = new WError(suberr, 'proximate cause: %d issues', 3);
mod_assert.equal(err.message, 'proximate cause: 3 issues');
mod_assert.equal(err.toString(), 'WError: proximate cause: 3 issues; ' +
'caused by Error: root cause');
mod_assert.ok(err.cause() === suberr);
stack = cleanStack(err.stack);
mod_assert.equal(stack, [
'WError: proximate cause: 3 issues; caused by Error: root cause',
' at Object.<anonymous> (tst.werror.js)'
].join('\n') + '\n' + nodestack);
err = new WError({ 'cause': suberr }, 'proximate cause: %d issues', 3);
mod_assert.equal(err.message, 'proximate cause: 3 issues');
mod_assert.equal(err.toString(), 'WError: proximate cause: 3 issues; ' +
'caused by Error: root cause');
mod_assert.ok(err.cause() === suberr);
stack = cleanStack(err.stack);
mod_assert.equal(stack, [
'WError: proximate cause: 3 issues; caused by Error: root cause',
' at Object.<anonymous> (tst.werror.js)'
].join('\n') + '\n' + nodestack);
/* caused by another WError, with annotation. */
suberr = err;
err = new WError(suberr, 'top');
mod_assert.equal(err.message, 'top');
mod_assert.equal(err.toString(), 'WError: top; caused by WError: ' +
'proximate cause: 3 issues; caused by Error: root cause');
mod_assert.ok(err.cause() === suberr);
err = new WError({ 'cause': suberr }, 'top');
mod_assert.equal(err.message, 'top');
mod_assert.equal(err.toString(), 'WError: top; caused by WError: ' +
'proximate cause: 3 issues; caused by Error: root cause');
mod_assert.ok(err.cause() === suberr);
/* caused by a VError */
suberr = new VError(new Error('root cause'), 'mid');
err = new WError(suberr, 'top');
mod_assert.equal(err.message, 'top');
mod_assert.equal(err.toString(),
'WError: top; caused by VError: mid: root cause');
mod_assert.ok(err.cause() === suberr);
/* null cause (for backwards compatibility with older versions) */
err = new WError(null, 'my error');
mod_assert.equal(err.message, 'my error');
mod_assert.equal(err.toString(), 'WError: my error');
mod_assert.ok(err.cause() === undefined);
stack = cleanStack(err.stack);
mod_assert.equal(stack, [
'WError: my error',
' at Object.<anonymous> (tst.werror.js)'
].join('\n') + '\n' + nodestack);
err = new WError({ 'cause': null }, 'my error');
mod_assert.equal(err.message, 'my error');
mod_assert.equal(err.toString(), 'WError: my error');
mod_assert.ok(err.cause() === undefined);
err = new WError(null);
mod_assert.equal(err.message, '');
mod_assert.equal(err.toString(), 'WError');
mod_assert.ok(err.cause() === undefined);
stack = cleanStack(err.stack);
mod_assert.equal(stack, [
'WError',
' at Object.<anonymous> (tst.werror.js)'
].join('\n') + '\n' + nodestack);
/* constructorOpt */
function makeErr(options) {
return (new WError(options, 'test error'));
}
err = makeErr({});
mod_assert.equal(err.toString(), 'WError: test error');
stack = cleanStack(err.stack);
mod_assert.equal(stack, [
'WError: test error',
' at makeErr (tst.werror.js)',
' at Object.<anonymous> (tst.werror.js)'
].join('\n') + '\n' + nodestack);
err = makeErr({ 'constructorOpt': makeErr });
mod_assert.equal(err.toString(), 'WError: test error');
stack = cleanStack(err.stack);
mod_assert.equal(stack, [
'WError: test error',
' at Object.<anonymous> (tst.werror.js)'
].join('\n') + '\n' + nodestack);