cat / goq
clone

turns a linux box into a private steam streaming appliance: plug in, tap your key, play from another computer

fix/docs-activation-truth
goq / portal / audio-ui.test.mjs
audio-ui.test.mjs 2.8K
1import assert from 'node:assert/strict';2import test from 'node:test';34import { audioButtonPresentation, newAudioSession } from './audio-ui.mjs';56test('new audio sessions pin all resource, channel, status, and telemetry defaults', () => {7 const session = newAudioSession();89 assert.deepEqual({10 ...session,11 messageTracker: undefined,12 }, {13 expectedGeneration: null,14 acceptsNativeEvents: false,15 pendingTerminalStates: [],16 failed: false,17 failureDetail: null,18 stopRequested: false,19 channel: null,20 context: null,21 decoder: null,22 workletNode: null,23 available: false,24 muted: false,25 state: 'unavailable',26 stateDetail: 'not connected',27 packetsReceived: 0,28 decoderDropped: 0,29 bufferedFrames: 0,30 underflows: 0,31 underflowDurationMicros: 0,32 silentDurationMicros: 0,33 transportDropped: 0,34 frontendDropped: 0,35 workletDroppedFrames: 0,36 workletRecoveryDiscardedFrames: 0,37 audioTimeline: null,38 avSyncEpoch: 0,39 messageTracker: undefined,40 });41 assert.equal(session.messageTracker.size, 0);42 assert.equal(session.messageTracker.droppedMessages, 0);43});4445test('new audio sessions preserve seeded mute state and isolate mutable state', () => {46 const muted = newAudioSession({ muted: true });47 const fresh = newAudioSession();4849 muted.pendingTerminalStates.push({ generation: 7 });50 assert.equal(muted.muted, true);51 assert.equal(fresh.muted, false);52 assert.deepEqual(fresh.pendingTerminalStates, []);53 assert.notEqual(muted.pendingTerminalStates, fresh.pendingTerminalStates);54 assert.notEqual(muted.messageTracker, fresh.messageTracker);55});5657test('audio button uses a text-on label with a mute action while playing', () => {58 assert.deepEqual(audioButtonPresentation({59 available: true,60 muted: false,61 state: 'playing',62 detail: 'bounded Opus playback',63 }), {64 label: 'vol on',65 ariaLabel: 'Mute audio. Audio playing. bounded Opus playback',66 title: 'Audio playing: bounded Opus playback',67 });68});6970test('audio button uses a text-off label with an unmute action while muted', () => {71 const presentation = audioButtonPresentation({72 available: true,73 muted: true,74 state: 'playing',75 detail: 'bounded Opus playback',76 });77 assert.equal(presentation.label, 'vol off');78 assert.match(presentation.ariaLabel, /^Unmute audio\. Audio muted\./);79});8081test('audio button distinguishes priming from unavailable', () => {82 assert.equal(audioButtonPresentation({83 available: true,84 muted: false,85 state: 'priming',86 detail: 'Waiting for bounded Opus prebuffer',87 }).label, 'vol ...');88 const unavailable = audioButtonPresentation({89 available: false,90 muted: false,91 state: 'unavailable',92 detail: 'not connected',93 });94 assert.equal(unavailable.label, 'vol off');95 assert.match(unavailable.ariaLabel, /^Audio unavailable\./);96});