mirror of
https://github.com/demostf/demo.js
synced 2026-06-04 00:54:14 +02:00
add tests for all entities in demo
This commit is contained in:
parent
450300c1b0
commit
ce6dec06ac
8 changed files with 218 additions and 2 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
--require ts-node/register
|
--require ts-node/register
|
||||||
--watch-extensions ts
|
--watch-extensions ts
|
||||||
--ui tdd
|
--ui tdd
|
||||||
--timeout 20000
|
--timeout 60000
|
||||||
src/tests/**/*.ts
|
src/tests/**/*.ts
|
||||||
|
|
|
||||||
73
package-lock.json
generated
73
package-lock.json
generated
|
|
@ -287,6 +287,12 @@
|
||||||
"integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
|
"integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"core-util-is": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"version": "https://registry.npmjs.org/debug/-/debug-2.4.5.tgz",
|
"version": "https://registry.npmjs.org/debug/-/debug-2.4.5.tgz",
|
||||||
"integrity": "sha1-NMexKhypZnRCj0H+ksSbTOfNBgc=",
|
"integrity": "sha1-NMexKhypZnRCj0H+ksSbTOfNBgc=",
|
||||||
|
|
@ -378,6 +384,12 @@
|
||||||
"loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.0.tgz"
|
"loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.0.tgz"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"isarray": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"js-tokens": {
|
"js-tokens": {
|
||||||
"version": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz",
|
"version": "https://registry.npmjs.org/js-tokens/-/js-tokens-2.0.0.tgz",
|
||||||
"integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=",
|
"integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=",
|
||||||
|
|
@ -562,6 +574,27 @@
|
||||||
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
|
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"process-nextick-args": {
|
||||||
|
"version": "1.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
|
||||||
|
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "2.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
|
||||||
|
"integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"core-util-is": "1.0.2",
|
||||||
|
"inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||||
|
"isarray": "1.0.0",
|
||||||
|
"process-nextick-args": "1.0.7",
|
||||||
|
"safe-buffer": "5.1.1",
|
||||||
|
"string_decoder": "1.0.3",
|
||||||
|
"util-deprecate": "1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"regenerator-runtime": {
|
"regenerator-runtime": {
|
||||||
"version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz",
|
"version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz",
|
||||||
"integrity": "sha1-JX9BlhzkRVixj3gUr0jBdVn5+us=",
|
"integrity": "sha1-JX9BlhzkRVixj3gUr0jBdVn5+us=",
|
||||||
|
|
@ -576,6 +609,12 @@
|
||||||
"path-parse": "1.0.5"
|
"path-parse": "1.0.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"safe-buffer": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"semver": {
|
"semver": {
|
||||||
"version": "5.4.1",
|
"version": "5.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
|
||||||
|
|
@ -599,6 +638,24 @@
|
||||||
"source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
|
"source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"split2": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/split2/-/split2-2.1.1.tgz",
|
||||||
|
"integrity": "sha1-eh9VHhdqkOzTNF9yRqDP4XXvT9A=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"through2": "2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "5.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"strip-ansi": {
|
"strip-ansi": {
|
||||||
"version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
"version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||||
|
|
@ -622,6 +679,16 @@
|
||||||
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
|
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"through2": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
|
||||||
|
"integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"readable-stream": "2.3.3",
|
||||||
|
"xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz"
|
||||||
|
}
|
||||||
|
},
|
||||||
"to-fast-properties": {
|
"to-fast-properties": {
|
||||||
"version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz",
|
"version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz",
|
||||||
"integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=",
|
"integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=",
|
||||||
|
|
@ -774,6 +841,12 @@
|
||||||
"integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
|
"integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"util-deprecate": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"v8flags": {
|
"v8flags": {
|
||||||
"version": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.12.tgz",
|
"version": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.12.tgz",
|
||||||
"integrity": "sha1-cyNdn3F2+OiDP7KGeVRF95ONhOU=",
|
"integrity": "sha1-cyNdn3F2+OiDP7KGeVRF95ONhOU=",
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@
|
||||||
"babel-plugin-transform-do-expressions": "^6.8.0",
|
"babel-plugin-transform-do-expressions": "^6.8.0",
|
||||||
"babel-preset-es2015-node6": "^0.4.0",
|
"babel-preset-es2015-node6": "^0.4.0",
|
||||||
"mocha": "^3.2.0",
|
"mocha": "^3.2.0",
|
||||||
|
"split2": "^2.1.1",
|
||||||
"ts-node": "^2.1.0",
|
"ts-node": "^2.1.0",
|
||||||
"tslint": "^5.5.0",
|
"tslint": "^5.5.0",
|
||||||
"typescript": "^2.1.4"
|
"typescript": "^2.1.4"
|
||||||
|
|
|
||||||
BIN
src/tests/data/pov2_entities.json.gz
Normal file
BIN
src/tests/data/pov2_entities.json.gz
Normal file
Binary file not shown.
0
src/tests/data/snakewater_entities.json
Normal file
0
src/tests/data/snakewater_entities.json
Normal file
BIN
src/tests/data/snakewater_entities.json.gz
Normal file
BIN
src/tests/data/snakewater_entities.json.gz
Normal file
Binary file not shown.
114
src/tests/snapshot/entities.ts
Normal file
114
src/tests/snapshot/entities.ts
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
import * as assert from 'assert';
|
||||||
|
import {readFileSync, createWriteStream, createReadStream} from 'fs';
|
||||||
|
import {Demo} from '../../Demo';
|
||||||
|
import {Packet} from '../../Data/Packet';
|
||||||
|
import {BitStream} from 'bit-buffer';
|
||||||
|
import * as split2 from 'split2';
|
||||||
|
import {createUnzip, createGunzip} from 'zlib';
|
||||||
|
import {PassThrough} from 'stream';
|
||||||
|
|
||||||
|
function writeEntities(name: string) {
|
||||||
|
const targetFile = `${__dirname}/../data/${name}_entities.json`;
|
||||||
|
const source = readFileSync(`${__dirname}/../data/${name}.dem`);
|
||||||
|
const demo = Demo.fromNodeBuffer(source);
|
||||||
|
const parser = demo.getParser(false);
|
||||||
|
parser.readHeader();
|
||||||
|
const match = parser.match;
|
||||||
|
|
||||||
|
const writeStream = createWriteStream(targetFile, 'utf8');
|
||||||
|
|
||||||
|
let index = 0;
|
||||||
|
|
||||||
|
const raw = new PassThrough();
|
||||||
|
raw.pipe(createGunzip()).pipe(writeStream);
|
||||||
|
|
||||||
|
parser.on('packet', (packet: Packet) => {
|
||||||
|
if (packet.packetType === 'packetEntities') {
|
||||||
|
for (const entity of packet.entities) {
|
||||||
|
const entityProps = {};
|
||||||
|
for (const prop of entity.props) {
|
||||||
|
entityProps[`${prop.definition.name}`] = prop.value;
|
||||||
|
}
|
||||||
|
raw.write(JSON.stringify({
|
||||||
|
tick: match.tick,
|
||||||
|
serverClass: entity.serverClass.name,
|
||||||
|
id: entity.entityIndex,
|
||||||
|
props: entityProps,
|
||||||
|
pvs: entity.pvs
|
||||||
|
}) + '\n');
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
parser.parseBody();
|
||||||
|
|
||||||
|
raw.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testEntities(name: string, entityCount: number) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const targetFile = `${__dirname}/../data/${name}_entities.json.gz`;
|
||||||
|
const source = readFileSync(`${__dirname}/../data/${name}.dem`);
|
||||||
|
const demo = Demo.fromNodeBuffer(source);
|
||||||
|
const parser = demo.getParser(false);
|
||||||
|
parser.readHeader();
|
||||||
|
const match = parser.match;
|
||||||
|
|
||||||
|
const resultData: any[] = [];
|
||||||
|
parser.on('packet', (packet: Packet) => {
|
||||||
|
if (packet.packetType === 'packetEntities') {
|
||||||
|
for (const entity of packet.entities) {
|
||||||
|
const entityProps = {};
|
||||||
|
for (const prop of entity.props) {
|
||||||
|
entityProps[`${prop.definition.name}`] = prop.value;
|
||||||
|
}
|
||||||
|
resultData.push({
|
||||||
|
tick: match.tick,
|
||||||
|
serverClass: entity.serverClass.name,
|
||||||
|
id: entity.entityIndex,
|
||||||
|
props: entityProps,
|
||||||
|
pvs: entity.pvs
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function parseEntities() {
|
||||||
|
const message = parser.tick();
|
||||||
|
if (message && resultData.length === 0) {
|
||||||
|
parseEntities();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const readStream = createReadStream(targetFile);
|
||||||
|
|
||||||
|
let parsed = 0;
|
||||||
|
|
||||||
|
readStream
|
||||||
|
.pipe(createUnzip())
|
||||||
|
.pipe(split2(JSON.parse)).on('data', (data) => {
|
||||||
|
if (resultData.length < 1) {
|
||||||
|
parseEntities();
|
||||||
|
}
|
||||||
|
const result = resultData.shift();
|
||||||
|
assert.deepEqual(data, result);
|
||||||
|
parsed++;
|
||||||
|
}).on('end', () => {
|
||||||
|
assert.equal(resultData.length, 0, 'Entities left to be checked');
|
||||||
|
assert.equal(parsed, entityCount, 'unexpected number of entities');
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
}).on('error', err => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
suite('Parse all demo entities', () => {
|
||||||
|
test('Parse snakewater.dem', () => {
|
||||||
|
return testEntities('snakewater', 578869);
|
||||||
|
});
|
||||||
|
test('Parse post MyM POV demo', () => {
|
||||||
|
return testEntities('pov2', 1066826);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -1,11 +1,13 @@
|
||||||
import * as assert from 'assert';
|
import * as assert from 'assert';
|
||||||
import {readFileSync} from 'fs';
|
import {readFileSync} from 'fs';
|
||||||
import {Demo} from '../../Demo';
|
import {Demo} from '../../Demo';
|
||||||
|
import {Packet} from '../../Data/Packet';
|
||||||
|
import {BitStream} from 'bit-buffer';
|
||||||
|
|
||||||
function testDemo(name: string, fastMode: boolean = false) {
|
function testDemo(name: string, fastMode: boolean = false) {
|
||||||
const target = JSON.parse(readFileSync(`${__dirname}/../data/${name}.json`, 'utf8'));
|
const target = JSON.parse(readFileSync(`${__dirname}/../data/${name}.json`, 'utf8'));
|
||||||
const source = readFileSync(`${__dirname}/../data/${name}.dem`);
|
const source = readFileSync(`${__dirname}/../data/${name}.dem`);
|
||||||
const demo = Demo.fromNodeBuffer(source);
|
const demo = Demo.fromNodeBuffer(source);
|
||||||
const parser = demo.getParser(fastMode);
|
const parser = demo.getParser(fastMode);
|
||||||
parser.readHeader();
|
parser.readHeader();
|
||||||
parser.parseBody();
|
parser.parseBody();
|
||||||
|
|
@ -13,6 +15,32 @@ function testDemo(name: string, fastMode: boolean = false) {
|
||||||
assert.deepEqual(JSON.parse(JSON.stringify(parsed)), target);
|
assert.deepEqual(JSON.parse(JSON.stringify(parsed)), target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function testPackets() {
|
||||||
|
const target = JSON.parse(readFileSync(`${__dirname}/../data/${name}_packets.json`, 'utf8'));
|
||||||
|
const source = readFileSync(`${__dirname}/../data/${name}.dem`);
|
||||||
|
const demo = Demo.fromNodeBuffer(source);
|
||||||
|
const parser = demo.getParser(false);
|
||||||
|
parser.readHeader();
|
||||||
|
const match = parser.match;
|
||||||
|
|
||||||
|
const packets: {[tick: string]: Partial<Packet>[]} = {};
|
||||||
|
|
||||||
|
parser.on('packet', (packet: Packet) => {
|
||||||
|
if (!packets[match.tick]) {
|
||||||
|
packets[match.tick] = [];
|
||||||
|
}
|
||||||
|
const packetData = {};
|
||||||
|
for (const key in packet) {
|
||||||
|
if (packet.hasOwnProperty(key) && !(packet[key] instanceof BitStream)) {
|
||||||
|
packetData[key] = packet[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
packets[match.tick].push(packetData);
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.deepEqual(JSON.parse(JSON.stringify(packets)), target);
|
||||||
|
}
|
||||||
|
|
||||||
suite('Parse basic demo info', () => {
|
suite('Parse basic demo info', () => {
|
||||||
test('Fast mode', () => {
|
test('Fast mode', () => {
|
||||||
testDemo('snakewater', true);
|
testDemo('snakewater', true);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue