Skip to content

Commit eeab2a3

Browse files
BridgeARrefack
authored andcommitted
doc,assert: document stackStartFunction in fail
* refactor the code 1. Rename private functions 2. Use destructuring 3. Remove obsolete comments * remove eslint rule PR-URL: #13862 Reviewed-By: Refael Ackermann <[email protected]> Reviewed-By: Joyee Cheung <[email protected]>
1 parent 421365d commit eeab2a3

File tree

3 files changed

+66
-38
lines changed

3 files changed

+66
-38
lines changed

doc/api/assert.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,22 +194,25 @@ If the values are not equal, an `AssertionError` is thrown with a `message`
194194
property set equal to the value of the `message` parameter. If the `message`
195195
parameter is undefined, a default error message is assigned.
196196

197-
## assert.fail(message)
197+
## assert.fail([message])
198198
## assert.fail(actual, expected[, message[, operator[, stackStartFunction]]])
199199
<!-- YAML
200200
added: v0.1.21
201201
-->
202202
* `actual` {any}
203203
* `expected` {any}
204-
* `message` {any}
204+
* `message` {any} (default: 'Failed')
205205
* `operator` {string} (default: '!=')
206206
* `stackStartFunction` {function} (default: `assert.fail`)
207207

208208
Throws an `AssertionError`. If `message` is falsy, the error message is set as
209209
the values of `actual` and `expected` separated by the provided `operator`.
210-
Otherwise, the error message is the value of `message`.
210+
If just the two `actual` and `expected` arguments are provided, `operator` will
211+
default to `'!='`. If `message` is provided only it will be used as the error
212+
message, the other arguments will be stored as properties on the thrown object.
211213
If `stackStartFunction` is provided, all stack frames above that function will
212-
be removed from stacktrace (see [`Error.captureStackTrace`]).
214+
be removed from stacktrace (see [`Error.captureStackTrace`]). If no arguments
215+
are given, the default message `Failed` will be used.
213216

