text: /*
   * 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);
  