From 8b4873ca5b36e6733845f84a486be26596e6e2af Mon Sep 17 00:00:00 2001 From: Andrew Datsenko Date: Tue, 4 Feb 2025 10:06:15 -0800 Subject: [PATCH] Add `.toStrictEqual` (#49176) Summary: Changelog: [Internal] Add missing jest expect apis Reviewed By: rubennorte Differential Revision: D69123117 --- .../react-native-fantom/runtime/expect.js | 25 +++++++++++++++ .../src/__tests__/expect-itest.js | 32 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/packages/react-native-fantom/runtime/expect.js b/packages/react-native-fantom/runtime/expect.js index 05d99538dc1c6f..3be588d68d1c68 100644 --- a/packages/react-native-fantom/runtime/expect.js +++ b/packages/react-native-fantom/runtime/expect.js @@ -89,6 +89,31 @@ class Expect { } } + toStrictEqual(expected: mixed): void { + let expectedType: mixed = + typeof expected === 'object' && expected !== null + ? Object.getPrototypeOf(expected) + : null; + let receivedType: mixed = + typeof this.#received === 'object' && this.#received !== null + ? Object.getPrototypeOf(this.#received) + : null; + const pass = + deepEqual(this.#received, expected, {strict: true}) && + expectedType === receivedType; + if (!this.#isExpectedResult(pass)) { + throw new ErrorWithCustomBlame( + `Expected${this.#maybeNotLabel()} to strictly equal:\n${ + diff(expected, this.#received, { + contextLines: 1, + expand: false, + omitAnnotationLines: true, + }) ?? 'Failed to compare outputs' + }`, + ).blameToPreviousFrame(); + } + } + toBe(expected: mixed): void { const pass = this.#received === expected; if (!this.#isExpectedResult(pass)) { diff --git a/packages/react-native-fantom/src/__tests__/expect-itest.js b/packages/react-native-fantom/src/__tests__/expect-itest.js index a7edafea6996ed..a0eb8611690e99 100644 --- a/packages/react-native-fantom/src/__tests__/expect-itest.js +++ b/packages/react-native-fantom/src/__tests__/expect-itest.js @@ -111,6 +111,38 @@ describe('expect', () => { }).toThrow(); }); + test('toStrictEqual', () => { + class LaCroix { + flavor: string; + constructor(flavor: string) { + this.flavor = flavor; + } + } + + expect({a: undefined, b: 2}).not.toStrictEqual({b: 2}); + expect([2, undefined]).not.toStrictEqual([2]); + expect([2]).not.toStrictEqual([2, undefined]); + // This is part of spec https://jestjs.io/docs/expect#tostrictequalvalue + // eslint-disable-next-line no-sparse-arrays + expect([, 2]).not.toStrictEqual([undefined, 2]); + expect(new LaCroix('lemon')).not.toStrictEqual({flavor: 'lemon'}); + + expect({a: 1}).toStrictEqual({a: 1}); + expect([2, undefined]).toStrictEqual([2, undefined]); + // This is part of spec https://jestjs.io/docs/expect#tostrictequalvalue + // eslint-disable-next-line no-sparse-arrays + expect([, 1]).toStrictEqual([, 1]); + expect(new LaCroix('lemon')).toStrictEqual(new LaCroix('lemon')); + + expect(() => { + expect(new LaCroix('lemon')).toStrictEqual({flavor: 'lemon'}); + }).toThrow(); + + expect(() => { + expect(new LaCroix('lemon')).not.toStrictEqual(new LaCroix('lemon')); + }).toThrow(); + }); + test('toBeInstanceOf', () => { class Class {}