Files
openclaw/apps/macos/Tests/OpenClawIPCTests/AudioInputDeviceObserverTests.swift
Peter Steinberger 311f5bfbaa feat(macos): honor the selected microphone in Talk and show live voice activity in chat (#109995)
* feat(macos): honor the selected microphone in Talk and surface live level, transcript, and mic picker in chat

* chore(i18n): translate new talk activity strings and regenerate Apple/Android catalogs
2026-07-17 15:45:46 +01:00

84 lines
3.5 KiB
Swift

import Foundation
import Testing
@testable import OpenClaw
struct AudioInputDeviceObserverTests {
@Test func `selected available input wins over system default`() {
let result = AudioInputDeviceSelectionResolver.resolve(
selectedUID: "desk-mic",
availableUIDs: ["desk-mic", "built-in"],
defaultUID: "built-in")
#expect(result == AudioInputDeviceResolution(
selectedUID: "desk-mic",
resolvedUID: "desk-mic",
fellBackToSystemDefault: false))
#expect(result.shouldBindSelectedDevice)
}
@Test func `missing selected input falls back without replacing selection`() {
let result = AudioInputDeviceSelectionResolver.resolve(
selectedUID: "desk-mic",
availableUIDs: ["built-in"],
defaultUID: "built-in")
#expect(result == AudioInputDeviceResolution(
selectedUID: "desk-mic",
resolvedUID: "built-in",
fellBackToSystemDefault: true))
#expect(!result.shouldBindSelectedDevice)
}
@Test func `system default and unavailable states resolve explicitly`() {
let systemDefault = AudioInputDeviceSelectionResolver.resolve(
selectedUID: "",
availableUIDs: ["built-in"],
defaultUID: "built-in")
let unavailable = AudioInputDeviceSelectionResolver.resolve(
selectedUID: nil,
availableUIDs: [],
defaultUID: "built-in")
#expect(systemDefault.resolvedUID == "built-in")
#expect(systemDefault.selectedUID == nil)
#expect(unavailable.resolvedUID == nil)
}
@Test func `default and fallback follow default changes while selected input does not`() {
let systemDefault = AudioInputDeviceResolution(
selectedUID: nil,
resolvedUID: "built-in",
fellBackToSystemDefault: false)
let fallback = AudioInputDeviceResolution(
selectedUID: "desk-mic",
resolvedUID: "built-in",
fellBackToSystemDefault: true)
let selected = AudioInputDeviceResolution(
selectedUID: "desk-mic",
resolvedUID: "desk-mic",
fellBackToSystemDefault: false)
let available = Set(["built-in", "new-default", "desk-mic"])
#expect(systemDefault.shouldRestart(availableUIDs: available, defaultUID: "new-default"))
#expect(fallback.shouldRestart(availableUIDs: available, defaultUID: "new-default"))
#expect(!selected.shouldRestart(availableUIDs: available, defaultUID: "new-default"))
#expect(selected.shouldRestart(availableUIDs: ["built-in"], defaultUID: "built-in"))
}
@Test func `has usable default input device returns bool`() {
// Smoke test: verifies the composition logic runs without crashing.
// Actual result depends on whether the host has an audio input device.
let result = AudioInputDeviceObserver.hasUsableDefaultInputDevice()
_ = result // suppress unused-variable warning; the assertion is "no crash"
}
@Test func `has usable default input device consistent with components`() {
// When no default UID exists, the method must return false.
// When a default UID exists, the result must match alive-set membership.
let uid = AudioInputDeviceObserver.defaultInputDeviceUID()
let alive = AudioInputDeviceObserver.aliveInputDeviceUIDs()
let expected = uid.map { alive.contains($0) } ?? false
#expect(AudioInputDeviceObserver.hasUsableDefaultInputDevice() == expected)
}
}