import Testing import Foundation @testable import 康康 /// 语音直达的两个纯函数:LLM 输出解析 + 关键词回退。 struct VoiceIntentServiceTests { // MARK: - parseIntent(LLM 输出容错) @Test func parsesStandardJSON() { #expect(VoiceIntentService.parseIntent(from: #"{"intent":"indicator"}"#) == .indicator) } @Test func parsesFencedAndThinkWrapped() { let raw = """ 用户想记血压 ```json {"intent": "Indicator"} ``` """ #expect(VoiceIntentService.parseIntent(from: raw) == .indicator) } @Test func parsesBareWord() { #expect(VoiceIntentService.parseIntent(from: "symptom") == .symptom) #expect(VoiceIntentService.parseIntent(from: "\"diary\"。") == .diary) } @Test func unknownReturnsNil() { #expect(VoiceIntentService.parseIntent(from: #"{"intent":"unknown"}"#) == nil) #expect(VoiceIntentService.parseIntent(from: "我不知道") == nil) } // MARK: - keywordMatch(回退规则与优先级) @Test func reminderBeatsMedication() { // 「提醒我吃药」是设提醒,不是记用药 —— reminder 规则必须排最前 #expect(VoiceIntentService.keywordMatch("每天八点提醒我吃药") == .reminder) } @Test func commonUtterances() { #expect(VoiceIntentService.keywordMatch("记一下血压,高压128") == .indicator) #expect(VoiceIntentService.keywordMatch("我有点头疼") == .symptom) #expect(VoiceIntentService.keywordMatch("拍个药盒") == .medication) #expect(VoiceIntentService.keywordMatch("把体检报告存进去") == .archive) #expect(VoiceIntentService.keywordMatch("整理一份给医生看的") == .export) #expect(VoiceIntentService.keywordMatch("写个日记") == .diary) } @Test func gibberishReturnsNil() { #expect(VoiceIntentService.keywordMatch("啦啦啦啦") == nil) } }