Files
hermes-desktop/tests/server/mcu-adpcm.test.ts
T
toor 01d9e301fc
Build / build (push) Canceled after 0s
Playwright / browser (push) Canceled after 0s
initialize Electron desktop app and remove unused files
2026-10-25 01:09:01 +08:00

33 lines
1.2 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
decodeMcuImaAdpcm,
encodeMcuImaAdpcm,
} from '../../packages/server/src/services/hermes/mcu-adpcm'
function pcmBuffer(samples: number[]): Buffer {
const pcm = Buffer.alloc(samples.length * 2)
samples.forEach((sample, index) => pcm.writeInt16LE(sample, index * 2))
return pcm
}
describe('MCU IMA-ADPCM', () => {
it('round-trips mono PCM with the expected HADP framing', () => {
const pcm = pcmBuffer([0, 1200, 2400, 1000, -500, -2200, -800, 300, 1500])
const encoded = encodeMcuImaAdpcm(pcm, 16000)
const decoded = decodeMcuImaAdpcm(encoded)
expect(encoded.toString('ascii', 0, 4)).toBe('HADP')
expect(encoded.length).toBe(20 + Math.ceil((pcm.length / 2 - 1) / 2))
expect(decoded.sampleRate).toBe(16000)
expect(decoded.channels).toBe(1)
expect(decoded.pcm.length).toBe(pcm.length)
expect(decoded.pcm.readInt16LE(0)).toBe(pcm.readInt16LE(0))
})
it('rejects truncated HADP chunks before allocating decoded PCM', () => {
const encoded = encodeMcuImaAdpcm(pcmBuffer([0, 1000, 2000, 3000]), 16000)
expect(() => decodeMcuImaAdpcm(encoded.subarray(0, -1))).toThrow('size does not match')
})
})