Files
bun.sh/test/js/bun/bun-object/deep-equals.spec.ts
2025-02-06 14:29:59 -08:00

80 lines
2.4 KiB
TypeScript

import vm from "node:vm";
describe.each([true, false])("Bun.deepEquals(a, b, strict: %p)", strict => {
const deepEquals = (a: unknown, b: unknown) => Bun.deepEquals(a, b, strict);
it.each([
[1, 1],
[true, true],
[undefined, undefined],
[null, null],
["foo", "foo"],
[{}, {}],
[{ a: 1 }, { a: 1 }],
[new Map(), new Map()],
[new Set(), new Set()],
[Symbol.for("foo"), Symbol.for("foo")],
[NaN, NaN],
])("Bun.deepEquals(%p, %p) === true, regardless of strict modee", (a, b) => {
expect(Bun.deepEquals(a, b, true)).toBe(true);
expect(Bun.deepEquals(a, b, false)).toBe(true);
});
it.each([
[0, 1],
[-0, +0], //
[{ a: 1 }, { a: 2 }],
["foo", "bar"],
])("Bun.deepEquals(%p, %p) !== true, regardless of strict modee", (a, b) => {
expect(Bun.deepEquals(a, b, true)).toBe(false);
expect(Bun.deepEquals(a, b, false)).toBe(false);
});
// https://github.com/nodejs/node/issues/10258
it("fake dates are not equal", () => {
function FakeDate() {}
FakeDate.prototype = Date.prototype;
const a = new Date("2016");
const b = new FakeDate();
expect(deepEquals(a, b)).toBe(false);
expect(deepEquals(b, a)).toBe(false);
});
it("fake maps are not equal", () => {
function FakeMap() {}
FakeMap.prototype = Map.prototype;
const a = new Map();
const b = new FakeMap();
expect(deepEquals(a, b)).toBe(false);
expect(deepEquals(b, a)).toBe(false);
});
// we may change this in the future
it("functions that are not reference-equal are never equal", () => {
function foo() {}
function bar() {}
function baz(a) {}
expect(deepEquals(foo, foo)).toBe(true);
expect(deepEquals(foo, bar)).toBe(false);
expect(deepEquals(foo, baz)).toBe(false);
});
describe("global object", () => {
let contexts: [vm.Context, vm.Context];
beforeEach(() => {
contexts = [vm.createContext(), vm.createContext()];
});
afterEach(() => {});
// TODO: re-enable when https://github.com/oven-sh/bun/issues/17080 is resolved
it.skip("main global object is not equal to vm global objects", () => {
const [ctx] = contexts;
expect(deepEquals(global, ctx)).toBe(false);
ctx.mainGlobal = global;
const areEqual = vm.runInContext("Bun.deepEquals(globalThis, mainGlobal)", ctx);
expect(areEqual).toBe(false);
});
});
});