test(mac): cover voice wake helpers
This commit is contained in:
22
apps/macos/Sources/Clawdis/VoiceWakeHelpers.swift
Normal file
22
apps/macos/Sources/Clawdis/VoiceWakeHelpers.swift
Normal file
@@ -0,0 +1,22 @@
|
||||
import Foundation
|
||||
|
||||
func sanitizeVoiceWakeTriggers(_ words: [String]) -> [String] {
|
||||
let cleaned = words
|
||||
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
||||
.filter { !$0.isEmpty }
|
||||
return cleaned.isEmpty ? defaultVoiceWakeTriggers : cleaned
|
||||
}
|
||||
|
||||
func normalizeLocaleIdentifier(_ raw: String) -> String {
|
||||
var trimmed = raw
|
||||
if let at = trimmed.firstIndex(of: "@") {
|
||||
trimmed = String(trimmed[..<at])
|
||||
}
|
||||
if let u = trimmed.range(of: "-u-") {
|
||||
trimmed = String(trimmed[..<u.lowerBound])
|
||||
}
|
||||
if let t = trimmed.range(of: "-t-") {
|
||||
trimmed = String(trimmed[..<t.lowerBound])
|
||||
}
|
||||
return trimmed
|
||||
}
|
||||
@@ -209,10 +209,7 @@ struct VoiceWakeSettings: View {
|
||||
}
|
||||
|
||||
private func sanitizedTriggers() -> [String] {
|
||||
let cleaned = self.state.swabbleTriggerWords
|
||||
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
||||
.filter { !$0.isEmpty }
|
||||
return cleaned.isEmpty ? defaultVoiceWakeTriggers : cleaned
|
||||
sanitizeVoiceWakeTriggers(self.state.swabbleTriggerWords)
|
||||
}
|
||||
|
||||
private var micPicker: some View {
|
||||
@@ -343,7 +340,7 @@ struct VoiceWakeSettings: View {
|
||||
}
|
||||
|
||||
private func friendlyName(for locale: Locale) -> String {
|
||||
let cleanedID = self.normalizedLocaleIdentifier(locale.identifier)
|
||||
let cleanedID = normalizeLocaleIdentifier(locale.identifier)
|
||||
let cleanLocale = Locale(identifier: cleanedID)
|
||||
|
||||
if let langCode = cleanLocale.language.languageCode?.identifier,
|
||||
@@ -361,20 +358,6 @@ struct VoiceWakeSettings: View {
|
||||
return cleanLocale.localizedString(forIdentifier: cleanedID) ?? cleanedID
|
||||
}
|
||||
|
||||
private func normalizedLocaleIdentifier(_ raw: String) -> String {
|
||||
var trimmed = raw
|
||||
if let at = trimmed.firstIndex(of: "@") {
|
||||
trimmed = String(trimmed[..<at])
|
||||
}
|
||||
if let u = trimmed.range(of: "-u-") {
|
||||
trimmed = String(trimmed[..<u.lowerBound])
|
||||
}
|
||||
if let t = trimmed.range(of: "-t-") {
|
||||
trimmed = String(trimmed[..<t.lowerBound])
|
||||
}
|
||||
return trimmed
|
||||
}
|
||||
|
||||
private var levelMeter: some View {
|
||||
VStack(alignment: .leading, spacing: 6) {
|
||||
HStack(alignment: .center, spacing: 10) {
|
||||
|
||||
@@ -190,6 +190,10 @@ final class VoiceWakeTester {
|
||||
return triggers.contains { lowered.contains($0.lowercased()) }
|
||||
}
|
||||
|
||||
static func _testMatches(text: String, triggers: [String]) -> Bool {
|
||||
self.matches(text: text, triggers: triggers)
|
||||
}
|
||||
|
||||
private nonisolated static func ensurePermissions() async throws -> Bool {
|
||||
let speechStatus = SFSpeechRecognizer.authorizationStatus()
|
||||
if speechStatus == .notDetermined {
|
||||
|
||||
Reference in New Issue
Block a user