Spaces:
Paused
Paused
| import Foundation | |
| import SwabbleKit | |
| import Testing | |
| @testable import OpenClaw | |
| struct VoiceWakeManagerExtractCommandTests { | |
| func extractCommandReturnsNilWhenNoTriggerFound() { | |
| let transcript = "hello world" | |
| let segments = makeSegments( | |
| transcript: transcript, | |
| words: [("hello", 0.0, 0.1), ("world", 0.2, 0.1)]) | |
| #expect(VoiceWakeManager.extractCommand(from: transcript, segments: segments, triggers: ["openclaw"]) == nil) | |
| } | |
| func extractCommandTrimsTokensAndResult() { | |
| let transcript = "hey openclaw do thing" | |
| let segments = makeSegments( | |
| transcript: transcript, | |
| words: [ | |
| ("hey", 0.0, 0.1), | |
| ("openclaw", 0.2, 0.1), | |
| ("do", 0.9, 0.1), | |
| ("thing", 1.1, 0.1), | |
| ]) | |
| let cmd = VoiceWakeManager.extractCommand( | |
| from: transcript, | |
| segments: segments, | |
| triggers: [" openclaw "], | |
| minPostTriggerGap: 0.3) | |
| #expect(cmd == "do thing") | |
| } | |
| func extractCommandReturnsNilWhenGapTooShort() { | |
| let transcript = "hey openclaw do thing" | |
| let segments = makeSegments( | |
| transcript: transcript, | |
| words: [ | |
| ("hey", 0.0, 0.1), | |
| ("openclaw", 0.2, 0.1), | |
| ("do", 0.35, 0.1), | |
| ("thing", 0.5, 0.1), | |
| ]) | |
| let cmd = VoiceWakeManager.extractCommand( | |
| from: transcript, | |
| segments: segments, | |
| triggers: ["openclaw"], | |
| minPostTriggerGap: 0.3) | |
| #expect(cmd == nil) | |
| } | |
| func extractCommandReturnsNilWhenNothingAfterTrigger() { | |
| let transcript = "hey openclaw" | |
| let segments = makeSegments( | |
| transcript: transcript, | |
| words: [("hey", 0.0, 0.1), ("openclaw", 0.2, 0.1)]) | |
| #expect(VoiceWakeManager.extractCommand(from: transcript, segments: segments, triggers: ["openclaw"]) == nil) | |
| } | |
| func extractCommandIgnoresEmptyTriggers() { | |
| let transcript = "hey openclaw do thing" | |
| let segments = makeSegments( | |
| transcript: transcript, | |
| words: [ | |
| ("hey", 0.0, 0.1), | |
| ("openclaw", 0.2, 0.1), | |
| ("do", 0.9, 0.1), | |
| ("thing", 1.1, 0.1), | |
| ]) | |
| let cmd = VoiceWakeManager.extractCommand( | |
| from: transcript, | |
| segments: segments, | |
| triggers: ["", " ", "openclaw"], | |
| minPostTriggerGap: 0.3) | |
| #expect(cmd == "do thing") | |
| } | |
| } | |
| private func makeSegments( | |
| transcript: String, | |
| words: [(String, TimeInterval, TimeInterval)]) | |
| -> [WakeWordSegment] { | |
| var searchStart = transcript.startIndex | |
| var output: [WakeWordSegment] = [] | |
| for (word, start, duration) in words { | |
| let range = transcript.range(of: word, range: searchStart..<transcript.endIndex) | |
| output.append(WakeWordSegment(text: word, start: start, duration: duration, range: range)) | |
| if let range { searchStart = range.upperBound } | |
| } | |
| return output | |
| } | |