Home Reference Source Test

test/specs/generic/utils/buffer/SerialBuffer.spec.js

describe('SerialBuffer', () => {

    it('can writeUint8 and readUint8', () => {

        const value1 = 255;
        const value2 = 254;
        const value3 = 0;
        const value4 = 1;

        const buffer = new SerialBuffer(4);
        buffer.writeUint8(value1);
        buffer.writeUint8(value2);
        buffer.writeUint8(value3);
        buffer.writeUint8(value4);

        expect(buffer.readUint8()).toEqual(value1);
        expect(buffer.readUint8()).toEqual(value2);
        expect(buffer.readUint8()).toEqual(value3);
        expect(buffer.readUint8()).toEqual(value4);

    });

    it('can writeUint16 and readUint16', () => {

        const value1 = 65535;
        const value2 = 2;
        const value3 = 65535;
        const value4 = 0;

        const buffer = new SerialBuffer(8);
        buffer.writeUint16(value1);
        buffer.writeUint16(value2);
        buffer.writeUint16(value3);
        buffer.writeUint16(value4);

        expect(buffer.readUint16()).toEqual(value1);
        expect(buffer.readUint16()).toEqual(value2);
        expect(buffer.readUint16()).toEqual(value3);
        expect(buffer.readUint16()).toEqual(value4);

    });

    it('can writeUint32 and readUint32', () => {

        const value1 = 4294967295;
        const value2 = 254;
        const value3 = 394967295;
        const value4 = 1;

        const buffer = new SerialBuffer(16);
        buffer.writeUint32(value1);
        buffer.writeUint32(value2);
        buffer.writeUint32(value3);
        buffer.writeUint32(value4);

        expect(buffer.readUint32()).toEqual(value1);
        expect(buffer.readUint32()).toEqual(value2);
        expect(buffer.readUint32()).toEqual(value3);
        expect(buffer.readUint32()).toEqual(value4);

    });

    it('can writeUint64 and readUint64', () => {

        const value1 = Number.MAX_SAFE_INTEGER;
        const value2 = 42;
        const value3 = Number.MAX_SAFE_INTEGER;
        const value4 = 1;
        const value5 = Math.pow(2, 34) - 1;
        const value6 = Math.pow(2, 34) + 1;
        const value7 = 0xFFFFFFFF * 0x10000 + 0xFFFF;

        const buffer = new SerialBuffer(56);
        buffer.writeUint64(value1);
        buffer.writeUint64(value2);
        buffer.writeUint64(value3);
        buffer.writeUint64(value4);
        buffer.writeUint64(value5);
        buffer.writeUint64(value6);
        buffer.writeUint64(value7);

        expect(buffer.readUint64()).toEqual(value1);
        expect(buffer.readUint64()).toEqual(value2);
        expect(buffer.readUint64()).toEqual(value3);
        expect(buffer.readUint64()).toEqual(value4);
        expect(buffer.readUint64()).toEqual(value5);
        expect(buffer.readUint64()).toEqual(value6);
        expect(buffer.readUint64()).toEqual(value7);

    });
    
    it('can writeVarUint and readVarUint', () => {
        const value1 = Number.MAX_SAFE_INTEGER;
        const value2 = 42;
        const value3 = Math.pow(2, 30);
        const value4 = 0;
        
        const buffer = new SerialBuffer(SerialBuffer.varUintSize(value1) + SerialBuffer.varUintSize(value2) + SerialBuffer.varUintSize(value3) + SerialBuffer.varUintSize(value4));
        buffer.writeVarUint(value1);
        buffer.writeVarUint(value2);
        buffer.writeVarUint(value3);
        buffer.writeVarUint(value4);

        expect(buffer.readVarUint()).toEqual(value1);
        expect(buffer.readVarUint()).toEqual(value2);
        expect(buffer.readVarUint()).toEqual(value3);
        expect(buffer.readVarUint()).toEqual(value4);
    });

    it('can writeUint16 and readUint16 unaligned', () => {

        const value1 = 65535;
        const value2 = 2;
        const value3 = 65535;
        const value4 = 0;

        const buffer = new SerialBuffer(9);
        buffer.writeUint8(0);
        buffer.writeUint16(value1);
        buffer.writeUint16(value2);
        buffer.writeUint16(value3);
        buffer.writeUint16(value4);

        buffer.readUint8();
        expect(buffer.readUint16()).toEqual(value1);
        expect(buffer.readUint16()).toEqual(value2);
        expect(buffer.readUint16()).toEqual(value3);
        expect(buffer.readUint16()).toEqual(value4);

    });

    it('can writeUint32 and readUint32 unaligned', () => {

        const value1 = 4294967295;
        const value2 = 254;
        const value3 = 394967295;
        const value4 = 1;

        const buffer = new SerialBuffer(17);
        buffer.writeUint8(0);
        buffer.writeUint32(value1);
        buffer.writeUint32(value2);
        buffer.writeUint32(value3);
        buffer.writeUint32(value4);

        buffer.readUint8();
        expect(buffer.readUint32()).toEqual(value1);
        expect(buffer.readUint32()).toEqual(value2);
        expect(buffer.readUint32()).toEqual(value3);
        expect(buffer.readUint32()).toEqual(value4);

    });

    it('can writeUint64 and readUint64 unaligned', () => {

        const value1 = Number.MAX_SAFE_INTEGER;
        const value2 = 42;
        const value3 = Number.MAX_SAFE_INTEGER;
        const value4 = 1;

        const buffer = new SerialBuffer(33);
        buffer.writeUint8(0);
        buffer.writeUint64(value1);
        buffer.writeUint64(value2);
        buffer.writeUint64(value3);
        buffer.writeUint64(value4);

        buffer.readUint8();
        expect(buffer.readUint64()).toEqual(value1);
        expect(buffer.readUint64()).toEqual(value2);
        expect(buffer.readUint64()).toEqual(value3);
        expect(buffer.readUint64()).toEqual(value4);

    });

    it('can read and write Uint8Arrays', () => {

        const length = 8;
        const array1 = new Uint8Array(length);

        const buffer = new SerialBuffer(length);
        buffer.write(array1);

        const array2 = buffer.read(length);

        expect(BufferUtils.equals(array1, array2)).toEqual(true);
    });

    it('can read and write fixed length Strings', () => {
        const string1 = 'this is a test';
        const length1 = string1.length;

        const string2 = 'this is another test';
        const length2 = string2.length;

        const buffer = new SerialBuffer(length1 + 1 + length2 + 2);
        buffer.writePaddedString(string1, length1 + 1);
        buffer.writePaddedString(string2, length2 + 2);

        const testString1 = buffer.readPaddedString(length1 + 1);
        expect(testString1.length).toBe(length1);
        expect(testString1).toBe(string1);

        const testString2 = buffer.readPaddedString(length2 + 2);
        expect(testString2.length).toBe(length2);
        expect(testString2).toBe(string2);

        expect(() => {
            buffer.writePaddedString(string1, length1 - 2);
        }).toThrow('Malformed value/length');
    });

    it('throws an error on invalid writes/reads', () => {
        const value1 = Number.MAX_SAFE_INTEGER;

        const buffer = new SerialBuffer(8);
        buffer.writeUint64(value1);

        buffer.readUint64();
        expect(() => {
            buffer.readUint64();
        }).toThrow();
    });
});