feat: 添加拍药盒功能和语音直达入口 - 实现拍药盒扫描流程,支持本地OCR识别药品信息 - 在日记页面添加拍药盒和记症状的三选一入口 - 优化按钮点击区域,确保符合苹果HIG最小命中区标准 - 添加用药记录到时间线的独立分类显示 - 实现长按+号语音直达功能,支持语音意图分类跳转 - 更新项目配置文件,启用代码分析和死代码剥离选项 - 增加多项本地化字符串支持新功能 ```
54 lines
1.9 KiB
Swift
54 lines
1.9 KiB
Swift
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 = """
|
|
<think>用户想记血压</think>
|
|
```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)
|
|
}
|
|
}
|