feat: finally nailed down phases 1-4
This commit is contained in:
46
MLXServerTests/Server/ChatViewModelTests.swift
Normal file
46
MLXServerTests/Server/ChatViewModelTests.swift
Normal 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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user