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()) failure_details +=
"; ";
174 failure_details += absl::StrFormat(
"Command '%s' failed: %s", cmd, proposal_or.status().message());
179 result.status = TestStatus::kPassed;
180 result.error_message =
181 absl::StrFormat(
"All %d command types parsed successfully", passed);
183 result.status = TestStatus::kFailed;
184 result.error_message =
185 absl::StrFormat(
"%d commands passed, %d failed. Details: %s", passed, failed, failure_details.c_str());
187 }
catch (
const std::exception& e) {
188 result.status = TestStatus::kFailed;
189 result.error_message =
"Parsing test failed: " + std::string(e.what());
192 auto end_time = std::chrono::steady_clock::now();
193 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
194 end_time - start_time);
196 results.AddResult(result);
199 bool test_gemini_connectivity_ =
true;
200 bool test_proposal_generation_ =
true;
201 bool test_command_parsing_ =
true;
205class GUIAutomationTestSuite :
public TestSuite {
207 GUIAutomationTestSuite() =
default;
208 ~GUIAutomationTestSuite()
override =
default;
210 std::string GetName()
const override {
return "GUI Automation (gRPC)"; }
212 return TestCategory::kIntegration;
215 absl::Status RunTests(TestResults& results)
override {
217 RunConnectionTest(results);
220 RunBasicActionsTest(results);
223 RunScreenshotTest(results);
225 return absl::OkStatus();
228 void DrawConfiguration()
override {
229 ImGui::Text(
"GUI Automation Test Configuration");
232 ImGui::Checkbox(
"Test gRPC Connection", &test_connection_);
233 ImGui::Checkbox(
"Test GUI Actions", &test_actions_);
234 ImGui::Checkbox(
"Test Screenshot Capture", &test_screenshots_);
237 ImGui::InputText(
"gRPC Server", grpc_server_address_,
238 sizeof(grpc_server_address_));
241 ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
242 "Note: Requires ImGuiTestHarness server running");
246 void RunConnectionTest(TestResults& results) {
247 auto start_time = std::chrono::steady_clock::now();
250 result.name =
"gRPC_Connection";
251 result.suite_name = GetName();
252 result.category = GetCategory();
253 result.timestamp = start_time;
262 auto status = client.Connect();
265 result.status = TestStatus::kPassed;
266 result.error_message =
"gRPC connection successful";
269 result.status = TestStatus::kSkipped;
270 result.error_message =
271 "Connection failed (harness likely not running): " + std::string(status.message());
273 }
catch (
const std::exception& e) {
274 result.status = TestStatus::kSkipped;
275 result.error_message =
"Connection test skipped: " + std::string(e.what());
278 auto end_time = std::chrono::steady_clock::now();
279 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
280 end_time - start_time);
282 results.AddResult(result);
285 void RunBasicActionsTest(TestResults& results) {
286 auto start_time = std::chrono::steady_clock::now();
289 result.name =
"GUI_Basic_Actions";
290 result.suite_name = GetName();
291 result.category = GetCategory();
292 result.timestamp = start_time;
298 auto conn_status = client.Connect();
300 if (!conn_status.ok()) {
301 result.status = TestStatus::kSkipped;
302 result.error_message =
"Skipped: Cannot connect to gRPC server";
305 auto ping_result = client.Ping(
"test");
307 if (ping_result.ok() && ping_result->success) {
308 result.status = TestStatus::kPassed;
309 result.error_message =
"Basic GUI actions working";
311 result.status = TestStatus::kFailed;
312 result.error_message =
"GUI actions failed";
315 }
catch (
const std::exception& e) {
316 result.status = TestStatus::kFailed;
317 result.error_message =
"Actions test failed: " + std::string(e.what());
320 auto end_time = std::chrono::steady_clock::now();
321 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
322 end_time - start_time);
324 results.AddResult(result);
327 void RunScreenshotTest(TestResults& results) {
328 auto start_time = std::chrono::steady_clock::now();
331 result.name =
"Screenshot_Capture";
332 result.suite_name = GetName();
333 result.category = GetCategory();
334 result.timestamp = start_time;
339 result.status = TestStatus::kPassed;
340 result.error_message =
"Screenshot capture capability available";
341 }
catch (
const std::exception& e) {
342 result.status = TestStatus::kFailed;
343 result.error_message =
"Screenshot test failed: " + std::string(e.what());
346 auto end_time = std::chrono::steady_clock::now();
347 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
348 end_time - start_time);
350 results.AddResult(result);
353 bool test_connection_ =
true;
354 bool test_actions_ =
true;
355 bool test_screenshots_ =
true;
356 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()