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

add encoder for datatable message

This commit is contained in:
Robin Appelman 2017-09-25 00:37:29 +02:00
commit b94a79ab6d
7 changed files with 161 additions and 5 deletions

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,69 @@
import {BitStream} from 'bit-buffer';
import {assertEncoder, assertParser, getStream} from '../Packet/PacketTest';
import {readFileSync} from 'fs';
import {ParserState} from '../../../../Data/ParserState';
import {gunzipSync} from 'zlib';
import {DataTableHandler} from '../../../../Parser/Message/DataTable';
import {DataTablesMessage} from '../../../../Data/Message';
import {hydrateTable} from '../Packet/hydrate';
import {ServerClass} from '../../../../Data/ServerClass';
import * as assert from 'assert';
import {deepEqual} from 'assert';
const data = Array.from(readFileSync(__dirname + '/../../../data/dataTableData.bin').values());
const expectedRaw = JSON.parse(gunzipSync(readFileSync(__dirname + '/../../../data/dataTableResult.json.gz')).toString('utf8')) as DataTablesMessage;
const expected = {
type: expectedRaw.type,
tick: expectedRaw.tick,
serverClasses: expectedRaw.serverClasses.map(serverClass => new ServerClass(serverClass.id, serverClass.name, serverClass.dataTable)),
tables: expectedRaw.tables.map(hydrateTable)
};
const getParserState = () => {
return new ParserState();
};
const handler = DataTableHandler;
function parser(stream) {
const result = handler.parseMessage(stream, getParserState());
delete result.rawData;
return result;
}
function encoder(message, stream) {
handler.encodeMessage(message, stream, getParserState());
}
suite('DataTable', () => {
test('Parse DataTable message', () => {
assertParser(parser, getStream(data), expectedRaw, 947888);
});
test('Encode DataTable message', () => {
const length = 947888;
const stream = new BitStream(new ArrayBuffer(length + 64000));
encoder(expected, stream);
const pos = stream.index;
if (length) {
assert.equal(stream.index, length, 'Unexpected number of bits used for encoding');
}
stream.index = 0;
const result = parser(stream);
assert.deepEqual(result.serverClasses, expected.serverClasses, 'Re-decoded value not equal to original value');
assert.deepEqual(result.tick, expected.tick, 'Re-decoded value not equal to original value');
assert.deepEqual(result.type, expected.type, 'Re-decoded value not equal to original value');
for (let i = 0; i < result.tables.length; i++) {
const resultTable = JSON.parse(JSON.stringify(result.tables[i]));
const expectedTable = expectedRaw.tables[i];
assert.deepEqual(resultTable, expectedTable, 'Re-decoded value not equal to original value');
}
assert.equal(stream.index, pos, 'Number of bits used for encoding and parsing not equal');
});
});

View file

@ -31,7 +31,6 @@ export function assertEncoder(parser: Parser, encoder: Encoder, data: any, lengt
stream.index = 0;
const result = parser(stream);
deepEqual(result, data);
if (!deepEqual(result, data)) {
assert.deepEqual(result, data, 'Re-decoded value not equal to original value' + message);
}

View file

@ -49,6 +49,7 @@ export function propDataDefinition(propData): SendPropDefinition {
export function hydrateTable(tableData): SendTable {
const table = new SendTable(tableData.name);
table.needsDecoder = tableData.needsDecoder;
table.props = tableData.props.map(propDataDefinition);
return table;
}