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:
parent
a979cf6b83
commit
79cd277fed
9 changed files with 148 additions and 24 deletions
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
77
src/tests/unit/Parser/readBitVarTest.ts
Normal file
77
src/tests/unit/Parser/readBitVarTest.ts
Normal 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);
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue