diff --git a/src/runtime/test_runner/pretty_format.rs b/src/runtime/test_runner/pretty_format.rs index 5eacda6287ba..ebf5461034dc 100644 --- a/src/runtime/test_runner/pretty_format.rs +++ b/src/runtime/test_runner/pretty_format.rs @@ -1718,7 +1718,7 @@ impl<'a> Formatter<'a> { let length_value = value .get(self.global_this, "size")? .unwrap_or_else(|| JSValue::js_number_from_int32(0)); - let length = length_value.to_int32(); + let length = length_value.coerce_to_i32(self.global_this)?; let prev_quote_strings = self.quote_strings; self.quote_strings = true; @@ -1762,7 +1762,7 @@ impl<'a> Formatter<'a> { let length_value = value .get(self.global_this, "size")? .unwrap_or_else(|| JSValue::js_number_from_int32(0)); - let length = length_value.to_int32(); + let length = length_value.coerce_to_i32(self.global_this)?; let prev_quote_strings = self.quote_strings; self.quote_strings = true; diff --git a/test/js/bun/test/expect-map-set-size-crash.test.ts b/test/js/bun/test/expect-map-set-size-crash.test.ts new file mode 100644 index 000000000000..68ad60dfffdc --- /dev/null +++ b/test/js/bun/test/expect-map-set-size-crash.test.ts @@ -0,0 +1,67 @@ +import { expect, test } from "bun:test"; +import { bunEnv, bunExe, normalizeBunSnapshot } from "harness"; + +test("failing matcher on a Map or Set whose size is not a number still reports the mismatch", async () => { + await using proc = Bun.spawn({ + cmd: [ + bunExe(), + "-e", + `const { expect } = require("bun:test"); +const weakSet = new WeakSet(); +weakSet.size = {}; +const weakMap = new WeakMap(); +weakMap.size = "abc"; +const set = new Set([1, 2]); +Object.defineProperty(set, "size", { value: {} }); +const map = new Map([[1, 2]]); +Object.defineProperty(map, "size", { value: null }); +const selfSized = new WeakMap(); +selfSized.size = selfSized; +for (const value of [weakSet, weakMap, set, map, { nested: selfSized }]) { + try { + expect(value).toEqual(1); + } catch (e) { + console.log(e.message); + } +}`, + ], + env: bunEnv, + stderr: "pipe", + }); + + const [stdout, stderr, exitCode] = await Promise.all([proc.stdout.text(), proc.stderr.text(), proc.exited]); + + expect(stderr).toBe(""); + expect(normalizeBunSnapshot(stdout)).toMatchInlineSnapshot(` + "expect(received).toEqual(expected) + + Expected: 1 + Received: WeakSet {} + + expect(received).toEqual(expected) + + Expected: 1 + Received: WeakMap {} + + expect(received).toEqual(expected) + + Expected: 1 + Received: Set {} + + expect(received).toEqual(expected) + + Expected: 1 + Received: Map {} + + expect(received).toEqual(expected) + + - 1 + + { + + "nested": WeakMap {}, + + } + + - Expected - 1 + + Received + 3" + `); + expect(exitCode).toBe(0); +});