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 "
154 "overworld replace-tile --map 0 --old-tile 0x02E --new-tile 0x030"};
162 for (
const auto& cmd : test_commands) {
164 std::vector<std::string> single_cmd = {cmd};
167 if (proposal_or.ok()) {
175 result.status = TestStatus::kPassed;
176 result.error_message =
177 absl::StrFormat(
"All %d command types parsed successfully", passed);
179 result.status = TestStatus::kFailed;
180 result.error_message =
181 absl::StrFormat(
"%d commands passed, %d failed", passed, failed);
183 }
catch (
const std::exception& e) {
184 result.status = TestStatus::kFailed;
185 result.error_message =
"Parsing test failed: " + std::string(e.what());
188 auto end_time = std::chrono::steady_clock::now();
189 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
190 end_time - start_time);
192 results.AddResult(result);
195 bool test_gemini_connectivity_ =
true;
196 bool test_proposal_generation_ =
true;
197 bool test_command_parsing_ =
true;
201class GUIAutomationTestSuite :
public TestSuite {
203 GUIAutomationTestSuite() =
default;
204 ~GUIAutomationTestSuite()
override =
default;
206 std::string GetName()
const override {
return "GUI Automation (gRPC)"; }
208 return TestCategory::kIntegration;
211 absl::Status RunTests(TestResults& results)
override {
213 RunConnectionTest(results);
216 RunBasicActionsTest(results);
219 RunScreenshotTest(results);
221 return absl::OkStatus();
224 void DrawConfiguration()
override {
225 ImGui::Text(
"GUI Automation Test Configuration");
228 ImGui::Checkbox(
"Test gRPC Connection", &test_connection_);
229 ImGui::Checkbox(
"Test GUI Actions", &test_actions_);
230 ImGui::Checkbox(
"Test Screenshot Capture", &test_screenshots_);
233 ImGui::InputText(
"gRPC Server", grpc_server_address_,
234 sizeof(grpc_server_address_));
237 ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
238 "Note: Requires ImGuiTestHarness server running");
242 void RunConnectionTest(TestResults& results) {
243 auto start_time = std::chrono::steady_clock::now();
246 result.name =
"gRPC_Connection";
247 result.suite_name = GetName();
248 result.category = GetCategory();
249 result.timestamp = start_time;
258 auto status = client.Connect();
261 result.status = TestStatus::kPassed;
262 result.error_message =
"gRPC connection successful";
264 result.status = TestStatus::kFailed;
265 result.error_message =
266 "Connection failed: " + std::string(status.message());
268 }
catch (
const std::exception& e) {
269 result.status = TestStatus::kFailed;
270 result.error_message =
"Connection test failed: " + std::string(e.what());
273 auto end_time = std::chrono::steady_clock::now();
274 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
275 end_time - start_time);
277 results.AddResult(result);
280 void RunBasicActionsTest(TestResults& results) {
281 auto start_time = std::chrono::steady_clock::now();
284 result.name =
"GUI_Basic_Actions";
285 result.suite_name = GetName();
286 result.category = GetCategory();
287 result.timestamp = start_time;
293 auto conn_status = client.Connect();
295 if (!conn_status.ok()) {
296 result.status = TestStatus::kSkipped;
297 result.error_message =
"Skipped: Cannot connect to gRPC server";
300 auto ping_result = client.Ping(
"test");
302 if (ping_result.ok() && ping_result->success) {
303 result.status = TestStatus::kPassed;
304 result.error_message =
"Basic GUI actions working";
306 result.status = TestStatus::kFailed;
307 result.error_message =
"GUI actions failed";
310 }
catch (
const std::exception& e) {
311 result.status = TestStatus::kFailed;
312 result.error_message =
"Actions test failed: " + std::string(e.what());
315 auto end_time = std::chrono::steady_clock::now();
316 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
317 end_time - start_time);
319 results.AddResult(result);
322 void RunScreenshotTest(TestResults& results) {
323 auto start_time = std::chrono::steady_clock::now();
326 result.name =
"Screenshot_Capture";
327 result.suite_name = GetName();
328 result.category = GetCategory();
329 result.timestamp = start_time;
334 result.status = TestStatus::kPassed;
335 result.error_message =
"Screenshot capture capability available";
336 }
catch (
const std::exception& e) {
337 result.status = TestStatus::kFailed;
338 result.error_message =
"Screenshot test failed: " + std::string(e.what());
341 auto end_time = std::chrono::steady_clock::now();
342 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
343 end_time - start_time);
345 results.AddResult(result);
348 bool test_connection_ =
true;
349 bool test_actions_ =
true;
350 bool test_screenshots_ =
true;
351 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()