Initial commit
[yaffs-website] / node_modules / verror / tests / tst.verror.js
1 /*
2  * tst.verror.js: tests basic functionality of the VError class.
3  */
4
5 var mod_assert = require('assert');
6 var mod_verror = require('../lib/verror');
7
8 var VError = mod_verror.VError;
9 var WError = mod_verror.WError;
10
11 var err, suberr, stack, substack;
12
13 /*
14  * Remove full paths and relative line numbers from stack traces so that we can
15  * compare against "known-good" output.
16  */
17 function cleanStack(stacktxt)
18 {
19         var re = new RegExp(__filename + ':\\d+:\\d+', 'gm');
20         stacktxt = stacktxt.replace(re, 'tst.verror.js');
21         return (stacktxt);
22 }
23
24 /*
25  * Save the generic parts of all stack traces so we can avoid hardcoding
26  * Node-specific implementation details in our testing of stack traces.
27  */
28 var nodestack = new Error().stack.split('\n').slice(2).join('\n');
29
30 /* no arguments */
31 err = new VError();
32 mod_assert.equal(err.name, 'VError');
33 mod_assert.ok(err instanceof Error);
34 mod_assert.ok(err instanceof VError);
35 mod_assert.equal(err.message, '');
36 mod_assert.ok(err.cause() === undefined);
37 stack = cleanStack(err.stack);
38 mod_assert.equal(stack, [
39     'VError',
40     '    at Object.<anonymous> (tst.verror.js)'
41 ].join('\n') + '\n' + nodestack);
42
43 /* options-argument form */
44 err = new VError({});
45 mod_assert.equal(err.message, '');
46 mod_assert.ok(err.cause() === undefined);
47
48 /* simple message */
49 err = new VError('my error');
50 mod_assert.equal(err.message, 'my error');
51 mod_assert.ok(err.cause() === undefined);
52 stack = cleanStack(err.stack);
53 mod_assert.equal(stack, [
54     'VError: my error',
55     '    at Object.<anonymous> (tst.verror.js)'
56 ].join('\n') + '\n' + nodestack);
57
58 err = new VError({}, 'my error');
59 mod_assert.equal(err.message, 'my error');
60 mod_assert.ok(err.cause() === undefined);
61
62 /* printf-style message */
63 err = new VError('%s error: %3d problems', 'very bad', 15);
64 mod_assert.equal(err.message, 'very bad error:  15 problems');
65 mod_assert.ok(err.cause() === undefined);
66
67 err = new VError({}, '%s error: %3d problems', 'very bad', 15);
68 mod_assert.equal(err.message, 'very bad error:  15 problems');
69 mod_assert.ok(err.cause() === undefined);
70
71 /* caused by another error, with no additional message */
72 suberr = new Error('root cause');
73 err = new VError(suberr);
74 mod_assert.equal(err.message, ': root cause');
75 mod_assert.ok(err.cause() === suberr);
76
77 err = new VError({ 'cause': suberr });
78 mod_assert.equal(err.message, ': root cause');
79 mod_assert.ok(err.cause() === suberr);
80
81 /* caused by another error, with annotation */
82 err = new VError(suberr, 'proximate cause: %d issues', 3);
83 mod_assert.equal(err.message, 'proximate cause: 3 issues: root cause');
84 mod_assert.ok(err.cause() === suberr);
85 stack = cleanStack(err.stack);
86 mod_assert.equal(stack, [
87     'VError: proximate cause: 3 issues: root cause',
88     '    at Object.<anonymous> (tst.verror.js)'
89 ].join('\n') + '\n' + nodestack);
90
91 err = new VError({ 'cause': suberr }, 'proximate cause: %d issues', 3);
92 mod_assert.equal(err.message, 'proximate cause: 3 issues: root cause');
93 mod_assert.ok(err.cause() === suberr);
94 stack = cleanStack(err.stack);
95 mod_assert.equal(stack, [
96     'VError: proximate cause: 3 issues: root cause',
97     '    at Object.<anonymous> (tst.verror.js)'
98 ].join('\n') + '\n' + nodestack);
99
100 /* caused by another VError, with annotation. */
101 suberr = err;
102 err = new VError(suberr, 'top');
103 mod_assert.equal(err.message, 'top: proximate cause: 3 issues: root cause');
104 mod_assert.ok(err.cause() === suberr);
105
106 err = new VError({ 'cause': suberr }, 'top');
107 mod_assert.equal(err.message, 'top: proximate cause: 3 issues: root cause');
108 mod_assert.ok(err.cause() === suberr);
109
110 /* caused by a WError */
111 suberr = new WError(new Error('root cause'), 'mid');
112 err = new VError(suberr, 'top');
113 mod_assert.equal(err.message, 'top: mid');
114 mod_assert.ok(err.cause() === suberr);
115
116 /* null cause (for backwards compatibility with older versions) */
117 err = new VError(null, 'my error');
118 mod_assert.equal(err.message, 'my error');
119 mod_assert.ok(err.cause() === undefined);
120 stack = cleanStack(err.stack);
121 mod_assert.equal(stack, [
122     'VError: my error',
123     '    at Object.<anonymous> (tst.verror.js)'
124 ].join('\n') + '\n' + nodestack);
125
126 err = new VError({ 'cause': null }, 'my error');
127 mod_assert.equal(err.message, 'my error');
128 mod_assert.ok(err.cause() === undefined);
129
130 err = new VError(null);
131 mod_assert.equal(err.message, '');
132 mod_assert.ok(err.cause() === undefined);
133 stack = cleanStack(err.stack);
134 mod_assert.equal(stack, [
135     'VError',
136     '    at Object.<anonymous> (tst.verror.js)'
137 ].join('\n') + '\n' + nodestack);
138
139 /* constructorOpt */
140 function makeErr(options) {
141         return (new VError(options, 'test error'));
142 }
143 err = makeErr({});
144 stack = cleanStack(err.stack);
145 mod_assert.equal(stack, [
146     'VError: test error',
147     '    at makeErr (tst.verror.js)',
148     '    at Object.<anonymous> (tst.verror.js)'
149 ].join('\n') + '\n' + nodestack);
150
151 err = makeErr({ 'constructorOpt': makeErr });
152 stack = cleanStack(err.stack);
153 mod_assert.equal(stack, [
154     'VError: test error',
155     '    at Object.<anonymous> (tst.verror.js)'
156 ].join('\n') + '\n' + nodestack);