mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-02 11:21:34 +00:00
* 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
84 lines
3.5 KiB
Swift
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)
|
|
}
|
|
}
|