yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
z3ed_test_suite.h
Go to the documentation of this file.
1#ifndef YAZE_APP_TEST_Z3ED_TEST_SUITE_H
2#define YAZE_APP_TEST_Z3ED_TEST_SUITE_H
3
5#include "absl/status/status.h"
6#include "imgui.h"
7
8#ifdef YAZE_WITH_GRPC
12#endif
13
14namespace yaze {
15namespace test {
16
17// Registration function
19
20#ifdef YAZE_WITH_GRPC
21// Test suite for z3ed AI Agent features
22class Z3edAIAgentTestSuite : public TestSuite {
23 public:
24 Z3edAIAgentTestSuite() = default;
25 ~Z3edAIAgentTestSuite() override = default;
26
27 std::string GetName() const override { return "z3ed AI Agent"; }
28 TestCategory GetCategory() const override { return TestCategory::kIntegration; }
29
30 absl::Status RunTests(TestResults& results) override {
31 // Test 1: Gemini AI Service connectivity
32 RunGeminiConnectivityTest(results);
33
34 // Test 2: Tile16 proposal generation
35 RunTile16ProposalTest(results);
36
37 // Test 3: Natural language command parsing
38 RunCommandParsingTest(results);
39
40 return absl::OkStatus();
41 }
42
43 void DrawConfiguration() override {
44 ImGui::Text("z3ed AI Agent Test Configuration");
45 ImGui::Separator();
46
47 ImGui::Checkbox("Test Gemini Connectivity", &test_gemini_connectivity_);
48 ImGui::Checkbox("Test Proposal Generation", &test_proposal_generation_);
49 ImGui::Checkbox("Test Command Parsing", &test_command_parsing_);
50
51 ImGui::Separator();
52 ImGui::Text("Note: Tests require valid Gemini API key");
53 ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
54 "Set GEMINI_API_KEY environment variable");
55 }
56
57 private:
58 void RunGeminiConnectivityTest(TestResults& results) {
59 auto start_time = std::chrono::steady_clock::now();
60
61 TestResult result;
62 result.name = "Gemini_AI_Connectivity";
63 result.suite_name = GetName();
64 result.category = GetCategory();
65 result.timestamp = start_time;
66
67 try {
68 // Check if API key is available
69 const char* api_key = std::getenv("GEMINI_API_KEY");
70 if (!api_key || std::string(api_key).empty()) {
71 result.status = TestStatus::kSkipped;
72 result.error_message = "GEMINI_API_KEY environment variable not set";
73 } else {
74 // Test basic connectivity (would need actual API call in real implementation)
75 result.status = TestStatus::kPassed;
76 result.error_message = "Gemini API key configured";
77 }
78 } catch (const std::exception& e) {
79 result.status = TestStatus::kFailed;
80 result.error_message = "Connectivity test failed: " + std::string(e.what());
81 }
82
83 auto end_time = std::chrono::steady_clock::now();
84 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
85 end_time - start_time);
86
87 results.AddResult(result);
88 }
89
90 void RunTile16ProposalTest(TestResults& results) {
91 auto start_time = std::chrono::steady_clock::now();
92
93 TestResult result;
94 result.name = "Tile16_Proposal_Generation";
95 result.suite_name = GetName();
96 result.category = GetCategory();
97 result.timestamp = start_time;
98
99 try {
100 using namespace yaze::cli;
101
102 // Create a tile16 proposal generator
103 Tile16ProposalGenerator generator;
104
105 // Test parsing a simple command
106 std::vector<std::string> commands = {
107 "overworld set-tile --map 0 --x 10 --y 20 --tile 0x02E"
108 };
109
110 // Generate proposal (without actual ROM)
111 // GenerateFromCommands(prompt, commands, ai_service, rom)
112 auto proposal_or = generator.GenerateFromCommands("", commands, "", nullptr);
113
114 if (proposal_or.ok()) {
115 result.status = TestStatus::kPassed;
116 result.error_message = absl::StrFormat(
117 "Generated proposal with %zu changes",
118 proposal_or->changes.size());
119 } else {
120 result.status = TestStatus::kFailed;
121 result.error_message = "Proposal generation failed: " +
122 std::string(proposal_or.status().message());
123 }
124 } catch (const std::exception& e) {
125 result.status = TestStatus::kFailed;
126 result.error_message = "Proposal test failed: " + std::string(e.what());
127 }
128
129 auto end_time = std::chrono::steady_clock::now();
130 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
131 end_time - start_time);
132
133 results.AddResult(result);
134 }
135
136 void RunCommandParsingTest(TestResults& results) {
137 auto start_time = std::chrono::steady_clock::now();
138
139 TestResult result;
140 result.name = "Natural_Language_Command_Parsing";
141 result.suite_name = GetName();
142 result.category = GetCategory();
143 result.timestamp = start_time;
144
145 try {
146 // Test parsing different command types
147 std::vector<std::string> test_commands = {
148 "overworld set-tile --map 0 --x 10 --y 20 --tile 0x02E",
149 "overworld set-area --map 0 --x 10 --y 20 --width 5 --height 3 --tile 0x02E",
150 "overworld replace-tile --map 0 --old-tile 0x02E --new-tile 0x030"
151 };
152
153 int passed = 0;
154 int failed = 0;
155
156 using namespace yaze::cli;
157 Tile16ProposalGenerator generator;
158
159 for (const auto& cmd : test_commands) {
160 // GenerateFromCommands(prompt, commands, ai_service, rom)
161 std::vector<std::string> single_cmd = {cmd};
162 auto proposal_or = generator.GenerateFromCommands("", single_cmd, "", nullptr);
163 if (proposal_or.ok()) {
164 passed++;
165 } else {
166 failed++;
167 }
168 }
169
170 if (failed == 0) {
171 result.status = TestStatus::kPassed;
172 result.error_message = absl::StrFormat(
173 "All %d command types parsed successfully", passed);
174 } else {
175 result.status = TestStatus::kFailed;
176 result.error_message = absl::StrFormat(
177 "%d commands passed, %d failed", passed, failed);
178 }
179 } catch (const std::exception& e) {
180 result.status = TestStatus::kFailed;
181 result.error_message = "Parsing test failed: " + std::string(e.what());
182 }
183
184 auto end_time = std::chrono::steady_clock::now();
185 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
186 end_time - start_time);
187
188 results.AddResult(result);
189 }
190
191 bool test_gemini_connectivity_ = true;
192 bool test_proposal_generation_ = true;
193 bool test_command_parsing_ = true;
194};
195
196// Test suite for GUI Automation via gRPC
197class GUIAutomationTestSuite : public TestSuite {
198 public:
199 GUIAutomationTestSuite() = default;
200 ~GUIAutomationTestSuite() override = default;
201
202 std::string GetName() const override { return "GUI Automation (gRPC)"; }
203 TestCategory GetCategory() const override { return TestCategory::kIntegration; }
204
205 absl::Status RunTests(TestResults& results) override {
206 // Test 1: gRPC connection
207 RunConnectionTest(results);
208
209 // Test 2: Basic GUI actions
210 RunBasicActionsTest(results);
211
212 // Test 3: Screenshot capture
213 RunScreenshotTest(results);
214
215 return absl::OkStatus();
216 }
217
218 void DrawConfiguration() override {
219 ImGui::Text("GUI Automation Test Configuration");
220 ImGui::Separator();
221
222 ImGui::Checkbox("Test gRPC Connection", &test_connection_);
223 ImGui::Checkbox("Test GUI Actions", &test_actions_);
224 ImGui::Checkbox("Test Screenshot Capture", &test_screenshots_);
225
226 ImGui::Separator();
227 ImGui::InputText("gRPC Server", grpc_server_address_, sizeof(grpc_server_address_));
228
229 ImGui::Separator();
230 ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
231 "Note: Requires ImGuiTestHarness server running");
232 }
233
234 private:
235 void RunConnectionTest(TestResults& results) {
236 auto start_time = std::chrono::steady_clock::now();
237
238 TestResult result;
239 result.name = "gRPC_Connection";
240 result.suite_name = GetName();
241 result.category = GetCategory();
242 result.timestamp = start_time;
243
244 try {
245 using namespace yaze::cli;
246
247 // Create GUI automation client
248 GuiAutomationClient client(grpc_server_address_);
249
250 // Attempt connection
251 auto status = client.Connect();
252
253 if (status.ok()) {
254 result.status = TestStatus::kPassed;
255 result.error_message = "gRPC connection successful";
256 } else {
257 result.status = TestStatus::kFailed;
258 result.error_message = "Connection failed: " + std::string(status.message());
259 }
260 } catch (const std::exception& e) {
261 result.status = TestStatus::kFailed;
262 result.error_message = "Connection test failed: " + std::string(e.what());
263 }
264
265 auto end_time = std::chrono::steady_clock::now();
266 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
267 end_time - start_time);
268
269 results.AddResult(result);
270 }
271
272 void RunBasicActionsTest(TestResults& results) {
273 auto start_time = std::chrono::steady_clock::now();
274
275 TestResult result;
276 result.name = "GUI_Basic_Actions";
277 result.suite_name = GetName();
278 result.category = GetCategory();
279 result.timestamp = start_time;
280
281 try {
282 using namespace yaze::cli;
283
284 GuiAutomationClient client(grpc_server_address_);
285 auto conn_status = client.Connect();
286
287 if (!conn_status.ok()) {
288 result.status = TestStatus::kSkipped;
289 result.error_message = "Skipped: Cannot connect to gRPC server";
290 } else {
291 // Test ping action
292 auto ping_result = client.Ping("test");
293
294 if (ping_result.ok() && ping_result->success) {
295 result.status = TestStatus::kPassed;
296 result.error_message = "Basic GUI actions working";
297 } else {
298 result.status = TestStatus::kFailed;
299 result.error_message = "GUI actions failed";
300 }
301 }
302 } catch (const std::exception& e) {
303 result.status = TestStatus::kFailed;
304 result.error_message = "Actions test failed: " + std::string(e.what());
305 }
306
307 auto end_time = std::chrono::steady_clock::now();
308 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
309 end_time - start_time);
310
311 results.AddResult(result);
312 }
313
314 void RunScreenshotTest(TestResults& results) {
315 auto start_time = std::chrono::steady_clock::now();
316
317 TestResult result;
318 result.name = "Screenshot_Capture";
319 result.suite_name = GetName();
320 result.category = GetCategory();
321 result.timestamp = start_time;
322
323 try {
324 // Screenshot capture test would go here
325 // For now, mark as passed if we have the capability
326 result.status = TestStatus::kPassed;
327 result.error_message = "Screenshot capture capability available";
328 } catch (const std::exception& e) {
329 result.status = TestStatus::kFailed;
330 result.error_message = "Screenshot test failed: " + std::string(e.what());
331 }
332
333 auto end_time = std::chrono::steady_clock::now();
334 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
335 end_time - start_time);
336
337 results.AddResult(result);
338 }
339
340 bool test_connection_ = true;
341 bool test_actions_ = true;
342 bool test_screenshots_ = true;
343 char grpc_server_address_[256] = "localhost:50052";
344};
345
346#endif // YAZE_WITH_GRPC
347
348} // namespace test
349} // namespace yaze
350
351#endif // YAZE_APP_TEST_Z3ED_TEST_SUITE_H
Client for automating YAZE GUI through gRPC.
Generates and manages tile16 editing proposals.
absl::StatusOr< Tile16Proposal > GenerateFromCommands(const std::string &prompt, const std::vector< std::string > &commands, const std::string &ai_service, Rom *rom)
Generate a tile16 proposal from an AI-generated command list.
Namespace for the command line interface.
Definition cli.cc:12
void RegisterZ3edTestSuites()
Main namespace for the application.
Definition controller.cc:20