feat: finally nailed down phases 1-4

This commit is contained in:
2026-03-20 12:05:24 +01:00
parent 5aed0107c6
commit 1f12fac5e2
9 changed files with 492 additions and 19 deletions

View File

@@ -0,0 +1,46 @@
import XCTest
@testable import MLX_Server
@MainActor
final class ChatViewModelTests: XCTestCase {
func testGemmaChatViewModelSendProducesAssistantReply() async throws {
let modelManager = ModelManager()
let config = try XCTUnwrap(ModelConfig.resolve("gemma"))
await modelManager.loadModel(config)
defer { modelManager.unloadModel() }
XCTAssertTrue(modelManager.isReady)
let viewModel = ChatViewModel(modelManager: modelManager)
viewModel.inputText = "Say hello in one word."
viewModel.send()
XCTAssertTrue(viewModel.isGenerating)
try await waitUntil(timeoutSeconds: 15) {
!viewModel.isGenerating
}
XCTAssertEqual(viewModel.conversation.messages.count, 2)
XCTAssertEqual(viewModel.conversation.messages[0].role, .user)
XCTAssertEqual(viewModel.conversation.messages[0].content, "Say hello in one word.")
XCTAssertEqual(viewModel.conversation.messages[1].role, .assistant)
XCTAssertFalse(viewModel.conversation.messages[1].sessionContent.isEmpty)
XCTAssertGreaterThan(viewModel.promptTokens, 0)
}
private func waitUntil(
timeoutSeconds: TimeInterval,
intervalNanoseconds: UInt64 = 100_000_000,
condition: @escaping @MainActor () -> Bool
) async throws {
let deadline = Date().addingTimeInterval(timeoutSeconds)
while Date() < deadline {
if condition() {
return
}
try await Task.sleep(nanoseconds: intervalNanoseconds)
}
XCTFail("Condition not met before timeout")
}
}