1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-04 00:54:14 +02:00

add encoders for variable length ints

This commit is contained in:
Robin Appelman 2017-08-12 23:09:37 +02:00
commit 79cd277fed
9 changed files with 148 additions and 24 deletions

View file

@ -1,19 +1,19 @@
import * as assert from 'assert';
import {BitStream} from 'bit-buffer';
import {Packet} from '../../../../Data/Packet';
import {Encoder, Parser} from '../../../../Parser/Packet/Parser';
import {isArray} from 'util';
export function getStream(data: string | number[]) {
if (isArray(data)) {
const array = new Uint8Array(data as number[]);
return new BitStream(array.buffer);
} else {
if (typeof data === 'string') {
const buffer = new Buffer(data + '\0remaining dummy data');
return new BitStream(buffer);
} else {
const array = new Uint8Array(data as number[]);
return new BitStream(array.buffer);
}
}
export type Encoder = (data: any, stream: BitStream) => void;
export function assertEncoder(parser: Parser, encoder: Encoder, data: any, length: number = 0) {
const stream = new BitStream(new ArrayBuffer(64));
@ -28,10 +28,12 @@ export function assertEncoder(parser: Parser, encoder: Encoder, data: any, lengt
stream.index = 0;
const result = parser(stream);
assert.deepEqual(data, result);
assert.deepEqual(data, result, 'Re-decoded value not equal to original value');
assert.equal(pos, stream.index, 'Number of bits used for encoding and parsing not equal');
}
export type Parser = (stream: BitStream) => any;
export function assertParser(parser: Parser, stream: BitStream, expected: any, length: number) {
const start = stream.index;
assert.deepEqual(expected, parser(stream));

View file

@ -29,8 +29,8 @@ suite('Parser generator', () => {
test('Boolean', () => {
const stream = new BitStream(new ArrayBuffer(64));
stream.writeBoolean(1);
stream.writeBoolean(0);
stream.writeBoolean(true);
stream.writeBoolean(false);
stream.writeASCIIString('remaining');
stream.index = 0;

View file

@ -0,0 +1,77 @@
import {BitStream} from 'bit-buffer';
import {assertEncoder, assertParser, getStream} from './Packet/PacketTest';
import {readBitVar, readVarInt, writeBitVar, writeVarInt} from '../../../Parser/readBitVar';
function readVarIntSigned(stream: BitStream) {
return readVarInt(stream, true);
}
function writeVarIntSigned(value: number, stream: BitStream) {
return writeVarInt(value, stream, true);
}
function readBitVarSigned(stream: BitStream) {
return readBitVar(stream, true);
}
function writeBitVarSigned(value: number, stream: BitStream) {
return writeBitVar(value, stream, true);
}
suite('readBitVar', () => {
test('readVarInt', () => {
assertParser(readVarInt, getStream([121, 25, 12, 14]), 121, 8);
assertParser(readVarInt, getStream([129, 25, 12, 14]), 3201, 16);
assertParser(readVarInt, getStream([129, 225, 12, 14]), 209025, 24);
assertParser(readVarInt, getStream([129, 225, 212, 14]), 30748801, 32);
});
test('readVarInt signed', () => {
assertParser(readVarIntSigned, getStream([121, 25, 12, 14]), -61, 8);
assertParser(readVarIntSigned, getStream([129, 25, 12, 14]), -1601, 16);
assertParser(readVarIntSigned, getStream([129, 225, 12, 14]), -104513, 24);
assertParser(readVarIntSigned, getStream([130, 225, 212, 14]), 15374401, 32);
});
test('writeVarInt', () => {
assertEncoder(readVarInt, writeVarInt, 121, 8);
assertEncoder(readVarInt, writeVarInt, 3201, 16);
assertEncoder(readVarInt, writeVarInt, 209025, 24);
assertEncoder(readVarInt, writeVarInt, 30748801, 32);
});
test('writeVarInt signed', () => {
assertEncoder(readVarIntSigned, writeVarIntSigned, -61, 8);
assertEncoder(readVarIntSigned, writeVarIntSigned, -1254, 16);
assertEncoder(readVarIntSigned, writeVarIntSigned, -104513, 24);
assertEncoder(readVarIntSigned, writeVarIntSigned, 15374401, 32);
});
test('readBitVar', () => {
assertParser(readBitVar, getStream([121, 25, 12, 14]), 94, 10);
assertParser(readBitVar, getStream([130, 25, 12, 14]), 1632, 14);
assertParser(readBitVar, getStream([8, 225, 12, 14]), 2, 6);
assertParser(readBitVar, getStream([131, 225, 212, 14, 123]), 3283433568, 34);
});
test('readBitVar signed', () => {
assertParser(readBitVarSigned, getStream([120, 225, 12, 14]), -2, 6);
assertParser(readBitVarSigned, getStream([121, 25, 12, 14]), 94, 10);
assertParser(readBitVarSigned, getStream([130, 25, 12, 14]), 1632, 14);
assertParser(readBitVarSigned, getStream([131, 225, 212, 14, 123]), -1011533728, 34);
});
test('writeVarInt', () => {
assertEncoder(readBitVar, writeBitVar, 2, 6);
assertEncoder(readBitVar, writeBitVar, 94, 10);
assertEncoder(readBitVar, writeBitVar, 1632, 14);
assertEncoder(readBitVar, writeBitVar, 3283433568, 34);
});
test('writeVarInt signed', () => {
assertEncoder(readBitVarSigned, writeBitVarSigned, 2, 6);
assertEncoder(readBitVarSigned, writeBitVarSigned, -94, 10);
assertEncoder(readBitVarSigned, writeBitVarSigned, 1632, 14);
assertEncoder(readBitVarSigned, writeBitVarSigned, -283433565, 34);
});
});