fix(expect): value-equal complex keys in expect.equal() (#5936)

fix(expect): value-equal complex keys
This commit is contained in:
lionel-rowe 2024-09-11 18:39:54 +08:00 committed by GitHub
parent 780deafff7
commit 635a8860d7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 2 deletions

View File

@ -185,9 +185,12 @@ export function equal(c: unknown, d: unknown, options?: EqualOptions): boolean {
for (const [bKey, bValue] of b.entries()) {
/* Given that Map keys can be references, we need
* to ensure that they are also deeply equal */
if (!compare(aKey, bKey)) continue;
if (
(aKey === aValue && bKey === bValue && compare(aKey, bKey)) ||
(compare(aKey, bKey) && compare(aValue, bValue))
(aKey === aValue && bKey === bValue) ||
(compare(aValue, bValue))
) {
unmatchedEntries--;
break;

View File

@ -290,3 +290,43 @@ Deno.test("equal() fast path for primitive keyed collections", () => {
const map6 = new Map(arr.with(-1, -1).map((v, i) => [i, v]));
assertFalse(equal(map5, map6));
});
Deno.test("equal() keyed collection edge cases", () => {
assert(equal(new Set([{ b: 2 }, { a: 1 }]), new Set([{ a: 1 }, { b: 2 }])));
assertFalse(
equal(new Set([{ b: 2 }, { a: 1 }]), new Set([{ a: 1 }, { b: 3 }])),
);
const sym = Symbol();
assert(equal(new Set([sym]), new Set([sym])));
assert(equal(new Set([sym, "a"]), new Set(["a", sym])));
assertFalse(equal(new Set([sym, "a"]), new Set(["b", sym])));
assertFalse(equal(new Set([Symbol()]), new Set([Symbol()])));
assert(equal(new Set([Symbol.for("x")]), new Set([Symbol.for("x")])));
assert(equal(
new Map([[{ b: 2 }, 2], [{ a: 1 }, 1]]),
new Map([[{ a: 1 }, 1], [{ b: 2 }, 2]]),
));
assertFalse(equal(
new Map([[{ b: 2 }, 2], [{ a: 1 }, 1]]),
new Map([[{ a: 1 }, 1], [{ b: 2 }, 3]]),
));
assertFalse(equal(
new Map([[{ b: 2 }, 2], [{ a: 1 }, 1]]),
new Map([[{ a: 1 }, 1], [{ b: 3 }, 2]]),
));
assert(equal(
new Map([[2, { b: 2 }], [1, { a: 1 }]]),
new Map([[1, { a: 1 }], [2, { b: 2 }]]),
));
assertFalse(equal(
new Map([[2, { b: 2 }], [1, { a: 1 }]]),
new Map([[1, { a: 1 }], [3, { b: 2 }]]),
));
assertFalse(equal(
new Map([[2, { b: 2 }], [1, { a: 1 }]]),
new Map([[1, { a: 1 }], [2, { b: 3 }]]),
));
});