/** * @fileoverview Installs our custom equality matchers in Jasmine. */ goog.module('protobuf.testing.jasmineProtoBuf'); const BufferDecoder = goog.require('protobuf.binary.BufferDecoder'); const ByteString = goog.require('protobuf.ByteString'); const {arrayBufferEqual} = goog.require('protobuf.binary.typedArrays'); /** * A function that ensures custom equality for ByteStrings. * Since Jasmine compare structure by default Bytestrings might be equal that * are not equal since ArrayBuffers still compare content in g3. * (Jasmine fix upstream: https://github.com/jasmine/jasmine/issues/1687) * Also ByteStrings that are equal might compare non equal in jasmine of the * base64 string has been initialized. * @param {*} first * @param {*} second * @return {boolean|undefined} */ const byteStringEquality = (first, second) => { if (second instanceof ByteString) { return second.equals(first); } // Intentionally not returning anything, this signals to jasmine that we // did not perform any equality on the given objects. }; /** * A function that ensures custom equality for ArrayBuffers. * By default Jasmine does not compare the content of an ArrayBuffer and thus * will return true for buffers with the same length but different content. * @param {*} first * @param {*} second * @return {boolean|undefined} */ const arrayBufferCustomEquality = (first, second) => { if (first instanceof ArrayBuffer && second instanceof ArrayBuffer) { return arrayBufferEqual(first, second); } // Intentionally not returning anything, this signals to jasmine that we // did not perform any equality on the given objects. }; /** * A function that ensures custom equality for ArrayBuffers. * By default Jasmine does not compare the content of an ArrayBuffer and thus * will return true for buffers with the same length but different content. * @param {*} first * @param {*} second * @return {boolean|undefined} */ const bufferDecoderCustomEquality = (first, second) => { if (first instanceof BufferDecoder && second instanceof BufferDecoder) { return first.asByteString().equals(second.asByteString()); } // Intentionally not returning anything, this signals to jasmine that we // did not perform any equality on the given objects. }; /** * Overrides the default ArrayBuffer toString method ([object ArrayBuffer]) with * a more readable representation. */ function overrideArrayBufferToString() { /** * Returns the hex values of the underlying bytes of the ArrayBuffer. * * @override * @return {string} */ ArrayBuffer.prototype.toString = function() { const arr = Array.from(new Uint8Array(this)); return 'ArrayBuffer[' + arr.map((b) => '0x' + (b & 0xFF).toString(16).toUpperCase()) .join(', ') + ']'; }; } beforeEach(() => { jasmine.addCustomEqualityTester(arrayBufferCustomEquality); jasmine.addCustomEqualityTester(bufferDecoderCustomEquality); jasmine.addCustomEqualityTester(byteStringEquality); overrideArrayBufferToString(); });