From 14bc121dc8f3d287bfdfc49d4ff944fe2847c85a Mon Sep 17 00:00:00 2001 From: Kaio Duarte Date: Fri, 29 Dec 2023 00:32:49 +0000 Subject: [PATCH] Compare error name and message on `Bun.deepEquals` and `assert.deepStrictEqual` (#7867) * check error name and message on Bun.deepEquals * add tests * add test with subclass of Error --- src/bun.js/bindings/bindings.cpp | 18 ++++++++++++++++++ test/js/bun/test/test-test.test.ts | 8 ++++++++ 2 files changed, 26 insertions(+) diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index b2bf2c3d6c..9eaaae316a 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -830,6 +830,24 @@ bool Bun__deepEquals(JSC__JSGlobalObject* globalObject, JSValue v1, JSValue v2, return false; } + case ErrorInstanceType: { + if (c2Type != ErrorInstanceType) { + return false; + } + + if (JSC::ErrorInstance* left = jsDynamicCast(v1)) { + JSC::ErrorInstance* right = jsDynamicCast(v2); + + if (UNLIKELY(!right)) { + return false; + } + + return ( + left->sanitizedNameString(globalObject) == right->sanitizedNameString(globalObject) && + left->sanitizedMessageString(globalObject) == right->sanitizedMessageString(globalObject) + ); + } + } case Int8ArrayType: case Uint8ArrayType: case Uint8ClampedArrayType: diff --git a/test/js/bun/test/test-test.test.ts b/test/js/bun/test/test-test.test.ts index 885007e34a..f212ee7162 100644 --- a/test/js/bun/test/test-test.test.ts +++ b/test/js/bun/test/test-test.test.ts @@ -161,6 +161,14 @@ test("testing Bun.deepEquals() using isEqual()", () => { expect(Infinity).toEqual(1 / 0); expect(-Infinity).toEqual(-Infinity); expect(-Infinity).toEqual(-1 / 0); + + expect(Error("foo")).toEqual(Error("foo")); + expect(Error("foo")).not.toEqual(Error("bar")); + expect(Error("foo")).not.toEqual("foo"); + + class CustomError extends Error { constructor(message) { super(message); } }; + expect(new CustomError("foo")).not.toEqual(new CustomError("bar")); + expect(new CustomError("foo")).toEqual(new CustomError("foo")); }); try {