From d03b61e1930fd8b1add3fa9af52a463343291511 Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Wed, 22 Jan 2025 22:35:10 -0600 Subject: [PATCH 1/2] add basic tests covering encoding chunks --- package.json | 4 +- tests/encode.test.js | 152 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 tests/encode.test.js diff --git a/package.json b/package.json index 7eb8db9..df7ca4b 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,9 @@ "prepublishOnly": "npm run build", "lint:check": "eslint ./src", "format:check": "prettier ./ --check", - "format:write": "prettier ./ --write" + "format:write": "prettier ./ --write", + "pretest": "npm run build", + "test": "node --test --experimental-test-coverage" }, "files": [ "dist" diff --git a/tests/encode.test.js b/tests/encode.test.js new file mode 100644 index 0000000..6c44db1 --- /dev/null +++ b/tests/encode.test.js @@ -0,0 +1,152 @@ +const { deepEqual, throws, equal } = require('assert'); +const { describe, it } = require('node:test'); +const { Encoders } = require('../dist/cjs/encoders'); + +const goodTests = [ + { + description: 'DataTrackerPosChunk', + expected: new Uint8Array([0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + bytes: Encoders.DataTrackerPosChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerSpeedChunk', + expected: new Uint8Array([1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + bytes: Encoders.DataTrackerSpeedChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerOriChunk', + expected: new Uint8Array([2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + bytes: Encoders.DataTrackerOriChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerStatusChunk', + expected: new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), + bytes: Encoders.DataTrackerStatusChunk(1.0), + }, + { + description: 'DataTrackerAccelChunk', + expected: new Uint8Array([4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + bytes: Encoders.DataTrackerAccelChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerTrgtposChunk', + expected: new Uint8Array([5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + bytes: Encoders.DataTrackerTrgtposChunk(1.0, 2.0, 3.0), + }, + { + description: 'DataTrackerTimestampChunk', + expected: new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), + bytes: Encoders.DataTrackerTimestampChunk(1234567890n), + }, + { + description: 'DataTrackerChunk', + expected: new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, + 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, + 150, 73, 0, 0, 0, 0, + ]), + bytes: Encoders.DataTrackerChunk(1, [ + new Uint8Array([0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), + new Uint8Array([4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), + ]), + }, + { + description: 'DataTrackerListChunk', + expected: new Uint8Array([ + 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, + 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, + 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + bytes: Encoders.DataTrackerListChunk([ + new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, + 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, + 2, 150, 73, 0, 0, 0, 0, + ]), + ]), + }, + { + description: 'DataPacketChunk', + expected: new Uint8Array([ + 85, 103, 124, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + bytes: Encoders.DataPacketChunk( + new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + new Uint8Array([ + 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, + 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, + 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, + 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]) + ), + }, + { + description: 'InfoTrackerNameChunk', + expected: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + bytes: Encoders.InfoTrackerNameChunk('Tracker 1'), + }, + { + description: 'InfoSystemNameChunk', + expected: new Uint8Array([1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), + bytes: Encoders.InfoSystemNameChunk('PSN Server'), + }, + { + description: 'InfoTrackerChunk', + expected: new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + bytes: Encoders.InfoTrackerChunk(1, new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49])), + }, + { + description: 'InfoTrackerListChunk', + expected: new Uint8Array([2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + bytes: Encoders.InfoTrackerListChunk([ + new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + ]), + }, + { + description: 'PacketHeaderChunk', + expected: new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + bytes: Encoders.PacketHeaderChunk(1234567890n, 2, 3, 1, 123), + }, + { + description: 'InfoPacketChunk', + expected: new Uint8Array([ + 86, 103, 51, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, + 114, 118, 101, 114, 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + bytes: Encoders.InfoPacketChunk( + new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + new Uint8Array([1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), + new Uint8Array([2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]) + ), + }, +]; + +describe('PSN Message Encoding', () => { + goodTests.forEach((messageTest) => { + it(messageTest.description, () => { + deepEqual(messageTest.bytes, messageTest.expected); + }); + }); +}); + +//TODO(jwetzell): add tests that handle errors +const badTests = []; + +describe('PSN Message Encoding Throws', () => { + badTests.forEach((messageTest) => { + it(messageTest.description, () => { + throws(() => {}, messageTest.throwsMessage); + }); + }); +}); From 9811ad1b7f49421afbad5949dd9e3c0072b7522f Mon Sep 17 00:00:00 2001 From: Joel Wetzell Date: Wed, 22 Jan 2025 23:03:55 -0600 Subject: [PATCH 2/2] add basic tests covering decoding chunks --- tests/decode.test.js | 647 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 647 insertions(+) create mode 100644 tests/decode.test.js diff --git a/tests/decode.test.js b/tests/decode.test.js new file mode 100644 index 0000000..03a2aed --- /dev/null +++ b/tests/decode.test.js @@ -0,0 +1,647 @@ +const { deepEqual, throws } = require('assert'); +const { describe, it } = require('node:test'); +const { Decoders } = require('../dist/cjs/decoders'); + +const goodTests = [ + { + description: 'DataTrackerPosChunk', + bytes: new Uint8Array([0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerSpeedChunk', + bytes: new Uint8Array([1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 1, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerOriChunk', + bytes: new Uint8Array([2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 2, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerStatusChunk', + bytes: new Uint8Array([3, 0, 4, 0, 0, 0, 128, 63]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63]), + header: { dataLen: 4, id: 3, hasSubchunks: false }, + }, + data: { + validity: 1.0, + }, + }, + decoder: Decoders.DataTrackerStatusChunk, + }, + { + description: 'DataTrackerAccelChunk', + bytes: new Uint8Array([4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 4, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerTrgtPosChunk', + bytes: new Uint8Array([5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 5, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + decoder: Decoders.DataTrackerXYZChunk, + }, + { + description: 'DataTrackerTimestampChunk', + bytes: new Uint8Array([6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0]), + expected: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), + header: { dataLen: 8, id: 6, hasSubchunks: false }, + }, + data: { + timestamp: 1234567890n, + }, + }, + decoder: Decoders.DataTrackerTimestampChunk, + }, + { + description: 'DataTrackerChunk', + bytes: new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, + 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, + 150, 73, 0, 0, 0, 0, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, + 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, + 0, 0, 0, 0, + ]), + header: { dataLen: 100, id: 1, hasSubchunks: true }, + }, + data: { + pos: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + speed: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 1, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + ori: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 2, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + status: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63]), + header: { dataLen: 4, id: 3, hasSubchunks: false }, + }, + data: { + validity: 1.0, + }, + }, + accel: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 4, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + trgtpos: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 5, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + timestamp: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), + header: { dataLen: 8, id: 6, hasSubchunks: false }, + }, + data: { + timestamp: 1234567890n, + }, + }, + }, + }, + decoder: Decoders.DataTrackerChunk, + }, + { + description: 'DataTrackerListChunk', + bytes: new Uint8Array([ + 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, + 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, + 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, + 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, + 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 104, id: 1, hasSubchunks: true }, + }, + data: { + trackers: [ + { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, + 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, + 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, + 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 100, id: 1, hasSubchunks: true }, + }, + data: { + pos: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + speed: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 1, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + ori: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 2, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + status: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63]), + header: { dataLen: 4, id: 3, hasSubchunks: false }, + }, + data: { + validity: 1.0, + }, + }, + accel: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 4, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + trgtpos: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 5, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + timestamp: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), + header: { dataLen: 8, id: 6, hasSubchunks: false }, + }, + data: { + timestamp: 1234567890n, + }, + }, + }, + }, + ], + }, + }, + decoder: Decoders.DataTrackerListChunk, + }, + { + description: 'DataPacketChunk', + bytes: new Uint8Array([ + 85, 103, 124, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, + 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, + 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 104, 128, 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, + 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, + 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 124, id: 26453, hasSubchunks: true }, + }, + data: { + packetHeader: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + packetTimestamp: 1234567890n, + versionHigh: 2, + versionLow: 3, + frameId: 1, + framePacketCount: 123, + }, + }, + trackerList: { + chunk: { + chunkData: new Uint8Array([ + 1, 0, 100, 128, 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, + 0, 64, 0, 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, + 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, + 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 104, id: 1, hasSubchunks: true }, + }, + data: { + trackers: [ + { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 1, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, + 0, 64, 64, 2, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 3, 0, 4, 0, 0, 0, 128, 63, 4, 0, + 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 5, 0, 12, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, + 64, 6, 0, 8, 0, 210, 2, 150, 73, 0, 0, 0, 0, + ]), + header: { dataLen: 100, id: 1, hasSubchunks: true }, + }, + data: { + pos: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + speed: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 1, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + ori: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 2, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + status: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63]), + header: { dataLen: 4, id: 3, hasSubchunks: false }, + }, + data: { + validity: 1.0, + }, + }, + accel: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 4, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + trgtpos: { + chunk: { + chunkData: new Uint8Array([0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64]), + header: { dataLen: 12, id: 5, hasSubchunks: false }, + }, + data: { + x: 1.0, + y: 2.0, + z: 3.0, + }, + }, + timestamp: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0]), + header: { dataLen: 8, id: 6, hasSubchunks: false }, + }, + data: { + timestamp: 1234567890n, + }, + }, + }, + }, + ], + }, + }, + }, + }, + decoder: Decoders.DataPacketChunk, + }, + { + description: 'InfoTrackerNameChunk', + bytes: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + expected: { + chunk: { + chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 9, id: 0, hasSubchunks: false }, + }, + data: { + trackerName: 'Tracker 1', + }, + }, + decoder: Decoders.InfoTrackerNameChunk, + }, + { + description: 'InfoSystemNameChunk', + bytes: new Uint8Array([1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), + expected: { + chunk: { + chunkData: new Uint8Array([80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), + header: { dataLen: 10, id: 1, hasSubchunks: false }, + }, + data: { + systemName: 'PSN Server', + }, + }, + decoder: Decoders.InfoSystemNameChunk, + }, + { + description: 'InfoTrackerChunk', + bytes: new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + expected: { + chunk: { + chunkData: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 13, id: 1, hasSubchunks: true }, + }, + data: { + trackerName: { + chunk: { + chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 9, id: 0, hasSubchunks: false }, + }, + data: { + trackerName: 'Tracker 1', + }, + }, + }, + }, + decoder: Decoders.InfoTrackerChunk, + }, + { + description: 'InfoTrackerListChunk', + bytes: new Uint8Array([2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + expected: { + chunk: { + chunkData: new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 17, id: 2, hasSubchunks: true }, + }, + data: { + trackers: [ + { + chunk: { + chunkData: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 13, id: 1, hasSubchunks: true }, + }, + data: { + trackerName: { + chunk: { + chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 9, id: 0, hasSubchunks: false }, + }, + data: { + trackerName: 'Tracker 1', + }, + }, + }, + }, + ], + }, + }, + decoder: Decoders.InfoTrackerListChunk, + }, + { + description: 'PacketHeaderChunk', + bytes: new Uint8Array([0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + expected: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + packetTimestamp: 1234567890n, + versionHigh: 2, + versionLow: 3, + frameId: 1, + framePacketCount: 123, + }, + }, + decoder: Decoders.PacketHeaderChunk, + }, + { + description: 'InfoPacketChunk', + bytes: new Uint8Array([ + 86, 103, 51, 128, 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, + 114, 118, 101, 114, 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + expected: { + chunk: { + chunkData: new Uint8Array([ + 0, 0, 12, 0, 210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123, 1, 0, 10, 0, 80, 83, 78, 32, 83, 101, 114, 118, 101, + 114, 2, 0, 17, 128, 1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49, + ]), + header: { dataLen: 51, id: 26454, hasSubchunks: true }, + }, + data: { + packetHeader: { + chunk: { + chunkData: new Uint8Array([210, 2, 150, 73, 0, 0, 0, 0, 2, 3, 1, 123]), + header: { dataLen: 12, id: 0, hasSubchunks: false }, + }, + data: { + packetTimestamp: 1234567890n, + versionHigh: 2, + versionLow: 3, + frameId: 1, + framePacketCount: 123, + }, + }, + systemName: { + chunk: { + chunkData: new Uint8Array([80, 83, 78, 32, 83, 101, 114, 118, 101, 114]), + header: { dataLen: 10, id: 1, hasSubchunks: false }, + }, + data: { + systemName: 'PSN Server', + }, + }, + trackerList: { + chunk: { + chunkData: new Uint8Array([1, 0, 13, 128, 0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 17, id: 2, hasSubchunks: true }, + }, + data: { + trackers: [ + { + chunk: { + chunkData: new Uint8Array([0, 0, 9, 0, 84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 13, id: 1, hasSubchunks: true }, + }, + data: { + trackerName: { + chunk: { + chunkData: new Uint8Array([84, 114, 97, 99, 107, 101, 114, 32, 49]), + header: { dataLen: 9, id: 0, hasSubchunks: false }, + }, + data: { + trackerName: 'Tracker 1', + }, + }, + }, + }, + ], + }, + }, + }, + }, + decoder: Decoders.InfoPacketChunk, + }, +]; + +describe('PSN Bytes Decoding', () => { + goodTests.forEach((bytesTest) => { + it(bytesTest.description, () => { + const decoded = bytesTest.decoder(bytesTest.bytes); + deepEqual(decoded, bytesTest.expected); + }); + }); +}); + +// TODO(jwetzell): add error tests +const badTests = []; +describe('PSN Bytes Decoding Throws', () => { + badTests.forEach((bytesTest) => { + it(bytesTest.description, () => { + throws(() => { + bytesTest.decoder(bytesTest.bytes); + }, bytesTest.throwsMessage); + }); + }); +});