Files
kangkang/康康Tests/ExportTrendBuilderTests.swift
link2026 77a4ee1c37 缺少代码差异信息,无法生成具体的commit message。请提供code differences内容以便分析并生成符合Angular规范的提交信息。
当您提供代码差异后,我将按照以下格式生成:

```
<type>(<scope>): <subject>

<body>
```

其中type会根据更改类型选择(feat、fix、docs、style、refactor等),scope表示影响范围,subject简要描述变更内容,body详细说明修改内容。
2026-06-07 14:17:18 +08:00

113 lines
4.6 KiB
Swift

import Testing
import Foundation
@testable import
/// `ExportTrendBuilder` ,:
/// <2
struct ExportTrendBuilderTests {
private func ind(
name: String = "血糖",
value: String,
unit: String = "mmol/L",
range: String = "3.9-6.1",
status: IndicatorStatus = .normal,
daysAgo: Int,
seriesKey: String? = nil
) -> Indicator {
let date = Calendar.current.date(byAdding: .day, value: -daysAgo, to: .now)!
return Indicator(name: name, value: value, unit: unit, range: range,
status: status, capturedAt: date, seriesKey: seriesKey)
}
@Test func upDirectionFlaggedAndLineFormat() {
let items = [
ind(value: "5.2", status: .normal, daysAgo: 27),
ind(value: "6.8", status: .high, daysAgo: 0),
]
let trends = ExportTrendBuilder.build(allInWindow: items, relevant: items)
let t = try! #require(trends.first)
#expect(t.direction == .up)
#expect(t.flagged) // high
#expect(t.count == 2)
#expect(t.valueText == "5.2→6.8")
#expect(t.rangeText == "3.9-6.1")
#expect(t.line() == "⚠️ 血糖 5.2→6.8 mmol/L ↑(参考 3.9-6.1),近 27 天 2 次")
}
@Test func downDirection() {
let items = [
ind(value: "6.0", daysAgo: 10),
ind(value: "5.0", daysAgo: 1),
]
let t = try! #require(ExportTrendBuilder.build(allInWindow: items, relevant: items).first)
#expect(t.direction == .down)
#expect(!t.flagged) // normal
}
@Test func flatWithinThreshold() {
// (5.1-5.0)/5.0 = 0.02 < 0.05
let items = [
ind(value: "5.0", daysAgo: 5),
ind(value: "5.1", daysAgo: 1),
]
let t = try! #require(ExportTrendBuilder.build(allInWindow: items, relevant: items).first)
#expect(t.direction == .flat)
}
@Test func filtersSeriesWithFewerThanTwoPoints() {
let items = [ind(value: "5.0", daysAgo: 1)]
#expect(ExportTrendBuilder.build(allInWindow: items, relevant: items).isEmpty)
}
@Test func excludesIrrelevantSeries() {
let glucose = [
ind(name: "血糖", value: "5.0", unit: "mmol/L", daysAgo: 3),
ind(name: "血糖", value: "5.5", unit: "mmol/L", daysAgo: 1),
]
let weight = [
ind(name: "体重", value: "68", unit: "kg", range: "", daysAgo: 3),
ind(name: "体重", value: "67", unit: "kg", range: "", daysAgo: 1),
]
// weight 2 , relevant
let trends = ExportTrendBuilder.build(allInWindow: glucose + weight, relevant: glucose)
#expect(trends.count == 1)
#expect(trends.first?.title == "血糖")
}
@Test func bloodPressureMergesToSingleLine() {
let items = [
ind(name: "收缩压", value: "150", unit: "mmHg", range: "", daysAgo: 20, seriesKey: "bp.systolic"),
ind(name: "舒张压", value: "95", unit: "mmHg", range: "", daysAgo: 20, seriesKey: "bp.diastolic"),
ind(name: "收缩压", value: "138", unit: "mmHg", range: "", daysAgo: 1, seriesKey: "bp.systolic"),
ind(name: "舒张压", value: "88", unit: "mmHg", range: "", daysAgo: 1, seriesKey: "bp.diastolic"),
]
let t = try! #require(ExportTrendBuilder.build(allInWindow: items, relevant: items).first)
#expect(t.title == "血压")
#expect(t.unit == "mmHg")
#expect(t.valueText == "150/95→138/88")
#expect(t.direction == .down) //
#expect(t.rangeText == nil) //
}
@Test func flaggedWhenStatusCrossesBoundary() {
// : flagged,
let items = [
ind(value: "6.8", status: .high, daysAgo: 5),
ind(value: "5.5", status: .normal, daysAgo: 1),
]
let t = try! #require(ExportTrendBuilder.build(allInWindow: items, relevant: items).first)
#expect(t.flagged)
}
@Test func nonNumericPointDropped() {
let items = [
ind(value: "", daysAgo: 3),
ind(value: "5.0", daysAgo: 2),
ind(value: "5.5", daysAgo: 1),
]
let t = try! #require(ExportTrendBuilder.build(allInWindow: items, relevant: items).first)
#expect(t.count == 2) // ""
}
}