diff --git a/spec/core/matchers/matchersUtilSpec.js b/spec/core/matchers/matchersUtilSpec.js index 839b7e67..dab04308 100644 --- a/spec/core/matchers/matchersUtilSpec.js +++ b/spec/core/matchers/matchersUtilSpec.js @@ -885,6 +885,25 @@ describe('matchersUtil', function() { ); }); + 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() { + 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 + ); + }); + describe('when running in an environment with array polyfills', function() { var findIndexDescriptor = Object.getOwnPropertyDescriptor( Array.prototype, 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 5f75a4ed..8ff30593 100644 --- a/src/core/matchers/matchersUtil.js +++ b/src/core/matchers/matchersUtil.js @@ -269,6 +269,17 @@ getJasmineRequireObj().MatchersUtil = function(j$) { diffBuilder.recordMismatch(); } return result; + case '[object ArrayBuffer]': + // If we have an instance of ArrayBuffer the Uint8Array ctor + // will be defined as well + 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 (