89 lines
3.0 KiB
JavaScript
89 lines
3.0 KiB
JavaScript
|
/**
|
||
|
* @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();
|
||
|
});
|