Skip to content

Commit 7cf569a

Browse files
committed
assert: use object argument in innerFail
Right now it is difficult to know what argument stands for what property. By refactoring the arguments into a object it is clear what stands for what. PR-URL: #17582 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Jon Moss <me@jonathanmoss.me> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
1 parent a364e7e commit 7cf569a

File tree

4 files changed

+104
-29
lines changed

4 files changed

+104
-29
lines changed

lib/assert.js

+92-26
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,13 @@ const assert = module.exports = ok;
3636
// both the actual and expected values to the assertion error for
3737
// display purposes.
3838

39-
function innerFail(actual, expected, message, operator, stackStartFunction) {
40-
if (message instanceof Error) throw message;
39+
function innerFail(obj) {
40+
if (obj.message instanceof Error) throw obj.message;
4141

42-
throw new errors.AssertionError({
43-
message,
44-
actual,
45-
expected,
46-
operator,
47-
stackStartFunction
48-
});
42+
throw new errors.AssertionError(obj);
4943
}
5044

51-
function fail(actual, expected, message, operator, stackStartFunction) {
45+
function fail(actual, expected, message, operator, stackStartFn) {
5246
const argsLen = arguments.length;
5347

5448
if (argsLen === 0) {
@@ -60,7 +54,13 @@ function fail(actual, expected, message, operator, stackStartFunction) {
6054
operator = '!=';
6155
}
6256

63-
innerFail(actual, expected, message, operator, stackStartFunction || fail);
57+
innerFail({
58+
actual,
59+
expected,
60+
message,
61+
operator,
62+
stackStartFn: stackStartFn || fail
63+
});
6464
}
6565

6666
assert.fail = fail;
@@ -75,64 +75,121 @@ assert.AssertionError = errors.AssertionError;
7575
// Pure assertion tests whether a value is truthy, as determined
7676
// by !!value.
7777
function ok(value, message) {
78-
if (!value) innerFail(value, true, message, '==', ok);
78+
if (!value) {
79+
innerFail({
80+
actual: value,
81+
expected: true,
82+
message,
83+
operator: '==',
84+
stackStartFn: ok
85+
});
86+
}
7987
}
8088
assert.ok = ok;
8189

8290
// The equality assertion tests shallow, coercive equality with ==.
8391
/* eslint-disable no-restricted-properties */
8492
assert.equal = function equal(actual, expected, message) {
8593
// eslint-disable-next-line eqeqeq
86-
if (actual != expected) innerFail(actual, expected, message, '==', equal);
94+
if (actual != expected) {
95+
innerFail({
96+
actual,
97+
expected,
98+
message,
99+
operator: '==',
100+
stackStartFn: equal
101+
});
102+
}
87103
};
88104

89105
// The non-equality assertion tests for whether two objects are not
90106
// equal with !=.
91107
assert.notEqual = function notEqual(actual, expected, message) {
92108
// eslint-disable-next-line eqeqeq
93109
if (actual == expected) {
94-
innerFail(actual, expected, message, '!=', notEqual);
110+
innerFail({
111+
actual,
112+
expected,
113+
message,
114+
operator: '!=',
115+
stackStartFn: notEqual
116+
});
95117
}
96118
};
97119

98120
// The equivalence assertion tests a deep equality relation.
99121
assert.deepEqual = function deepEqual(actual, expected, message) {
100122
if (!isDeepEqual(actual, expected)) {
101-
innerFail(actual, expected, message, 'deepEqual', deepEqual);
123+
innerFail({
124+
actual,
125+
expected,
126+
message,
127+
operator: 'deepEqual',
128+
stackStartFn: deepEqual
129+
});
102130
}
103131
};
104132

105133
// The non-equivalence assertion tests for any deep inequality.
106134
assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
107135
if (isDeepEqual(actual, expected)) {
108-
innerFail(actual, expected, message, 'notDeepEqual', notDeepEqual);
136+
innerFail({
137+
actual,
138+
expected,
139+
message,
140+
operator: 'notDeepEqual',
141+
stackStartFn: notDeepEqual
142+
});
109143
}
110144
};
111145
/* eslint-enable */
112146

113147
assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
114148
if (!isDeepStrictEqual(actual, expected)) {
115-
innerFail(actual, expected, message, 'deepStrictEqual', deepStrictEqual);
149+
innerFail({
150+
actual,
151+
expected,
152+
message,
153+
operator: 'deepStrictEqual',
154+
stackStartFn: deepStrictEqual
155+
});
116156
}
117157
};
118158

119159
assert.notDeepStrictEqual = notDeepStrictEqual;
120160
function notDeepStrictEqual(actual, expected, message) {
121161
if (isDeepStrictEqual(actual, expected)) {
122-
innerFail(actual, expected, message, 'notDeepStrictEqual',
123-
notDeepStrictEqual);
162+
innerFail({
163+
actual,
164+
expected,
165+
message,
166+
operator: 'notDeepStrictEqual',
167+
stackStartFn: notDeepStrictEqual
168+
});
124169
}
125170
}
126171

127172
assert.strictEqual = function strictEqual(actual, expected, message) {
128173
if (!Object.is(actual, expected)) {
129-
innerFail(actual, expected, message, 'strictEqual', strictEqual);
174+
innerFail({
175+
actual,
176+
expected,
177+
message,
178+
operator: 'strictEqual',
179+
stackStartFn: strictEqual
180+
});
130181
}
131182
};
132183

133184
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
134185
if (Object.is(actual, expected)) {
135-
innerFail(actual, expected, message, 'notStrictEqual', notStrictEqual);
186+
innerFail({
187+
actual,
188+
expected,
189+
message,
190+
operator: 'notStrictEqual',
191+
stackStartFn: notStrictEqual
192+
});
136193
}
137194
};
138195

