Files
reimburse/tests/MatchExplanationTests.swift
2026-09-17 11:12:57 +08:00

65 lines
3.2 KiB
Swift

import Foundation
@main
struct MatchExplanationTests {
static func main() throws {
let old = """
{"id":"old","invoices":[],"payments":[],"category":"交通","matchType":"auto","score":90,
"reasons":["金额一致 ¥100.00"],"paymentTotal":100,"expenseAmount":100}
"""
let legacy = try JSONDecoder().decode(MatchGroup.self, from: Data(old.utf8))
precondition(legacy.explanation == nil)
precondition(legacy.evidenceScore == nil)
precondition(legacy.evidenceLabel == "评分待核对")
let explanation = """
{"version":2,"title":"单张发票与付款截图","rawScore":65,"checks":[
{"title":"共同金额","points":40,"maximum":40,"detail":"金额一致","issue":""},
{"title":"商户相似","points":0,"maximum":20,"detail":"未识别商户","issue":"商户未识别"},
{"title":"日期接近","points":10,"maximum":10,"detail":"日期一致","issue":""},
{"title":"交易单号","points":0,"maximum":15,"detail":"单号未识别","issue":"单号未识别"},
{"title":"批次金额唯一","points":15,"maximum":15,"detail":"金额唯一","issue":""}
],"note":"这是证据评分"}
"""
var match = legacy
match.explanation = try JSONDecoder().decode(MatchExplanation.self, from: Data(explanation.utf8))
precondition(match.explanation?.summary == "商户未识别 · 单号未识别")
precondition(match.evidenceScore == 65)
precondition(match.evidenceLabel == "65%")
precondition(match.score == 90)
let restored = try JSONDecoder().decode(MatchGroup.self, from: JSONEncoder().encode(match))
precondition(restored.explanation?.rawScore == 65)
precondition(restored.explanation?.checks.count == 5)
precondition(restored.evidenceLabel == "65%")
precondition(restored.id == legacy.id)
var complete = match.explanation!
for index in complete.checks.indices {
complete.checks[index].points = complete.checks[index].maximum
complete.checks[index].issue = ""
}
complete.rawScore = 100
precondition(complete.hundredPointScore == 100)
precondition(complete.summary == "查看匹配依据")
var invalid = complete
invalid.checks[0].maximum = 75
precondition(invalid.hundredPointScore == nil)
invalid = complete
invalid.rawScore = 75
precondition(invalid.hundredPointScore == nil)
invalid = complete
invalid.version = nil
precondition(invalid.hundredPointScore == nil)
invalid = complete
invalid.checks[0].points = -1
precondition(invalid.hundredPointScore == nil)
let oldExplanation = explanation.replacingOccurrences(of: "\"version\":2,", with: "")
let decodedOld = try JSONDecoder().decode(MatchExplanation.self, from: Data(oldExplanation.utf8))
precondition(decodedOld.version == nil && decodedOld.hundredPointScore == nil)
match.matchType = "manual"
precondition(match.evidenceScore == nil)
complete.checks = []
precondition(complete.hundredPointScore == nil)
precondition(complete.summary == "查看历史依据")
print("Match explanation tests passed")
}
}