Expand onboarding and adaptive keyboard intelligence
Add resilient usage analytics, OOBE gateway flows, clipboard semantic ranking, purchase recovery, style learning, and managed current-information search.
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
// ClipboardSemanticAnalyzerTests.swift
|
||||
// OSGKeyboardTests
|
||||
|
||||
@testable import OSGKeyboardShared
|
||||
import XCTest
|
||||
|
||||
final class ClipboardSemanticAnalyzerTests: XCTestCase {
|
||||
func testEmptyTextReturnsNoLabels() async {
|
||||
let analysis = await ClipboardSemanticAnalyzer().analyze(" \n ")
|
||||
|
||||
XCTAssertNil(analysis.language)
|
||||
XCTAssertEqual(analysis.sentiment, .unknown)
|
||||
XCTAssertFalse(analysis.task.isDetected)
|
||||
XCTAssertFalse(analysis.question.isDetected)
|
||||
XCTAssertFalse(analysis.invitation.isDetected)
|
||||
XCTAssertFalse(analysis.complaint.isDetected)
|
||||
}
|
||||
|
||||
func testDetectsLanguageAndStructuredDataLocally() async {
|
||||
let text = """
|
||||
Meet on August 28, 2026 at 3:00 PM at 1 Apple Park Way, Cupertino, CA 95014.
|
||||
Call +1 408-996-1010 or visit https://www.apple.com.
|
||||
"""
|
||||
|
||||
let analysis = await ClipboardSemanticAnalyzer().analyze(text)
|
||||
|
||||
XCTAssertEqual(analysis.language?.identifier, "en")
|
||||
XCTAssertTrue(analysis.hasDateOrTime)
|
||||
XCTAssertTrue(analysis.hasAddress)
|
||||
XCTAssertTrue(analysis.hasPhoneNumber)
|
||||
XCTAssertTrue(analysis.hasURL)
|
||||
}
|
||||
|
||||
func testApprovedModelsDetectHighConfidenceIntents() async {
|
||||
let analyzer = ClipboardSemanticAnalyzer()
|
||||
|
||||
let task = await analyzer.analyze(
|
||||
"请今天下班前发送会议纪要,完成后发给项目群。"
|
||||
)
|
||||
let question = await analyzer.analyze(
|
||||
"退款流程具体是怎么安排的?"
|
||||
)
|
||||
let invitation = await analyzer.analyze(
|
||||
"今晚七点在老地方吃饭,你能来吗?"
|
||||
)
|
||||
let complaint = await analyzer.analyze(
|
||||
"应用一直闪退,数据还丢了,你们能尽快处理吗?"
|
||||
)
|
||||
|
||||
XCTAssertTrue(task.task.isApprovedForAutomaticRouting)
|
||||
XCTAssertTrue(task.task.isDetected)
|
||||
XCTAssertTrue(question.question.isApprovedForAutomaticRouting)
|
||||
XCTAssertTrue(question.question.isDetected)
|
||||
XCTAssertTrue(invitation.invitation.isApprovedForAutomaticRouting)
|
||||
XCTAssertTrue(invitation.invitation.isDetected)
|
||||
// The current self-contained complaint model remains advisory until
|
||||
// its manually authored holdout precision reaches the release gate.
|
||||
XCTAssertFalse(complaint.complaint.isApprovedForAutomaticRouting)
|
||||
XCTAssertGreaterThan(complaint.complaint.confidence, 0)
|
||||
}
|
||||
|
||||
func testPersonalPlanDoesNotBecomeAutomaticTask() async {
|
||||
let analysis = await ClipboardSemanticAnalyzer().analyze(
|
||||
"私人备忘:我准备周五自己整理完这份报告。"
|
||||
)
|
||||
|
||||
XCTAssertTrue(analysis.task.isApprovedForAutomaticRouting)
|
||||
XCTAssertFalse(analysis.task.isDetected)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user