@@ -180,18 +237,27 @@ function innerThrows(shouldThrow, block, expected, message) {
180237
details += ` (${expected.name})`;
181238
}
182239
details += message ? `: ${message}` : '.';
183-
fail(actual, expected, `Missing expected exception${details}`, 'throws');
240+
innerFail({
241+
actual,
242+
expected,
243+
operator: 'throws',
244+
message: `Missing expected exception${details}`,
245+
stackStartFn: innerThrows
246+
});
184247
}
185248
if (expected && expectedException(actual, expected) === false) {
186249
throw actual;
187250
}
188251
} else if (actual !== undefined) {
189252
if (!expected || expectedException(actual, expected)) {
190253
details = message ? `: ${message}` : '.';
191-
fail(actual,
192-
expected,
193-
`Got unwanted exception${details}\n${actual.message}`,
194-
'doesNotThrow');
254+
innerFail({
255+
actual,
256+
expected,
257+
operator: 'doesNotThrow',
258+
message: `Got unwanted exception${details}\n${actual.message}`,
259+
stackStartFn: innerThrows
260+
});
195261
}
196262
throw actual;
197263
}

lib/internal/errors.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class AssertionError extends Error {
136136
if (typeof options !== 'object' || options === null) {
137137
throw new exports.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'Object');
138138
}
139-
var { actual, expected, message, operator, stackStartFunction } = options;
139+
var { actual, expected, message, operator, stackStartFn } = options;
140140
if (message) {
141141
super(message);
142142
} else {
@@ -155,7 +155,7 @@ class AssertionError extends Error {
155155
this.actual = actual;
156156
this.expected = expected;
157157
this.operator = operator;
158-
Error.captureStackTrace(this, stackStartFunction);
158+
Error.captureStackTrace(this, stackStartFn);
159159
}
160160
}
161161

test/message/error_exit.out

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Exiting with code=1
22
assert.js:*
3-
throw new errors.AssertionError({
3+
throw new errors.AssertionError(obj);
44
^
55

66
AssertionError [ERR_ASSERTION]: 1 strictEqual 2

test/parallel/test-assert.js

+9
Original file line numberDiff line numberDiff line change
@@ -780,3 +780,12 @@ common.expectsError(
780780
/* eslint-enable no-restricted-properties */
781781
assert(7);
782782
}
783+
784+
common.expectsError(
785+
() => assert.ok(null),
786+
{
787+
code: 'ERR_ASSERTION',
788+
type: assert.AssertionError,
789+
message: 'null == true'
790+
}
791+
);

0 commit comments

Comments
 (0)