-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathFlowerIntelligenceTests.swift
More file actions
137 lines (123 loc) · 4.66 KB
/
FlowerIntelligenceTests.swift
File metadata and controls
137 lines (123 loc) · 4.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import Testing
@testable import FlowerIntelligence
class MockMlxEngine: Engine {
var lastMessages: [Message]?
var lastModel: String?
var lastTemperature: Float?
var lastMaxCompletionTokens: Int?
var lastStream: Bool?
var lastTools: [Tool]?
func chat(
_ messages: [Message],
model: String?,
temperature: Float?,
maxCompletionTokens: Int?,
stream: Bool,
onStreamEvent: ((StreamEvent) -> Void)?,
tools: [Tool]?
) async throws -> Message {
lastMessages = messages
return Message(role: "assistant", content: "Mock Local Engine Response")
}
}
class MockRemoteEngine: RemoteEngineProtocol {
var apiKey: String = ""
var lastMessages: [Message]?
var lastModel: String?
var lastTemperature: Float?
var lastMaxCompletionTokens: Int?
var lastStream: Bool?
var lastTools: [Tool]?
func chat(
_ messages: [Message],
model: String?,
temperature: Float?,
maxCompletionTokens: Int?,
stream: Bool,
onStreamEvent: ((StreamEvent) -> Void)?,
tools: [Tool]?
) async throws -> Message {
lastMessages = messages
return Message(role: "assistant", content: "Mock Remote Engine Response")
}
}
class FlowerIntelligenceTests {
var flowerIntelligence: FlowerIntelligence
var mockMlxEngine: MockMlxEngine
var mockRemoteEngine: MockRemoteEngine
init() {
mockMlxEngine = MockMlxEngine()
mockRemoteEngine = MockRemoteEngine()
flowerIntelligence = FlowerIntelligence(mlxEngine: mockMlxEngine, remoteEngine: mockRemoteEngine)
}
@Test
func testUsesCorrectMlxEngine() async throws {
flowerIntelligence.remoteHandoff = false
_ = await flowerIntelligence.chat("Hello")
try #require(mockMlxEngine.lastMessages != nil)
try #require(mockRemoteEngine.lastMessages == nil)
}
@Test
func testUsesCorrectRemoteEngine() async throws {
flowerIntelligence.remoteHandoff = true
_ = await flowerIntelligence.chat("Hello")
try #require(mockRemoteEngine.lastMessages != nil)
try #require(mockMlxEngine.lastMessages == nil)
}
@Test
func testForceRemoteOverridesRemoteHandoff() async throws {
flowerIntelligence.remoteHandoff = false
_ = await flowerIntelligence.chat("Hello", maybeOptions: ChatOptions(forceRemote: true))
try #require(mockRemoteEngine.lastMessages != nil)
try #require(mockMlxEngine.lastMessages == nil)
}
@Test
func testForceLocalOverridesRemoteHandoff() async throws {
flowerIntelligence.remoteHandoff = true
_ = await flowerIntelligence.chat("Hello", maybeOptions: ChatOptions(forceLocal: true))
try #require(mockMlxEngine.lastMessages != nil)
try #require(mockRemoteEngine.lastMessages == nil)
}
@Test
func testForceRemoteAndForceLocalReturnFailure() async throws {
let result = await flowerIntelligence.chat("Hello", maybeOptions: ChatOptions(forceRemote: true, forceLocal: true))
switch result {
case .failure(let error):
try #require(error.message == "Cannot set both forceRemote and forceLocal to true")
default:
Issue.record("Expected failure but got success")
}
}
@Test
func testChatFunctionWithSingleMessage() async throws {
let result = await flowerIntelligence.chat("Test message")
switch result {
case .success(let response):
let messages = try #require(mockMlxEngine.lastMessages)
try #require(messages.first?.content == "Test message")
try #require(response.role == "assistant")
try #require(response.content == "Mock Local Engine Response")
default:
Issue.record("Expected success but got failure")
}
}
@Test
func testChatFunctionWithArrayOfMessages() async throws {
let messages = [
Message(role: "system", content: "You are an AI"),
Message(role: "user", content: "What is Swift?")
]
let options = ChatOptions(model: "meta/llama3.2-1b")
let result = await flowerIntelligence.chat(options: (messages, options))
switch result {
case .success(let response):
let messages = try #require(mockMlxEngine.lastMessages)
try #require(messages.count == 2)
try #require(messages.last?.content == "What is Swift?")
try #require(response.role == "assistant")
try #require(response.content == "Mock Local Engine Response")
default:
Issue.record("Expected success but got failure")
}
}
}