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 &&