initial
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
'use strict';
|
||||
|
||||
const test = require('node:test');
|
||||
const assert = require('node:assert');
|
||||
const {
|
||||
encodeVarInt,
|
||||
parseVarInt,
|
||||
encodeString,
|
||||
readString,
|
||||
buildPacket,
|
||||
buildMCFrame,
|
||||
parseMCFrame,
|
||||
drainMCFrames,
|
||||
} = require('../src/bot/packets');
|
||||
|
||||
test('encodeVarInt: 0', () => {
|
||||
assert.deepStrictEqual([...encodeVarInt(0)], [0x00]);
|
||||
});
|
||||
|
||||
test('encodeVarInt: 127', () => {
|
||||
assert.deepStrictEqual([...encodeVarInt(127)], [0x7F]);
|
||||
});
|
||||
|
||||
test('encodeVarInt: 128', () => {
|
||||
assert.deepStrictEqual([...encodeVarInt(128)], [0x80, 0x01]);
|
||||
});
|
||||
|
||||
test('encodeVarInt: 16383', () => {
|
||||
assert.deepStrictEqual([...encodeVarInt(16383)], [0xFF, 0x7F]);
|
||||
});
|
||||
|
||||
test('encodeVarInt: 16384', () => {
|
||||
assert.deepStrictEqual([...encodeVarInt(16384)], [0x80, 0x80, 0x01]);
|
||||
});
|
||||
|
||||
test('encodeVarInt: 2^31-1', () => {
|
||||
assert.deepStrictEqual([...encodeVarInt(0x7FFFFFFF)], [0xFF, 0xFF, 0xFF, 0xFF, 0x07]);
|
||||
});
|
||||
|
||||
test('parseVarInt: round-trip', () => {
|
||||
for (const v of [0, 1, 127, 128, 255, 16383, 16384, 2 ** 31 - 1]) {
|
||||
const buf = encodeVarInt(v);
|
||||
const r = parseVarInt(buf, 0);
|
||||
assert.strictEqual(r.value, v, `round-trip ${v}`);
|
||||
assert.strictEqual(r.bytesRead, buf.length, `bytes ${v}`);
|
||||
}
|
||||
});
|
||||
|
||||
test('parseVarInt: incomplete returns 0 bytes', () => {
|
||||
const buf = Buffer.from([0x80]);
|
||||
const r = parseVarInt(buf, 0);
|
||||
assert.strictEqual(r.bytesRead, 0);
|
||||
});
|
||||
|
||||
test('encodeString/readString: ASCII', () => {
|
||||
const s = 'Hello';
|
||||
const buf = encodeString(s);
|
||||
const r = readString(buf, 0);
|
||||
assert.strictEqual(r.value, s);
|
||||
assert.strictEqual(r.bytesRead, buf.length);
|
||||
});
|
||||
|
||||
test('encodeString/readString: UTF-8 multibyte', () => {
|
||||
const s = 'héllo★world';
|
||||
const buf = encodeString(s);
|
||||
const r = readString(buf, 0);
|
||||
assert.strictEqual(r.value, s);
|
||||
assert.strictEqual(r.bytesRead, buf.length);
|
||||
});
|
||||
|
||||
test('buildPacket: id + data', () => {
|
||||
const buf = buildPacket(0x02, encodeString('hi'));
|
||||
assert.strictEqual(buf[0], 0x02);
|
||||
assert.strictEqual(buf[1], 2);
|
||||
assert.strictEqual(buf[2], 0x68);
|
||||
assert.strictEqual(buf[3], 0x69);
|
||||
});
|
||||
|
||||
test('buildMCFrame + parseMCFrame round-trip', () => {
|
||||
const frame = buildMCFrame(0x1F, Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]));
|
||||
const r = parseMCFrame(frame, 0);
|
||||
assert.strictEqual(r.complete, true);
|
||||
assert.strictEqual(r.packetId, 0x1F);
|
||||
assert.deepStrictEqual([...r.data], [1, 2, 3, 4, 5, 6, 7, 8]);
|
||||
assert.strictEqual(r.bytesRead, frame.length);
|
||||
});
|
||||
|
||||
test('parseMCFrame: incomplete returns complete=false', () => {
|
||||
const frame = buildMCFrame(0x1F, Buffer.from([1, 2, 3]));
|
||||
const partial = frame.slice(0, frame.length - 2);
|
||||
const r = parseMCFrame(partial, 0);
|
||||
assert.strictEqual(r.complete, false);
|
||||
assert.strictEqual(r.bytesRead, 0);
|
||||
});
|
||||
|
||||
test('drainMCFrames: consumes multiple', () => {
|
||||
const f1 = buildMCFrame(0x1F, Buffer.from([0xAA, 0xBB]));
|
||||
const f2 = buildMCFrame(0x23, Buffer.from([0x01]));
|
||||
const f3 = buildMCFrame(0x2F, Buffer.alloc(33));
|
||||
const combined = Buffer.concat([f1, f2, f3]);
|
||||
const seen = [];
|
||||
const { consumed, frames } = drainMCFrames(combined, (id, data) => seen.push({ id, data }));
|
||||
assert.strictEqual(consumed, combined.length);
|
||||
assert.strictEqual(frames, 3);
|
||||
assert.strictEqual(seen[0].id, 0x1F);
|
||||
assert.strictEqual(seen[1].id, 0x23);
|
||||
assert.strictEqual(seen[2].id, 0x2F);
|
||||
});
|
||||
|
||||
test('drainMCFrames: partial at end', () => {
|
||||
const f1 = buildMCFrame(0x1F, Buffer.from([0xAA]));
|
||||
const f2 = buildMCFrame(0x23, Buffer.from([0x01]));
|
||||
const partial = Buffer.concat([f1, f2]).slice(0, f1.length + 2);
|
||||
const seen = [];
|
||||
const { consumed, frames } = drainMCFrames(partial, (id, data) => seen.push({ id }));
|
||||
assert.strictEqual(frames, 1);
|
||||
assert.strictEqual(seen[0].id, 0x1F);
|
||||
assert.strictEqual(consumed, f1.length);
|
||||
});
|
||||
Reference in New Issue
Block a user