Skip to content

Commit db73d1c

Browse files
BridgeARMylesBorins
authored andcommitted
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. Backport-PR-URL: #19230 PR-URL: #17582 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Jon Moss <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Anatoli Papirovski <[email protected]>
1 parent bae5de1 commit db73d1c

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,67 +75,124 @@ 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
// The strict equality assertion tests strict equality, as determined by ===.
128173
assert.strictEqual = function strictEqual(actual, expected, message) {
129174
if (actual !== expected) {
130-
innerFail(actual, expected, message, '===', strictEqual);
175+
innerFail({
176+
actual,
177+
expected,
178+
message,
179+
operator: '===',
180+
stackStartFn: strictEqual
181+
});
131182
}
132183
};
133184

134185
// The strict non-equality assertion tests for strict inequality, as
135186
// determined by !==.
136187
assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
137188
if (actual === expected) {
138-
innerFail(actual, expected, message, '!==', notStrictEqual);
189+
innerFail({
190+
actual,
191+
expected,
192+
message,
193+
operator: '!==',
194+
stackStartFn: notStrictEqual
195+
});
139196
}
140197
};
141198

@@ -183,18 +240,27 @@ function innerThrows(shouldThrow, block, expected, message) {
183240
details += ` (${expected.name})`;
184241
}
185242
details += message ? `: ${message}` : '.';
186-
fail(actual, expected, `Missing expected exception${details}`, 'throws');
243+
innerFail({
244+
actual,
245+
expected,
246+
operator: 'throws',
247+
message: `Missing expected exception${details}`,
248+
stackStartFn: innerThrows
249+
});
187250
}
188251
if (expected && expectedException(actual, expected) === false) {
189252
throw actual;
190253
}
191254
} else if (actual !== undefined) {
192255
if (!expected || expectedException(actual, expected)) {
193256
details = message ? `: ${message}` : '.';
194-
fail(actual,
195-
expected,
196-
`Got unwanted exception${details}\n${actual.message}`,
197-
'doesNotThrow');
257+
innerFail({
258+
actual,
259+
expected,
260+
operator: 'doesNotThrow',
261+
message: `Got unwanted exception${details}\n${actual.message}`,
262+
stackStartFn: innerThrows
263+
});
198264
}
199265
throw actual;
200266
}

lib/internal/errors.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class AssertionError extends Error {
8383
if (typeof options !== 'object' || options === null) {
8484
throw new exports.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'Object');
8585
}
86-
var { actual, expected, message, operator, stackStartFunction } = options;
86+
var { actual, expected, message, operator, stackStartFn } = options;
8787
if (message) {
8888
super(message);
8989
} else {
@@ -102,7 +102,7 @@ class AssertionError extends Error {
102102
this.actual = actual;
103103
this.expected = expected;
104104
this.operator = operator;
105-
Error.captureStackTrace(this, stackStartFunction);
105+
Error.captureStackTrace(this, stackStartFn);
106106
}
107107
}
108108

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 === 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)