1#ifndef YAZE_APP_TEST_Z3ED_TEST_SUITE_H
2#define YAZE_APP_TEST_Z3ED_TEST_SUITE_H
5#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"; }
28 TestCategory GetCategory()
const override {
return TestCategory::kIntegration; }
30 absl::Status RunTests(TestResults& results)
override {
32 RunGeminiConnectivityTest(results);
35 RunTile16ProposalTest(results);
38 RunCommandParsingTest(results);
40 return absl::OkStatus();
43 void DrawConfiguration()
override {
44 ImGui::Text(
"z3ed AI Agent Test Configuration");
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_);
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");
58 void RunGeminiConnectivityTest(TestResults& results) {
59 auto start_time = std::chrono::steady_clock::now();
62 result.name =
"Gemini_AI_Connectivity";
63 result.suite_name = GetName();
64 result.category = GetCategory();
65 result.timestamp = start_time;
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";
75 result.status = TestStatus::kPassed;
76 result.error_message =
"Gemini API key configured";
78 }
catch (
const std::exception& e) {
79 result.status = TestStatus::kFailed;
80 result.error_message =
"Connectivity test failed: " + std::string(e.what());
83 auto end_time = std::chrono::steady_clock::now();
84 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
85 end_time - start_time);
87 results.AddResult(result);
90 void RunTile16ProposalTest(TestResults& results) {
91 auto start_time = std::chrono::steady_clock::now();
94 result.name =
"Tile16_Proposal_Generation";
95 result.suite_name = GetName();
96 result.category = GetCategory();
97 result.timestamp = start_time;
106 std::vector<std::string> commands = {
107 "overworld set-tile --map 0 --x 10 --y 20 --tile 0x02E"
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());
120 result.status = TestStatus::kFailed;
121 result.error_message =
"Proposal generation failed: " +
122 std::string(proposal_or.status().message());
124 }
catch (
const std::exception& e) {
125 result.status = TestStatus::kFailed;
126 result.error_message =
"Proposal test failed: " + std::string(e.what());
129 auto end_time = std::chrono::steady_clock::now();
130 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
131 end_time - start_time);
133 results.AddResult(result);
136 void RunCommandParsingTest(TestResults& results) {
137 auto start_time = std::chrono::steady_clock::now();
140 result.name =
"Natural_Language_Command_Parsing";
141 result.suite_name = GetName();
142 result.category = GetCategory();
143 result.timestamp = start_time;
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"
159 for (
const auto& cmd : test_commands) {
161 std::vector<std::string> single_cmd = {cmd};
163 if (proposal_or.ok()) {
171 result.status = TestStatus::kPassed;
172 result.error_message = absl::StrFormat(
173 "All %d command types parsed successfully", passed);
175 result.status = TestStatus::kFailed;
176 result.error_message = absl::StrFormat(
177 "%d commands passed, %d failed", passed, failed);
179 }
catch (
const std::exception& e) {
180 result.status = TestStatus::kFailed;
181 result.error_message =
"Parsing test failed: " + std::string(e.what());
184 auto end_time = std::chrono::steady_clock::now();
185 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
186 end_time - start_time);
188 results.AddResult(result);
191 bool test_gemini_connectivity_ =
true;
192 bool test_proposal_generation_ =
true;
193 bool test_command_parsing_ =
true;
197class GUIAutomationTestSuite :
public TestSuite {
199 GUIAutomationTestSuite() =
default;
200 ~GUIAutomationTestSuite()
override =
default;
202 std::string GetName()
const override {
return "GUI Automation (gRPC)"; }
203 TestCategory GetCategory()
const override {
return TestCategory::kIntegration; }
205 absl::Status RunTests(TestResults& results)
override {
207 RunConnectionTest(results);
210 RunBasicActionsTest(results);
213 RunScreenshotTest(results);
215 return absl::OkStatus();
218 void DrawConfiguration()
override {
219 ImGui::Text(
"GUI Automation Test Configuration");
222 ImGui::Checkbox(
"Test gRPC Connection", &test_connection_);
223 ImGui::Checkbox(
"Test GUI Actions", &test_actions_);
224 ImGui::Checkbox(
"Test Screenshot Capture", &test_screenshots_);
227 ImGui::InputText(
"gRPC Server", grpc_server_address_,
sizeof(grpc_server_address_));
230 ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
231 "Note: Requires ImGuiTestHarness server running");
235 void RunConnectionTest(TestResults& results) {
236 auto start_time = std::chrono::steady_clock::now();
239 result.name =
"gRPC_Connection";
240 result.suite_name = GetName();
241 result.category = GetCategory();
242 result.timestamp = start_time;
251 auto status = client.Connect();
254 result.status = TestStatus::kPassed;
255 result.error_message =
"gRPC connection successful";
257 result.status = TestStatus::kFailed;
258 result.error_message =
"Connection failed: " + std::string(status.message());
260 }
catch (
const std::exception& e) {
261 result.status = TestStatus::kFailed;
262 result.error_message =
"Connection test failed: " + std::string(e.what());
265 auto end_time = std::chrono::steady_clock::now();
266 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
267 end_time - start_time);
269 results.AddResult(result);
272 void RunBasicActionsTest(TestResults& results) {
273 auto start_time = std::chrono::steady_clock::now();
276 result.name =
"GUI_Basic_Actions";
277 result.suite_name = GetName();
278 result.category = GetCategory();
279 result.timestamp = start_time;
285 auto conn_status = client.Connect();
287 if (!conn_status.ok()) {
288 result.status = TestStatus::kSkipped;
289 result.error_message =
"Skipped: Cannot connect to gRPC server";
292 auto ping_result = client.Ping(
"test");
294 if (ping_result.ok() && ping_result->success) {
295 result.status = TestStatus::kPassed;
296 result.error_message =
"Basic GUI actions working";
298 result.status = TestStatus::kFailed;
299 result.error_message =
"GUI actions failed";
302 }
catch (
const std::exception& e) {
303 result.status = TestStatus::kFailed;
304 result.error_message =
"Actions test failed: " + std::string(e.what());
307 auto end_time = std::chrono::steady_clock::now();
308 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
309 end_time - start_time);
311 results.AddResult(result);
314 void RunScreenshotTest(TestResults& results) {
315 auto start_time = std::chrono::steady_clock::now();
318 result.name =
"Screenshot_Capture";
319 result.suite_name = GetName();
320 result.category = GetCategory();
321 result.timestamp = start_time;
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());
333 auto end_time = std::chrono::steady_clock::now();
334 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
335 end_time - start_time);
337 results.AddResult(result);
340 bool test_connection_ =
true;
341 bool test_actions_ =
true;
342 bool test_screenshots_ =
true;
343 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()
Main namespace for the application.