Move compareArray into assert.js (#4592)

This commit is contained in:
Richard Gibson 2025-10-02 16:50:07 -04:00 committed by GitHub
parent 2e7412547d
commit 06dfddc4eb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 62 additions and 67 deletions

View File

@ -290,6 +290,7 @@ Function | Purpose
`assert.sameValue(actual, expected, message)` | throw a new Test262Error instance if the first two arguments are not [the same value](https://tc39.github.io/ecma262/#sec-samevalue); accepts an optional string message explaining the scenario and what should have happened
`assert.notSameValue(actual, unexpected, message)` | throw a new Test262Error instance if the first two arguments are [the same value](https://tc39.github.io/ecma262/#sec-samevalue); accepts an optional string message explaining the scenario and what should have happened
`assert.throws(expectedErrorConstructor, fn, message)` | throw a new Test262Error instance if the provided function does not throw an error or if the constructor of the value thrown does not match the provided constructor; accepts an optional string message explaining the scenario and what should have happened
`assert.compareArray(actual, expected, message)` | throw a new Test262Error instance if the first two arguments have differing `length` or there is an array index less than that length at which their respective elements are not [the same value](https://tc39.github.io/ecma262/#sec-samevalue); accepts an optional string message explaining the scenario and what should have happened
`$DONOTEVALUATE()` | throw an exception if the code gets evaluated. This may only be used in [negative test cases for parsing errors](#handling-errors-and-negative-test-cases).
`throw "Test262: This statement should not be evaluated.";` | throw an exception if the code gets evaluated. Use this if the test file has the `raw` flag and it's a negative test case for parsing error.

View File

@ -101,6 +101,45 @@ assert.throws = function (expectedErrorConstructor, func, message) {
throw new Test262Error(message);
};
function isPrimitive(value) {
return !value || (typeof value !== 'object' && typeof value !== 'function');
}
assert.compareArray = function (actual, expected, message) {
message = message === undefined ? '' : message;
if (typeof message === 'symbol') {
message = message.toString();
}
if (isPrimitive(actual)) {
assert(false, `Actual argument [${actual}] shouldn't be primitive. ${message}`);
} else if (isPrimitive(expected)) {
assert(false, `Expected argument [${expected}] shouldn't be primitive. ${message}`);
}
var result = compareArray(actual, expected);
if (result) return;
var format = compareArray.format;
assert(false, `Actual ${format(actual)} and expected ${format(expected)} should have the same contents. ${message}`);
};
function compareArray(a, b) {
if (b.length !== a.length) {
return false;
}
for (var i = 0; i < a.length; i++) {
if (!assert._isSameValue(b[i], a[i])) {
return false;
}
}
return true;
}
compareArray.format = function (arrayLike) {
return `[${Array.prototype.map.call(arrayLike, String).join(', ')}]`;
};
assert._formatIdentityFreeValue = function formatIdentityFreeValue(value) {
switch (value === null ? 'null' : typeof value) {
case 'string':

View File

@ -2,49 +2,6 @@
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: |
Compare the contents of two arrays
Deprecated now that compareArray is defined in assert.js.
defines: [compareArray]
---*/
function compareArray(a, b) {
if (b.length !== a.length) {
return false;
}
for (var i = 0; i < a.length; i++) {
if (!compareArray.isSameValue(b[i], a[i])) {
return false;
}
}
return true;
}
compareArray.isSameValue = function(a, b) {
if (a === 0 && b === 0) return 1 / a === 1 / b;
if (a !== a && b !== b) return true;
return a === b;
};
compareArray.format = function(arrayLike) {
return `[${[].map.call(arrayLike, String).join(', ')}]`;
};
assert.compareArray = function(actual, expected, message) {
message = message === undefined ? '' : message;
if (typeof message === 'symbol') {
message = message.toString();
}
assert(actual != null, `Actual argument shouldn't be nullish. ${message}`);
assert(expected != null, `Expected argument shouldn't be nullish. ${message}`);
var format = compareArray.format;
var result = compareArray(actual, expected);
// The following prevents actual and expected from being iterated and evaluated
// more than once unless absolutely necessary.
if (!result) {
assert(false, `Actual ${format(actual)} and expected ${format(expected)} should have the same contents. ${message}`);
}
};

View File

@ -20,9 +20,9 @@ function assertThrows(func, errorMessage) {
assert(caught, `Expected ${func} to throw, but it didn't.`);
}
assertThrows(() => assert.compareArray(), "Actual argument shouldn't be nullish. ");
assertThrows(() => assert.compareArray(null, []), "Actual argument shouldn't be nullish. ");
assertThrows(() => assert.compareArray(null, [], "foo"), "Actual argument shouldn't be nullish. foo");
assertThrows(() => assert.compareArray(), "Actual argument [undefined] shouldn't be primitive. ");
assertThrows(() => assert.compareArray(null, []), "Actual argument [null] shouldn't be primitive. ");
assertThrows(() => assert.compareArray(null, [], "foo"), "Actual argument [null] shouldn't be primitive. foo");
assertThrows(() => assert.compareArray([]), "Expected argument shouldn't be nullish. ");
assertThrows(() => assert.compareArray([], undefined, "foo"), "Expected argument shouldn't be nullish. foo");
assertThrows(() => assert.compareArray([]), "Expected argument [undefined] shouldn't be primitive. ");
assertThrows(() => assert.compareArray([], undefined, "foo"), "Expected argument [undefined] shouldn't be primitive. foo");

View File

@ -4,25 +4,24 @@
/*---
description: Test replace function with duplicate names in alteration.
features: [regexp-duplicate-named-groups]
includes: [compareArray.js]
---*/
assert.compareArray(
assert.sameValue(
'2xyy', 'xxyy'.replace(/(?:(?:(?<a>x)|(?<a>y))\k<a>)/, '2$<a>'));
assert.compareArray(
assert.sameValue(
'x2zyyxxy',
'xzzyyxxy'.replace(
/(?:(?:(?<a>x)|(?<a>y)|(a)|(?<b>b)|(?<a>z))\k<a>)/, '2$<a>'));
assert.compareArray(
assert.sameValue(
'2x(x,)yy', 'xxyy'.replace(/(?:(?:(?<a>x)|(?<a>y))\k<a>)/, '2$<a>($1,$2)'));
assert.compareArray(
assert.sameValue(
'x2z(,,,,z)yyxxy',
'xzzyyxxy'.replace(
/(?:(?:(?<a>x)|(?<a>y)|(a)|(?<b>b)|(?<a>z))\k<a>)/,
'2$<a>($1,$2,$3,$4,$5)'));
assert.compareArray(
assert.sameValue(
'2x2y', 'xxyy'.replace(/(?:(?:(?<a>x)|(?<a>y))\k<a>)/g, '2$<a>'));
assert.compareArray(
assert.sameValue(
'x2z2y2xy',
'xzzyyxxy'.replace(
/(?:(?:(?<a>x)|(?<a>y)|(a)|(?<b>b)|(?<a>z))\k<a>)/g, '2$<a>'));

View File

@ -4,10 +4,9 @@
/*---
description: Test search function with duplicate names in alteration.
features: [regexp-duplicate-named-groups]
includes: [compareArray.js]
---*/
assert.compareArray(3, 'abcxyz'.search(/(?<a>x)|(?<a>y)/));
assert.compareArray(3, 'abcxyz'.search(/(?<a>y)|(?<a>x)/));
assert.compareArray(1, 'aybcxyz'.search(/(?<a>x)|(?<a>y)/));
assert.compareArray(1, 'aybcxyz'.search(/(?<a>y)|(?<a>x)/));
assert.sameValue(3, 'abcxyz'.search(/(?<a>x)|(?<a>y)/));
assert.sameValue(3, 'abcxyz'.search(/(?<a>y)|(?<a>x)/));
assert.sameValue(1, 'aybcxyz'.search(/(?<a>x)|(?<a>y)/));
assert.sameValue(1, 'aybcxyz'.search(/(?<a>y)|(?<a>x)/));

View File

@ -21,19 +21,19 @@ assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".match(/\uD83D\uDC38|
// ==== String.prototype.replace ====
// empty string replacement (optimized)
assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, ""),
assert.sameValue("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, ""),
"\uD83D\uDC38\uD83D\uDC39\uD83D\uDC3A");
assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, ""),
assert.sameValue("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, ""),
"\uD83D\uDC38\uD83D\uDC39\uD83D\uDC3A");
assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, ""),
assert.sameValue("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, ""),
"\uD83D\uDC39\uD83D\uDC3A");
// non-empty string replacement
assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, "x"),
assert.sameValue("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D|X|/gu, "x"),
"x\uD83D\uDC38x\uD83D\uDC39xx\uD83D\uDC3Ax");
assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, "x"),
assert.sameValue("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uDC38|X|/gu, "x"),
"x\uD83D\uDC38x\uD83D\uDC39xx\uD83D\uDC3Ax");
assert.compareArray("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, "x"),
assert.sameValue("\uD83D\uDC38\uD83D\uDC39X\uD83D\uDC3A".replace(/\uD83D\uDC38|X|/gu, "x"),
"xx\uD83D\uDC39xx\uD83D\uDC3Ax");
// ==== String.prototype.split ====