From 9b4d092efa6b22a4cb15e25f2006f14b1a3e2816 Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Wed, 1 Sep 2021 19:17:00 -0500 Subject: [PATCH 01/13] add tests for ArrayBuffers --- packages/expect/src/__tests__/matchers.test.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/expect/src/__tests__/matchers.test.js b/packages/expect/src/__tests__/matchers.test.js index 81ceabf09c81..ed9fdaff4b33 100644 --- a/packages/expect/src/__tests__/matchers.test.js +++ b/packages/expect/src/__tests__/matchers.test.js @@ -426,6 +426,10 @@ describe('.toStrictEqual()', () => { it('does not pass when equally sparse arrays have different values', () => { expect([, 1]).not.toStrictEqual([, 2]); }); + + it('does not pass when ArrayBuffers are not equal', () => { + expect(Uint8Array.from([1, 2]).buffer).not.toStrictEqual(Uint8Array.from([0, 0]).buffer); + }) /* eslint-enable */ }); From c5fd617cdcd20e31ae3ed7f8f9b23ff68e6e2f2c Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Wed, 1 Sep 2021 19:48:50 -0500 Subject: [PATCH 02/13] add arrayBufferEquality util function --- packages/expect/src/matchers.ts | 2 ++ packages/expect/src/utils.ts | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/packages/expect/src/matchers.ts b/packages/expect/src/matchers.ts index d0ec1480dab4..344374330cb6 100644 --- a/packages/expect/src/matchers.ts +++ b/packages/expect/src/matchers.ts @@ -40,6 +40,7 @@ import { } from './print'; import type {MatcherState, MatchersObject} from './types'; import { + arrayBufferEquality, getObjectSubset, getPath, iterableEquality, @@ -61,6 +62,7 @@ const toStrictEqualTesters = [ iterableEquality, typeEquality, sparseArrayEquality, + arrayBufferEquality, ]; type ContainIterable = diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 858f7a7d03cb..25414b23f4ee 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -319,6 +319,30 @@ export const typeEquality = (a: any, b: any): boolean | undefined => { return false; }; +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +export const arrayBufferEquality = (a: any, b: any): boolean | undefined => { + if (!(a instanceof ArrayBuffer) || !(b instanceof ArrayBuffer)) { + return undefined; + } + + const d1 = new DataView(a); + const d2 = new DataView(b); + + // Buffers are not equal when they do not have the same byte length + if (d1.byteLength != d2.byteLength) { + return false; + } + + // Compare each arraryBuffer byte's buffers + for (let i = 0;i < d1.byteLength; i++) { + if (d1.getUint8(i) != d2.getUint8(i)) { + return false; + } + } + + return true; +} + export const sparseArrayEquality = ( a: unknown, b: unknown, From 5d6bcf1caafe86cad9c88206486f5d19a759770e Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Wed, 1 Sep 2021 20:11:51 -0500 Subject: [PATCH 03/13] enhance variable names --- packages/expect/src/utils.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 25414b23f4ee..86bb04dcae2c 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -325,17 +325,17 @@ export const arrayBufferEquality = (a: any, b: any): boolean | undefined => { return undefined; } - const d1 = new DataView(a); - const d2 = new DataView(b); + const dataViewA = new DataView(a); + const dataViewB = new DataView(b); // Buffers are not equal when they do not have the same byte length - if (d1.byteLength != d2.byteLength) { + if (dataViewA.byteLength != dataViewB.byteLength) { return false; } // Compare each arraryBuffer byte's buffers - for (let i = 0;i < d1.byteLength; i++) { - if (d1.getUint8(i) != d2.getUint8(i)) { + for (let i = 0;i < dataViewA.byteLength; i++) { + if (dataViewA.getUint8(i) != dataViewB.getUint8(i)) { return false; } } From feae86f4cfa1342f08f08e83a8e0e18918c50f5b Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Wed, 1 Sep 2021 20:12:00 -0500 Subject: [PATCH 04/13] add tests --- .../expect/src/__tests__/matchers.test.js | 8 +++++++ packages/expect/src/__tests__/utils.test.ts | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/packages/expect/src/__tests__/matchers.test.js b/packages/expect/src/__tests__/matchers.test.js index ed9fdaff4b33..6ee3810c6c61 100644 --- a/packages/expect/src/__tests__/matchers.test.js +++ b/packages/expect/src/__tests__/matchers.test.js @@ -429,6 +429,14 @@ describe('.toStrictEqual()', () => { it('does not pass when ArrayBuffers are not equal', () => { expect(Uint8Array.from([1, 2]).buffer).not.toStrictEqual(Uint8Array.from([0, 0]).buffer); + expect(Uint8Array.from([2,1]).buffer).not.toStrictEqual(Uint8Array.from([2,2]).buffer); + expect(Uint8Array.from([]).buffer).not.toStrictEqual(Uint8Array.from([1]).buffer); + }); + + it('passes for matching buffers', () => { + expect(Uint8Array.from([1]).buffer).toStrictEqual(Uint8Array.from([1]).buffer); + expect(Uint8Array.from([]).buffer).toStrictEqual(Uint8Array.from([]).buffer); + expect(Uint8Array.from([9,3]).buffer).toStrictEqual(Uint8Array.from([9,3]).buffer); }) /* eslint-enable */ }); diff --git a/packages/expect/src/__tests__/utils.test.ts b/packages/expect/src/__tests__/utils.test.ts index c210abf9fb34..0d25692dbd02 100644 --- a/packages/expect/src/__tests__/utils.test.ts +++ b/packages/expect/src/__tests__/utils.test.ts @@ -8,6 +8,7 @@ import {stringify} from 'jest-matcher-utils'; import { + arrayBufferEquality, emptyObject, getObjectSubset, getPath, @@ -466,3 +467,23 @@ describe('iterableEquality', () => { expect(iterableEquality(a, b)).toBe(true); }); }); + +describe('arrayBufferEquality', () => { + test('returns undefined if given a non instance of ArrayBuffer', () => { + expect(arrayBufferEquality(2, "s")).toBeUndefined(); + expect(arrayBufferEquality(undefined, 2)).toBeUndefined(); + expect(arrayBufferEquality(new Date(), new ArrayBuffer(2))).toBeUndefined(); + }); + + test('returns false when given non-matching buffers', () => { + const a = Uint8Array.from([2,4]).buffer; + const b = Uint8Array.from([1,7]).buffer; + expect(arrayBufferEquality(a, b)).not.toBeTruthy(); + }); + + test('returns true when given matching buffers', () => { + const a = Uint8Array.from([1,2]).buffer; + const b = Uint8Array.from([1,2]).buffer; + expect(arrayBufferEquality(a, b)).toBeTruthy(); + }) +}); From 88ebc4a2a62f10d5b72993a7f7ac9928635d00db Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Wed, 1 Sep 2021 20:23:18 -0500 Subject: [PATCH 05/13] fix typo in comment --- packages/expect/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 86bb04dcae2c..e5db26679e87 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -333,7 +333,7 @@ export const arrayBufferEquality = (a: any, b: any): boolean | undefined => { return false; } - // Compare each arraryBuffer byte's buffers + // Check if every byte value is equal to each other for (let i = 0;i < dataViewA.byteLength; i++) { if (dataViewA.getUint8(i) != dataViewB.getUint8(i)) { return false; From 528017484864a0f8a5f892d1e3db5606d95d395b Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Wed, 1 Sep 2021 20:32:47 -0500 Subject: [PATCH 06/13] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0af283259c24..71ce881d032e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### Features +- `[expect]` Add equality checks for Array Buffers in `expect.ToStrictEqual()` + ### Fixes ### Chore & Maintenance From 6106e3ad252388bc716ed54ef3c900be9bd0756d Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Thu, 2 Sep 2021 06:24:58 -0500 Subject: [PATCH 07/13] Update CHANGELOG.md Co-authored-by: Simen Bekkhus --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71ce881d032e..0235fc8a2519 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ### Features -- `[expect]` Add equality checks for Array Buffers in `expect.ToStrictEqual()` +- `[expect]` Add equality checks for Array Buffers in `expect.ToStrictEqual()` ([#11805](https://github.com/facebook/jest/pull/11805)) ### Fixes From 2cdd879de55938887acaf401ccc90216cce3e48b Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Thu, 2 Sep 2021 06:25:19 -0500 Subject: [PATCH 08/13] Update packages/expect/src/utils.ts Co-authored-by: Simen Bekkhus --- packages/expect/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index e5db26679e87..944c2b40e178 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -329,7 +329,7 @@ export const arrayBufferEquality = (a: any, b: any): boolean | undefined => { const dataViewB = new DataView(b); // Buffers are not equal when they do not have the same byte length - if (dataViewA.byteLength != dataViewB.byteLength) { + if (dataViewA.byteLength !== dataViewB.byteLength) { return false; } From 7b7d45492996ef60f78d4ef458a36cb69fc6a562 Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Thu, 2 Sep 2021 06:28:12 -0500 Subject: [PATCH 09/13] Update packages/expect/src/utils.ts Co-authored-by: Simen Bekkhus --- packages/expect/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 944c2b40e178..75bad1b02fce 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -320,7 +320,7 @@ export const typeEquality = (a: any, b: any): boolean | undefined => { }; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types -export const arrayBufferEquality = (a: any, b: any): boolean | undefined => { +export const arrayBufferEquality = (a: unknown, b: unknown): boolean | undefined => { if (!(a instanceof ArrayBuffer) || !(b instanceof ArrayBuffer)) { return undefined; } From 5e34616227a1d16934966d6f4ca29842205e0d18 Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Thu, 2 Sep 2021 06:28:55 -0500 Subject: [PATCH 10/13] Update utils.ts --- packages/expect/src/utils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 75bad1b02fce..3c3e73b27b0e 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -319,7 +319,6 @@ export const typeEquality = (a: any, b: any): boolean | undefined => { return false; }; -// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types export const arrayBufferEquality = (a: unknown, b: unknown): boolean | undefined => { if (!(a instanceof ArrayBuffer) || !(b instanceof ArrayBuffer)) { return undefined; From f4c9037f912b3de12bfbb04cb7665ff5313e2839 Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Thu, 2 Sep 2021 06:30:44 -0500 Subject: [PATCH 11/13] Update packages/expect/src/utils.ts Co-authored-by: Simen Bekkhus --- packages/expect/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 3c3e73b27b0e..6a1c622f2a63 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -334,7 +334,7 @@ export const arrayBufferEquality = (a: unknown, b: unknown): boolean | undefined // Check if every byte value is equal to each other for (let i = 0;i < dataViewA.byteLength; i++) { - if (dataViewA.getUint8(i) != dataViewB.getUint8(i)) { + if (dataViewA.getUint8(i) !== dataViewB.getUint8(i)) { return false; } } From 41cc53d6bfca909ec7579c48d3fcd157172fb7ef Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Thu, 2 Sep 2021 06:56:16 -0500 Subject: [PATCH 12/13] follow style standards --- packages/expect/src/__tests__/matchers.test.js | 2 +- packages/expect/src/__tests__/utils.test.ts | 4 ++-- packages/expect/src/utils.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/expect/src/__tests__/matchers.test.js b/packages/expect/src/__tests__/matchers.test.js index 6ee3810c6c61..610f3b8e7d74 100644 --- a/packages/expect/src/__tests__/matchers.test.js +++ b/packages/expect/src/__tests__/matchers.test.js @@ -437,7 +437,7 @@ describe('.toStrictEqual()', () => { expect(Uint8Array.from([1]).buffer).toStrictEqual(Uint8Array.from([1]).buffer); expect(Uint8Array.from([]).buffer).toStrictEqual(Uint8Array.from([]).buffer); expect(Uint8Array.from([9,3]).buffer).toStrictEqual(Uint8Array.from([9,3]).buffer); - }) + }); /* eslint-enable */ }); diff --git a/packages/expect/src/__tests__/utils.test.ts b/packages/expect/src/__tests__/utils.test.ts index 0d25692dbd02..403eb89fe548 100644 --- a/packages/expect/src/__tests__/utils.test.ts +++ b/packages/expect/src/__tests__/utils.test.ts @@ -470,14 +470,14 @@ describe('iterableEquality', () => { describe('arrayBufferEquality', () => { test('returns undefined if given a non instance of ArrayBuffer', () => { - expect(arrayBufferEquality(2, "s")).toBeUndefined(); + expect(arrayBufferEquality(2, 's')).toBeUndefined(); expect(arrayBufferEquality(undefined, 2)).toBeUndefined(); expect(arrayBufferEquality(new Date(), new ArrayBuffer(2))).toBeUndefined(); }); test('returns false when given non-matching buffers', () => { const a = Uint8Array.from([2,4]).buffer; - const b = Uint8Array.from([1,7]).buffer; + const b = Uint16Array.from([1,7]).buffer; expect(arrayBufferEquality(a, b)).not.toBeTruthy(); }); diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 6a1c622f2a63..05b515c249a1 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -340,7 +340,7 @@ export const arrayBufferEquality = (a: unknown, b: unknown): boolean | undefined } return true; -} +}; export const sparseArrayEquality = ( a: unknown, From 20bdbc15c29fbf21bdbf2fdcc793e0d6bcc7c7da Mon Sep 17 00:00:00 2001 From: khai93 <33293519+khai93@users.noreply.github.com> Date: Wed, 8 Sep 2021 10:06:00 -0500 Subject: [PATCH 13/13] fix eslint errors --- .../expect/src/__tests__/matchers.test.js | 24 ++++++++++++++----- packages/expect/src/__tests__/utils.test.ts | 10 ++++---- packages/expect/src/utils.ts | 7 ++++-- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/expect/src/__tests__/matchers.test.js b/packages/expect/src/__tests__/matchers.test.js index 610f3b8e7d74..1e244e6d7d57 100644 --- a/packages/expect/src/__tests__/matchers.test.js +++ b/packages/expect/src/__tests__/matchers.test.js @@ -428,15 +428,27 @@ describe('.toStrictEqual()', () => { }); it('does not pass when ArrayBuffers are not equal', () => { - expect(Uint8Array.from([1, 2]).buffer).not.toStrictEqual(Uint8Array.from([0, 0]).buffer); - expect(Uint8Array.from([2,1]).buffer).not.toStrictEqual(Uint8Array.from([2,2]).buffer); - expect(Uint8Array.from([]).buffer).not.toStrictEqual(Uint8Array.from([1]).buffer); + expect(Uint8Array.from([1, 2]).buffer).not.toStrictEqual( + Uint8Array.from([0, 0]).buffer, + ); + expect(Uint8Array.from([2, 1]).buffer).not.toStrictEqual( + Uint8Array.from([2, 2]).buffer, + ); + expect(Uint8Array.from([]).buffer).not.toStrictEqual( + Uint8Array.from([1]).buffer, + ); }); it('passes for matching buffers', () => { - expect(Uint8Array.from([1]).buffer).toStrictEqual(Uint8Array.from([1]).buffer); - expect(Uint8Array.from([]).buffer).toStrictEqual(Uint8Array.from([]).buffer); - expect(Uint8Array.from([9,3]).buffer).toStrictEqual(Uint8Array.from([9,3]).buffer); + expect(Uint8Array.from([1]).buffer).toStrictEqual( + Uint8Array.from([1]).buffer, + ); + expect(Uint8Array.from([]).buffer).toStrictEqual( + Uint8Array.from([]).buffer, + ); + expect(Uint8Array.from([9, 3]).buffer).toStrictEqual( + Uint8Array.from([9, 3]).buffer, + ); }); /* eslint-enable */ }); diff --git a/packages/expect/src/__tests__/utils.test.ts b/packages/expect/src/__tests__/utils.test.ts index 403eb89fe548..0654d99a43c2 100644 --- a/packages/expect/src/__tests__/utils.test.ts +++ b/packages/expect/src/__tests__/utils.test.ts @@ -476,14 +476,14 @@ describe('arrayBufferEquality', () => { }); test('returns false when given non-matching buffers', () => { - const a = Uint8Array.from([2,4]).buffer; - const b = Uint16Array.from([1,7]).buffer; + const a = Uint8Array.from([2, 4]).buffer; + const b = Uint16Array.from([1, 7]).buffer; expect(arrayBufferEquality(a, b)).not.toBeTruthy(); }); test('returns true when given matching buffers', () => { - const a = Uint8Array.from([1,2]).buffer; - const b = Uint8Array.from([1,2]).buffer; + const a = Uint8Array.from([1, 2]).buffer; + const b = Uint8Array.from([1, 2]).buffer; expect(arrayBufferEquality(a, b)).toBeTruthy(); - }) + }); }); diff --git a/packages/expect/src/utils.ts b/packages/expect/src/utils.ts index 05b515c249a1..eab02cd36204 100644 --- a/packages/expect/src/utils.ts +++ b/packages/expect/src/utils.ts @@ -319,7 +319,10 @@ export const typeEquality = (a: any, b: any): boolean | undefined => { return false; }; -export const arrayBufferEquality = (a: unknown, b: unknown): boolean | undefined => { +export const arrayBufferEquality = ( + a: unknown, + b: unknown, +): boolean | undefined => { if (!(a instanceof ArrayBuffer) || !(b instanceof ArrayBuffer)) { return undefined; } @@ -333,7 +336,7 @@ export const arrayBufferEquality = (a: unknown, b: unknown): boolean | undefined } // Check if every byte value is equal to each other - for (let i = 0;i < dataViewA.byteLength; i++) { + for (let i = 0; i < dataViewA.byteLength; i++) { if (dataViewA.getUint8(i) !== dataViewB.getUint8(i)) { return false; }