From 2745d7d51520e3e8fb3ce343922fefeced1646d7 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Thu, 2 May 2019 09:49:21 -0700 Subject: [PATCH 1/2] Add support for ArrayBuffers to matcherUtil.equals. Fixes #1687 --- spec/core/matchers/matchersUtilSpec.js | 16 ++++++++++++- src/core/matchers/matchersUtil.js | 31 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/spec/core/matchers/matchersUtilSpec.js b/spec/core/matchers/matchersUtilSpec.js index f3948a32..059223b3 100644 --- a/spec/core/matchers/matchersUtilSpec.js +++ b/spec/core/matchers/matchersUtilSpec.js @@ -164,7 +164,7 @@ describe("matchersUtil", function() { expect(jasmineUnderTest.matchersUtil.equals(a,b)).toBe(true); }); - + it("passes for equivalent Promises (GitHub issue #1314)", function() { if (typeof Promise === 'undefined') { return; } @@ -524,6 +524,20 @@ describe("matchersUtil", function() { expect(jasmineUnderTest.matchersUtil.equals(mapA, mapB)).toBe(false); }); + it("passes for ArrayBuffers with same length and content", function() { + var buffer1 = new ArrayBuffer(4); + var buffer2 = new ArrayBuffer(4); + expect(jasmineUnderTest.matchersUtil.equals(buffer1, buffer2)).toBe(true); + }); + + it("fails for ArrayBuffers with same length but different content", function() { + var buffer1 = new ArrayBuffer(4); + var buffer2 = new ArrayBuffer(4); + var array1 = new Uint8Array(buffer1); + array1[0] = 1; + expect(jasmineUnderTest.matchersUtil.equals(buffer1, buffer2)).toBe(false); + }); + describe("when running in an environment with array polyfills", function() { var findIndexDescriptor = Object.getOwnPropertyDescriptor(Array.prototype, 'findIndex'); if (!findIndexDescriptor) { diff --git a/src/core/matchers/matchersUtil.js b/src/core/matchers/matchersUtil.js index 3352fc30..aa6c2e8f 100644 --- a/src/core/matchers/matchersUtil.js +++ b/src/core/matchers/matchersUtil.js @@ -116,6 +116,7 @@ getJasmineRequireObj().matchersUtil = function(j$) { return result; } + // Identical objects are equal. `0 === -0`, but they aren't identical. // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). if (a === b) { @@ -167,6 +168,36 @@ getJasmineRequireObj().matchersUtil = function(j$) { } return result; // RegExps are compared by their source patterns and flags. + case '[object ArrayBuffer]': + // If we have an instance of ArrayBuffer the Uint8Array ctor + // will be defined as well + var arrayA = new Uint8Array(a); + var arrayB = new Uint8Array(b); + var arrayALength = arrayA.length; + var arrayBLength = arrayB.length; + + diffBuilder.withPath('length', function() { + if (arrayALength !== arrayBLength) { + diffBuilder.record(arrayALength, arrayBLength); + result = false; + } + }); + + for (i = 0; i < arrayALength || i < arrayBLength; i++) { + diffBuilder.withPath(i, function() { + if (i >= arrayBLength) { + diffBuilder.record(arrayA[i], void 0, actualArrayIsLongerFormatter); + result = false; + } else if (i >= arrayALength){ + diffBuilder.record(void 0, arrayB[i], actualArrayIsLongerFormatter); + result = false; + } else if (arrayA[i] !== arrayB[i]) { + diffBuilder.record(arrayA[i], arrayB[i]); + result = false; + } + }); + } + return result; case '[object RegExp]': return a.source == b.source && a.global == b.global && From 37073e2768875a2274f7a4197987271b5a599da0 Mon Sep 17 00:00:00 2001 From: Surgie Finesse Date: Mon, 22 Mar 2021 19:11:03 +1000 Subject: [PATCH 2/2] Fix the review notices --- spec/core/matchers/matchersUtilSpec.js | 21 +++++++++------ spec/helpers/checkForArrayBuffer.js | 25 +++++++++++++++++ spec/support/jasmine-browser.js | 1 + spec/support/jasmine.json | 1 + src/core/matchers/matchersUtil.js | 37 +++++++------------------- 5 files changed, 49 insertions(+), 36 deletions(-) create mode 100644 spec/helpers/checkForArrayBuffer.js diff --git a/spec/core/matchers/matchersUtilSpec.js b/spec/core/matchers/matchersUtilSpec.js index a91cbf0c..dab04308 100644 --- a/spec/core/matchers/matchersUtilSpec.js +++ b/spec/core/matchers/matchersUtilSpec.js @@ -885,18 +885,23 @@ describe('matchersUtil', function() { ); }); - it("passes for ArrayBuffers with same length and content", function() { - var buffer1 = new ArrayBuffer(4); - var buffer2 = new ArrayBuffer(4); + it('passes for ArrayBuffers with same length and content', function() { + jasmine.getEnv().requireFunctioningArrayBuffers(); + var buffer1 = new ArrayBuffer(4); // eslint-disable-line compat/compat + var buffer2 = new ArrayBuffer(4); // eslint-disable-line compat/compat expect(jasmineUnderTest.matchersUtil.equals(buffer1, buffer2)).toBe(true); }); - it("fails for ArrayBuffers with same length but different content", function() { - var buffer1 = new ArrayBuffer(4); - var buffer2 = new ArrayBuffer(4); - var array1 = new Uint8Array(buffer1); + it('fails for ArrayBuffers with same length but different content', function() { + jasmine.getEnv().requireFunctioningTypedArrays(); + jasmine.getEnv().requireFunctioningArrayBuffers(); + var buffer1 = new ArrayBuffer(4); // eslint-disable-line compat/compat + var buffer2 = new ArrayBuffer(4); // eslint-disable-line compat/compat + var array1 = new Uint8Array(buffer1); // eslint-disable-line compat/compat array1[0] = 1; - expect(jasmineUnderTest.matchersUtil.equals(buffer1, buffer2)).toBe(false); + expect(jasmineUnderTest.matchersUtil.equals(buffer1, buffer2)).toBe( + false + ); }); describe('when running in an environment with array polyfills', function() { diff --git a/spec/helpers/checkForArrayBuffer.js b/spec/helpers/checkForArrayBuffer.js new file mode 100644 index 00000000..a04a94e9 --- /dev/null +++ b/spec/helpers/checkForArrayBuffer.js @@ -0,0 +1,25 @@ +/* eslint-disable compat/compat */ +(function(env) { + function hasFunctioningArrayBuffers() { + if (typeof ArrayBuffer === 'undefined') { + return false; + } + + try { + var buffer = new ArrayBuffer(2); + var view8bit = new Uint8Array(buffer); + var view16bit = new Uint16Array(buffer); + view16bit[0] = 0xabcd; + return view8bit[0] === 0xcd && view8bit[1] === 0xab; + } catch (e) { + return false; + } + } + + env.requireFunctioningArrayBuffers = function() { + env.requireFunctioningTypedArrays(); + if (!hasFunctioningArrayBuffers()) { + env.pending('Browser has incomplete or missing support for ArrayBuffer'); + } + }; +})(jasmine.getEnv()); diff --git a/spec/support/jasmine-browser.js b/spec/support/jasmine-browser.js index 1f1e8bef..cacf28f7 100644 --- a/spec/support/jasmine-browser.js +++ b/spec/support/jasmine-browser.js @@ -20,6 +20,7 @@ module.exports = { 'helpers/asyncAwait.js', 'helpers/generator.js', 'helpers/BrowserFlags.js', + 'helpers/checkForArrayBuffer.js', 'helpers/checkForMap.js', 'helpers/checkForSet.js', 'helpers/checkForSymbol.js', diff --git a/spec/support/jasmine.json b/spec/support/jasmine.json index 56ed17c0..c9ffa120 100644 --- a/spec/support/jasmine.json +++ b/spec/support/jasmine.json @@ -7,6 +7,7 @@ "helpers": [ "helpers/asyncAwait.js", "helpers/generator.js", + "helpers/checkForArrayBuffer.js", "helpers/checkForMap.js", "helpers/checkForSet.js", "helpers/checkForSymbol.js", diff --git a/src/core/matchers/matchersUtil.js b/src/core/matchers/matchersUtil.js index d7158122..8ff30593 100644 --- a/src/core/matchers/matchersUtil.js +++ b/src/core/matchers/matchersUtil.js @@ -269,37 +269,18 @@ getJasmineRequireObj().MatchersUtil = function(j$) { diffBuilder.recordMismatch(); } return result; - // RegExps are compared by their source patterns and flags. case '[object ArrayBuffer]': // If we have an instance of ArrayBuffer the Uint8Array ctor // will be defined as well - var arrayA = new Uint8Array(a); - var arrayB = new Uint8Array(b); - var arrayALength = arrayA.length; - var arrayBLength = arrayB.length; - - diffBuilder.withPath('length', function() { - if (arrayALength !== arrayBLength) { - diffBuilder.record(arrayALength, arrayBLength); - result = false; - } - }); - - for (i = 0; i < arrayALength || i < arrayBLength; i++) { - diffBuilder.withPath(i, function() { - if (i >= arrayBLength) { - diffBuilder.record(arrayA[i], void 0, actualArrayIsLongerFormatter); - result = false; - } else if (i >= arrayALength){ - diffBuilder.record(void 0, arrayB[i], actualArrayIsLongerFormatter); - result = false; - } else if (arrayA[i] !== arrayB[i]) { - diffBuilder.record(arrayA[i], arrayB[i]); - result = false; - } - }); - } - return result; + return self.eq_( + new Uint8Array(a), // eslint-disable-line compat/compat + new Uint8Array(b), // eslint-disable-line compat/compat + aStack, + bStack, + customTesters, + diffBuilder + ); + // RegExps are compared by their source patterns and flags. case '[object RegExp]': return ( a.source == b.source &&