214217
```js
215218
const assert = require('assert');
@@ -222,6 +225,14 @@ assert.fail(1, 2, 'fail');
222225

223226
assert.fail(1, 2, 'whoops', '>');
224227
// AssertionError: whoops
228+
```
229+
230+
*Note*: Is the last two cases `actual`, `expected`, and `operator` have no
231+
influence on the error message.
232+
233+
```js
234+
assert.fail();
235+
// AssertionError: Failed
225236

226237
assert.fail('boom');
227238
// AssertionError: boom

lib/assert.js

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
const { compare } = process.binding('buffer');
2424
const util = require('util');
25-
const Buffer = require('buffer').Buffer;
25+
const { Buffer } = require('buffer');
2626
const pToString = (obj) => Object.prototype.toString.call(obj);
2727

2828
// The assert module provides functions that throw
@@ -76,53 +76,65 @@ function getMessage(self) {
7676
// both the actual and expected values to the assertion error for
7777
// display purposes.
7878

79+
function innerFail(actual, expected, message, operator, stackStartFunction) {
80+
throw new assert.AssertionError({
81+
message,
82+
actual,
83+
expected,
84+
operator,
85+
stackStartFunction
86+
});
87+
}
88+
7989
function fail(actual, expected, message, operator, stackStartFunction) {
80-
if (arguments.length === 1)
90+
if (arguments.length === 0) {
91+
message = 'Failed';
92+
}
93+
if (arguments.length === 1) {
8194
message = actual;
82-
if (arguments.length === 2)
95+
actual = undefined;
96+
}
97+
if (arguments.length === 2) {
8398
operator = '!=';
84-
throw new assert.AssertionError({
85-
message: message,
86-
actual: actual,
87-
expected: expected,
88-
operator: operator,
89-
stackStartFunction: stackStartFunction
90-
});
99+
}
100+
innerFail(actual, expected, message, operator, stackStartFunction || fail);
91101
}
92102
assert.fail = fail;
93103

94104
// Pure assertion tests whether a value is truthy, as determined
95105
// by !!value.
96106
function ok(value, message) {
97-
if (!value) fail(value, true, message, '==', ok);
107+
if (!value) innerFail(value, true, message, '==', ok);
98108
}
99109
assert.ok = ok;
100110

101111
// The equality assertion tests shallow, coercive equality with ==.
102112
/* eslint-disable no-restricted-properties */
103113
assert.equal = function equal(actual, expected, message) {
104-
if (actual != expected) fail(actual, expected, message, '==', assert.equal);
114+
// eslint-disable-next-line eqeqeq
115+
if (actual != expected) innerFail(actual, expected, message, '==', equal);
105116
};
106117

107118
// The non-equality assertion tests for whether two objects are not
108119
// equal with !=.
109120
assert.notEqual = function notEqual(actual, expected, message) {
121+
// eslint-disable-next-line eqeqeq
110122
if (actual == expected) {
111-
fail(actual, expected, message, '!=', notEqual);
123+
innerFail(actual, expected, message, '!=', notEqual);
112124
}
113125
};
114126

115127
// The equivalence assertion tests a deep equality relation.
116128
assert.deepEqual = function deepEqual(actual, expected, message) {
117129
if (!innerDeepEqual(actual, expected, false)) {
118-
fail(actual, expected, message, 'deepEqual', deepEqual);
130+
innerFail(actual, expected, message, 'deepEqual', deepEqual);
119131
}
120132
};
121133
/* eslint-enable */
122134

123135
assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
124136
if (!innerDeepEqual(actual, expected, true)) {
125-
fail(actual, expected, message, 'deepStrictEqual', deepStrictEqual);
137+
innerFail(actual, expected, message, 'deepStrictEqual', deepStrictEqual);
126138
}
127139
};
128140

@@ -246,31 +258,30 @@ function objEquiv(a, b, strict, actualVisitedObjects) {
246258
// The non-equivalence assertion tests for any deep inequality.
247259
assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
248260
if (innerDeepEqual(actual, expected, false)) {
249-
fail(actual, expected, message, 'notDeepEqual', notDeepEqual);
261+
innerFail(actual, expected, message, 'notDeepEqual', notDeepEqual);
250262
}
251263
};
252264

253265
assert.notDeepStrictEqual = notDeepStrictEqual;
254266
function notDeepStrictEqual(actual, expected, message) {
255267
if (innerDeepEqual(actual, expected, true)) {
256-
fail(actual, expected, message, 'notDeepStrictEqual',
257-
notDeepStrictEqual);
268+
innerFail(actual, expected, message, 'notDeepStrictEqual',
269+
notDeepStrictEqual);
258270
}
259271
}
260272

261-
262273
// The strict equality assertion tests strict equality, as determined by ===.
263274
assert.strictEqual = function strictEqual(actual, expected, message) {
264275
if (actual !== expected) {
265-
fail(actual, expected, message, '===', strictEqual);
276+
innerFail(actual, expected, message, '===', strictEqual);
266277
}
267278
};
268279

269280
// The strict non-equality assertion tests for strict inequality, as
270281
// determined by !==.
271282
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
272283
if (actual === expected) {
273-
fail(actual, expected, message, '!==', notStrictEqual);
284+
innerFail(actual, expected, message, '!==', notStrictEqual);
274285
}
275286
};
276287

@@ -325,7 +336,7 @@ function innerThrows(shouldThrow, block, expected, message) {
325336
(message ? ' ' + message : '.');
326337

327338
if (shouldThrow && !actual) {
328-
fail(actual, expected, 'Missing expected exception' + message, fail);
339+
innerFail(actual, expected, 'Missing expected exception' + message, fail);
329340
}
330341

331342
const userProvidedMessage = typeof message === 'string';
@@ -336,7 +347,7 @@ function innerThrows(shouldThrow, block, expected, message) {
336347
userProvidedMessage &&
337348
expectedException(actual, expected)) ||
338349
isUnexpectedException) {
339-
fail(actual, expected, 'Got unwanted exception' + message, fail);
350+
innerFail(actual, expected, 'Got unwanted exception' + message, fail);
340351
}
341352

342353
if ((shouldThrow && actual && expected &&
@@ -354,4 +365,4 @@ assert.doesNotThrow = function doesNotThrow(block, error, message) {
354365
innerThrows(false, block, error, message);
355366
};
356367

357-
assert.ifError = function ifError(err) { if (err) throw err; };
368+
assert.ifError = function(err) { if (err) throw err; };

test/parallel/test-assert-fail.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,41 @@
22

33
require('../common');
44
const assert = require('assert');
5+
const { AssertionError } = assert;
56

6-
// no args
7+
// No args
78
assert.throws(
89
() => { assert.fail(); },
9-
/^AssertionError: undefined undefined undefined$/
10+
AssertionError,
11+
'Failed'
1012
);
1113

12-
// one arg = message
14+
// One arg = message
1315
assert.throws(
1416
() => { assert.fail('custom message'); },
15-
/^AssertionError: custom message$/
17+
AssertionError,
18+
'custom message'
1619
);
1720

18-
// two args only, operator defaults to '!='
21+
// Two args only, operator defaults to '!='
1922
assert.throws(
2023
() => { assert.fail('first', 'second'); },
21-
/^AssertionError: 'first' != 'second'$/
24+
AssertionError,
25+
'\'first\' != \'second\''
2226
);
2327

24-
// three args
28+
// Three args
2529
assert.throws(
2630
() => { assert.fail('ignored', 'ignored', 'another custom message'); },
27-
/^AssertionError: another custom message$/
31+
AssertionError,
32+
'another custom message'
2833
);
2934

30-
// no third arg (but a fourth arg)
35+
// No third arg (but a fourth arg)
3136
assert.throws(
3237
() => { assert.fail('first', 'second', undefined, 'operator'); },
33-
/^AssertionError: 'first' operator 'second'$/
38+
AssertionError,
39+
'\'first\' operator \'second\''
3440
);
3541

3642
// The stackFrameFunction should exclude the foo frame

0 commit comments

Comments
 (0)