1#ifndef YAZE_APP_TEST_Z3ED_TEST_SUITE_H
2#define YAZE_APP_TEST_Z3ED_TEST_SUITE_H
4#include "absl/status/status.h"
22class Z3edAIAgentTestSuite :
public TestSuite {
24 Z3edAIAgentTestSuite() =
default;
25 ~Z3edAIAgentTestSuite()
override =
default;
27 std::string GetName()
const override {
return "z3ed AI Agent"; }
29 return TestCategory::kIntegration;
32 absl::Status RunTests(TestResults& results)
override {
34 RunGeminiConnectivityTest(results);
37 RunTile16ProposalTest(results);
40 RunCommandParsingTest(results);
42 return absl::OkStatus();
45 void DrawConfiguration()
override {
46 ImGui::Text(
"z3ed AI Agent Test Configuration");
49 ImGui::Checkbox(
"Test Gemini Connectivity", &test_gemini_connectivity_);
50 ImGui::Checkbox(
"Test Proposal Generation", &test_proposal_generation_);
51 ImGui::Checkbox(
"Test Command Parsing", &test_command_parsing_);
54 ImGui::Text(
"Note: Tests require valid Gemini API key");
55 ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
56 "Set GEMINI_API_KEY environment variable");
60 void RunGeminiConnectivityTest(TestResults& results) {
61 auto start_time = std::chrono::steady_clock::now();
64 result.name =
"Gemini_AI_Connectivity";
65 result.suite_name = GetName();
66 result.category = GetCategory();
67 result.timestamp = start_time;
71 const char* api_key = std::getenv(
"GEMINI_API_KEY");
72 if (!api_key || std::string(api_key).empty()) {
73 result.status = TestStatus::kSkipped;
74 result.error_message =
"GEMINI_API_KEY environment variable not set";
78 result.status = TestStatus::kPassed;
79 result.error_message =
"Gemini API key configured";
81 }
catch (
const std::exception& e) {
82 result.status = TestStatus::kFailed;
83 result.error_message =
84 "Connectivity test failed: " + std::string(e.what());
87 auto end_time = std::chrono::steady_clock::now();
88 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
89 end_time - start_time);
91 results.AddResult(result);
94 void RunTile16ProposalTest(TestResults& results) {
95 auto start_time = std::chrono::steady_clock::now();
98 result.name =
"Tile16_Proposal_Generation";
99 result.suite_name = GetName();
100 result.category = GetCategory();
101 result.timestamp = start_time;
110 std::vector<std::string> commands = {
111 "overworld set-tile --map 0 --x 10 --y 20 --tile 0x02E"};
118 if (proposal_or.ok()) {
119 result.status = TestStatus::kPassed;
120 result.error_message = absl::StrFormat(
121 "Generated proposal with %zu changes", proposal_or->changes.size());
123 result.status = TestStatus::kFailed;
124 result.error_message =
"Proposal generation failed: " +
125 std::string(proposal_or.status().message());
127 }
catch (
const std::exception& e) {
128 result.status = TestStatus::kFailed;
129 result.error_message =
"Proposal test failed: " + std::string(e.what());
132 auto end_time = std::chrono::steady_clock::now();
133 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
134 end_time - start_time);
136 results.AddResult(result);
139 void RunCommandParsingTest(TestResults& results) {
140 auto start_time = std::chrono::steady_clock::now();
143 result.name =
"Natural_Language_Command_Parsing";
144 result.suite_name = GetName();
145 result.category = GetCategory();
146 result.timestamp = start_time;
150 std::vector<std::string> test_commands = {
151 "overworld set-tile --map 0 --x 10 --y 20 --tile 0x02E",
152 "overworld set-area --map 0 --x 10 --y 20 --width 5 --height 3 "
163 std::string failure_details;
164 for (
const auto& cmd : test_commands) {
166 std::vector<std::string> single_cmd = {cmd};
169 if (proposal_or.ok()) {
173 if (!failure_details.empty())
174 failure_details +=
"; ";
175 failure_details += absl::StrFormat(
"Command '%s' failed: %s", cmd,
176 proposal_or.status().message());
181 result.status = TestStatus::kPassed;
182 result.error_message =
183 absl::StrFormat(
"All %d command types parsed successfully", passed);
185 result.status = TestStatus::kFailed;
186 result.error_message =
187 absl::StrFormat(
"%d commands passed, %d failed. Details: %s",
188 passed, failed, failure_details.c_str());
190 }
catch (
const std::exception& e) {
191 result.status = TestStatus::kFailed;
192 result.error_message =
"Parsing test failed: " + std::string(e.what());
195 auto end_time = std::chrono::steady_clock::now();
196 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
197 end_time - start_time);
199 results.AddResult(result);
202 bool test_gemini_connectivity_ =
true;
203 bool test_proposal_generation_ =
true;
204 bool test_command_parsing_ =
true;
208class GUIAutomationTestSuite :
public TestSuite {
210 GUIAutomationTestSuite() =
default;
211 ~GUIAutomationTestSuite()
override =
default;
213 std::string GetName()
const override {
return "GUI Automation (gRPC)"; }
215 return TestCategory::kIntegration;
218 absl::Status RunTests(TestResults& results)
override {
220 RunConnectionTest(results);
223 RunBasicActionsTest(results);
226 RunScreenshotTest(results);
228 return absl::OkStatus();
231 void DrawConfiguration()
override {
232 ImGui::Text(
"GUI Automation Test Configuration");
235 ImGui::Checkbox(
"Test gRPC Connection", &test_connection_);
236 ImGui::Checkbox(
"Test GUI Actions", &test_actions_);
237 ImGui::Checkbox(
"Test Screenshot Capture", &test_screenshots_);
240 ImGui::InputText(
"gRPC Server", grpc_server_address_,
241 sizeof(grpc_server_address_));
244 ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
245 "Note: Requires ImGuiTestHarness server running");
249 void RunConnectionTest(TestResults& results) {
250 auto start_time = std::chrono::steady_clock::now();
253 result.name =
"gRPC_Connection";
254 result.suite_name = GetName();
255 result.category = GetCategory();
256 result.timestamp = start_time;
265 auto status = client.Connect();
268 result.status = TestStatus::kPassed;
269 result.error_message =
"gRPC connection successful";
272 result.status = TestStatus::kSkipped;
273 result.error_message =
274 "Connection failed (harness likely not running): " +
275 std::string(status.message());
277 }
catch (
const std::exception& e) {
278 result.status = TestStatus::kSkipped;
279 result.error_message =
280 "Connection test skipped: " + std::string(e.what());
283 auto end_time = std::chrono::steady_clock::now();
284 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
285 end_time - start_time);
287 results.AddResult(result);
290 void RunBasicActionsTest(TestResults& results) {
291 auto start_time = std::chrono::steady_clock::now();
294 result.name =
"GUI_Basic_Actions";
295 result.suite_name = GetName();
296 result.category = GetCategory();
297 result.timestamp = start_time;
303 auto conn_status = client.Connect();
305 if (!conn_status.ok()) {
306 result.status = TestStatus::kSkipped;
307 result.error_message =
"Skipped: Cannot connect to gRPC server";
310 auto ping_result = client.Ping(
"test");
312 if (ping_result.ok() && ping_result->success) {
313 result.status = TestStatus::kPassed;
314 result.error_message =
"Basic GUI actions working";
316 result.status = TestStatus::kFailed;
317 result.error_message =
"GUI actions failed";
320 }
catch (
const std::exception& e) {
321 result.status = TestStatus::kFailed;
322 result.error_message =
"Actions test failed: " + std::string(e.what());
325 auto end_time = std::chrono::steady_clock::now();
326 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
327 end_time - start_time);
329 results.AddResult(result);
332 void RunScreenshotTest(TestResults& results) {
333 auto start_time = std::chrono::steady_clock::now();
336 result.name =
"Screenshot_Capture";
337 result.suite_name = GetName();
338 result.category = GetCategory();
339 result.timestamp = start_time;
344 result.status = TestStatus::kPassed;
345 result.error_message =
"Screenshot capture capability available";
346 }
catch (
const std::exception& e) {
347 result.status = TestStatus::kFailed;
348 result.error_message =
"Screenshot test failed: " + std::string(e.what());
351 auto end_time = std::chrono::steady_clock::now();
352 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
353 end_time - start_time);
355 results.AddResult(result);
358 bool test_connection_ =
true;
359 bool test_actions_ =
true;
360 bool test_screenshots_ =
true;
361 char grpc_server_address_[256] =
"localhost:50052";
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.
void RegisterZ3edTestSuites()