Files
Phoenix/scripts/test_binary_protocol.mjs
T

62 lines
2.2 KiB
JavaScript

import assert from 'node:assert/strict';
import fs from 'node:fs';
import vm from 'node:vm';
const source = fs.readFileSync(new URL('../www/core/binary_protocol.js', import.meta.url), 'utf8');
const context = vm.createContext({ ArrayBuffer, DataView, Float32Array, Number });
vm.runInContext(source.replaceAll('export function', 'function'), context, {
filename: 'binary_protocol.js',
});
function spectroPacket() {
const buffer = new ArrayBuffer(28);
const view = new DataView(buffer);
view.setUint32(0, 0x50585350, true);
view.setUint32(4, 42, true);
view.setUint32(8, 48000, true);
view.setUint32(12, 8192, true);
view.setUint32(16, 2, true);
view.setFloat32(20, -80, true);
view.setFloat32(24, -12.5, true);
return buffer;
}
function visualsPacket() {
const buffer = new ArrayBuffer(64);
const view = new DataView(buffer);
view.setUint32(0, 0x50585653, true);
view.setUint16(4, 1, true);
view.setUint16(6, 3, true);
view.setUint32(8, 7, true);
view.setUint32(12, 2, true);
view.setUint32(16, 2, true);
view.setUint16(20, 1, true);
view.setUint32(24, 5, true);
view.setUint32(28, 48000, true);
[-0.5, 0.25, 0.5, -0.25, -0.5, 0.5, -0.25, 0.25]
.forEach((value, index) => view.setFloat32(32 + index * 4, value, true));
return buffer;
}
const spectro = context.decodePhoenixSpectroBuffer(spectroPacket());
assert.equal(spectro.seq, 42);
assert.equal(spectro.sampleRate, 48000);
assert.equal(spectro.fftSize, 8192);
assert.deepEqual(Array.from(spectro.bins), [-80, -12.5]);
const visual = context.decodePhoenixVisualsBuffer(visualsPacket());
assert.equal(visual.seq, 7);
assert.deepEqual(Array.from(visual.left), [-0.5, 0.5]);
assert.deepEqual(Array.from(visual.right), [0.25, -0.25]);
assert.equal(visual.wave.columns, 2);
assert.equal(visual.wave.channels, 1);
assert.deepEqual(Array.from(visual.wave.data), [-0.5, 0.5, -0.25, 0.25]);
assert.equal(context.decodePhoenixSpectroBuffer(spectroPacket().slice(0, 24)), null);
assert.equal(context.decodePhoenixVisualsBuffer(visualsPacket().slice(0, 60)), null);
const wrongVersion = visualsPacket();
new DataView(wrongVersion).setUint16(4, 2, true);
assert.equal(context.decodePhoenixVisualsBuffer(wrongVersion), null);
console.log('binary protocol regression tests passed');