feat: sync force-quit Flow teardown and polish macOS local ASR UX
End Live Activities and release the audio session synchronously on applicationWillTerminate, and continue macOS local-model install, onboarding, and settings polish on this branch.
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
// LocalASRDownloadSourceSorterTests.swift
|
||||
// OSGKeyboardTests
|
||||
|
||||
import XCTest
|
||||
@testable import OSGKeyboardShared
|
||||
|
||||
final class LocalASRDownloadSourceSorterTests: XCTestCase {
|
||||
|
||||
private func source(_ type: String, priority: Int = 1) -> LocalASRDownloadSource {
|
||||
LocalASRDownloadSource(
|
||||
type: type,
|
||||
priority: priority,
|
||||
url: "https://example.com/\(type).tar.bz2",
|
||||
baseURL: nil,
|
||||
files: nil
|
||||
)
|
||||
}
|
||||
|
||||
func testChinaMainlandPrefersModelScope() {
|
||||
let sources = [
|
||||
source("github"),
|
||||
source("huggingface"),
|
||||
source("modelscope"),
|
||||
]
|
||||
let sorted = LocalASRDownloadSourceSorter.sorted(sources, region: Locale.Region("CN"))
|
||||
XCTAssertEqual(sorted.map(\.type), ["modelscope", "huggingface", "github"])
|
||||
}
|
||||
|
||||
func testGlobalPrefersHuggingFace() {
|
||||
let sources = [
|
||||
source("github"),
|
||||
source("huggingface"),
|
||||
source("modelscope"),
|
||||
]
|
||||
let sorted = LocalASRDownloadSourceSorter.sorted(sources, region: Locale.Region("US"))
|
||||
XCTAssertEqual(sorted.map(\.type), ["huggingface", "github", "modelscope"])
|
||||
}
|
||||
|
||||
func testSameTypeUsesPriority() {
|
||||
let sources = [
|
||||
source("github", priority: 2),
|
||||
source("github", priority: 1),
|
||||
]
|
||||
let sorted = LocalASRDownloadSourceSorter.sorted(sources, region: Locale.Region("US"))
|
||||
XCTAssertEqual(sorted.map(\.priority), [1, 2])
|
||||
}
|
||||
}
|
||||
@@ -9,9 +9,19 @@ final class LocalASRModelCatalogTests: XCTestCase {
|
||||
func testBundledCatalogLoads() throws {
|
||||
let catalog = try LocalASRModelCatalog.loadBundled()
|
||||
XCTAssertEqual(catalog.schemaVersion, 1)
|
||||
XCTAssertFalse(catalog.models.isEmpty)
|
||||
XCTAssertTrue(catalog.models.contains { $0.id == "qwen3-mlx-1.7b" })
|
||||
XCTAssertEqual(catalog.defaultModelId, "sherpa-qwen3-0.6b-int8")
|
||||
XCTAssertFalse(catalog.models.contains { $0.id == "qwen3-mlx-1.7b" })
|
||||
XCTAssertTrue(catalog.models.contains { $0.id == "sherpa-qwen3-0.6b-int8" })
|
||||
XCTAssertTrue(catalog.models.contains { $0.id == "sherpa-qwen3-1.7b-int8" })
|
||||
XCTAssertTrue(catalog.models.contains { $0.id == "sherpa-paraformer-zh-int8" })
|
||||
}
|
||||
|
||||
func testSherpaQwen317BUsesRepositoryInstall() throws {
|
||||
let catalog = try LocalASRModelCatalog.loadBundled()
|
||||
let model = try XCTUnwrap(LocalASRModelCatalog.model("sherpa-qwen3-1.7b-int8", in: catalog))
|
||||
XCTAssertEqual(model.installKind, .repository)
|
||||
XCTAssertTrue(model.sources?.contains(where: { $0.type == "modelscope" && $0.isRepository }) == true)
|
||||
XCTAssertTrue(model.sources?.contains(where: { $0.type == "huggingface" && $0.isRepository }) == true)
|
||||
}
|
||||
|
||||
func testCapabilitiesForSherpaQwen3() throws {
|
||||
@@ -22,6 +32,14 @@ final class LocalASRModelCatalogTests: XCTestCase {
|
||||
XCTAssertTrue(model.supportsHotwords)
|
||||
}
|
||||
|
||||
func testCapabilitiesForParaformer() throws {
|
||||
let catalog = try LocalASRModelCatalog.loadBundled()
|
||||
let model = try XCTUnwrap(LocalASRModelCatalog.model("sherpa-paraformer-zh-int8", in: catalog))
|
||||
let caps = LocalASRModelCatalog.capabilities(for: model)
|
||||
XCTAssertEqual(caps.hotwordMode, .none)
|
||||
XCTAssertFalse(model.supportsHotwords)
|
||||
}
|
||||
|
||||
func testManifestRoundTrip() throws {
|
||||
let manifest = LocalASRInstalledManifest(
|
||||
selectedModelId: "sherpa-qwen3-0.6b-int8",
|
||||
@@ -54,11 +72,11 @@ final class LocalASRModelCatalogTests: XCTestCase {
|
||||
)
|
||||
LocalASRBiasDiagnosticsStore.save(
|
||||
payload: payload,
|
||||
modelId: "qwen3-mlx-1.7b",
|
||||
backendLabel: "MLX"
|
||||
modelId: "sherpa-qwen3-0.6b-int8",
|
||||
backendLabel: "Sherpa Qwen3"
|
||||
)
|
||||
let snapshot = LocalASRBiasDiagnosticsStore.load()
|
||||
XCTAssertEqual(snapshot?.modelId, "qwen3-mlx-1.7b")
|
||||
XCTAssertEqual(snapshot?.modelId, "sherpa-qwen3-0.6b-int8")
|
||||
XCTAssertEqual(snapshot?.diagnostics.userTermCount, 2)
|
||||
XCTAssertEqual(snapshot?.hotwordCount, 1)
|
||||
LocalASRBiasDiagnosticsStore.clear()
|
||||
|
||||
Reference in New Issue
Block a user