yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
gui_automation_client.h
Go to the documentation of this file.
1// gui_automation_client.h
2// gRPC client for automating YAZE GUI through ImGuiTestHarness service
3
4#ifndef YAZE_CLI_SERVICE_GUI_AUTOMATION_CLIENT_H
5#define YAZE_CLI_SERVICE_GUI_AUTOMATION_CLIENT_H
6
7#include <chrono>
8#include <cstdint>
9#include <map>
10#include <memory>
11#include <optional>
12#include <string>
13#include <vector>
14
15#include "absl/status/status.h"
16#include "absl/status/statusor.h"
17#include "absl/time/time.h"
18
19#ifdef YAZE_WITH_GRPC
20// Undefine Windows macros that conflict with protobuf generated code
21#ifdef _WIN32
22#pragma push_macro("DWORD")
23#pragma push_macro("ERROR")
24#undef DWORD
25#undef ERROR
26#endif // _WIN32
27
28#include <grpcpp/grpcpp.h>
29
30#include "protos/imgui_test_harness.grpc.pb.h"
31
32// Restore Windows macros
33#ifdef _WIN32
34#pragma pop_macro("DWORD")
35#pragma pop_macro("ERROR")
36#endif
37#endif
38
39namespace yaze {
40namespace cli {
41
46
51 bool success;
52 std::string message;
53 std::chrono::milliseconds execution_time;
54 std::string actual_value; // For assertions
55 std::string expected_value; // For assertions
56 std::string test_id; // Test execution identifier (for introspection)
57};
58
62enum class TestRunStatus {
64 kQueued,
66 kPassed,
67 kFailed,
69};
70
75 std::string test_id;
77 std::optional<absl::Time> queued_at;
78 std::optional<absl::Time> started_at;
79 std::optional<absl::Time> completed_at;
81 std::string error_message;
82 std::vector<std::string> assertion_failures;
83};
84
89 std::string test_id;
90 std::string name;
91 std::string category;
92 std::optional<absl::Time> last_run_at;
93 int total_runs = 0;
94 int pass_count = 0;
95 int fail_count = 0;
97};
98
103 std::vector<HarnessTestSummary> tests;
104 std::string next_page_token;
105 int total_count = 0;
106};
107
112 std::string description;
113 bool passed = false;
114 std::string expected_value;
115 std::string actual_value;
116 std::string error_message;
117};
118
123 std::string test_id;
124 bool success = false;
125 std::string test_name;
126 std::string category;
127 std::optional<absl::Time> executed_at;
128 int duration_ms = 0;
129 std::vector<AssertionOutcome> assertions;
130 std::vector<std::string> logs;
131 std::map<std::string, int> metrics;
132 std::string screenshot_path;
134 std::string failure_context;
135 std::string widget_state;
136};
137
139 bool success = false;
140 std::string message;
141 std::string replay_session_id;
143 std::vector<AssertionOutcome> assertions;
144 std::vector<std::string> logs;
145};
146
148 bool success = false;
149 std::string message;
150 std::string recording_id;
151 std::optional<absl::Time> started_at;
152};
153
155 bool success = false;
156 std::string message;
157 std::string output_path;
158 int step_count = 0;
159 std::chrono::milliseconds duration{0};
160};
161
164 kAll,
165 kButton,
166 kInput,
167 kMenu,
168 kTab,
169 kCheckbox,
170 kSlider,
171 kCanvas,
173 kOther,
174};
175
177 float min_x = 0.0f;
178 float min_y = 0.0f;
179 float max_x = 0.0f;
180 float max_y = 0.0f;
181};
182
184 std::string path;
185 std::string label;
186 std::string type;
187 std::string description;
188 std::string suggested_action;
189 bool visible = true;
190 bool enabled = true;
192 uint32_t widget_id = 0;
193 bool has_bounds = false;
194 int64_t last_seen_frame = -1;
195 std::optional<absl::Time> last_seen_at;
196 bool stale = false;
197};
198
200 std::string name;
201 bool visible = true;
202 std::vector<WidgetDescriptor> widgets;
203};
204
212
214 std::vector<DiscoveredWindowInfo> windows;
216 std::optional<absl::Time> generated_at;
217};
218
239 public:
245 explicit GuiAutomationClient(const std::string& server_address);
246
251 absl::Status Connect();
252
258 absl::StatusOr<AutomationResult> Ping(const std::string& message = "ping");
259
266 absl::StatusOr<AutomationResult> Click(const std::string& target,
268
276 absl::StatusOr<AutomationResult> Type(const std::string& target,
277 const std::string& text,
278 bool clear_first = false);
279
287 absl::StatusOr<AutomationResult> Wait(const std::string& condition,
288 int timeout_ms = 5000,
289 int poll_interval_ms = 100);
290
296 absl::StatusOr<AutomationResult> Assert(const std::string& condition);
297
304 absl::StatusOr<AutomationResult> Screenshot(
305 const std::string& region = "full", const std::string& format = "PNG");
306
310 absl::StatusOr<TestStatusDetails> GetTestStatus(const std::string& test_id);
311
315 absl::StatusOr<ListTestsResult> ListTests(
316 const std::string& category_filter = "", int page_size = 100,
317 const std::string& page_token = "");
318
322 absl::StatusOr<TestResultDetails> GetTestResults(const std::string& test_id,
323 bool include_logs = false);
324
325 absl::StatusOr<DiscoverWidgetsResult> DiscoverWidgets(
326 const DiscoverWidgetsQuery& query);
327
328 absl::StatusOr<ReplayTestResult> ReplayTest(
329 const std::string& script_path, bool ci_mode,
330 const std::map<std::string, std::string>& parameter_overrides = {});
331
332 absl::StatusOr<StartRecordingResult> StartRecording(
333 const std::string& output_path, const std::string& session_name,
334 const std::string& description);
335
336 absl::StatusOr<StopRecordingResult> StopRecording(
337 const std::string& recording_id, bool discard = false);
338
342 bool IsConnected() const { return connected_; }
343
347 const std::string& ServerAddress() const { return server_address_; }
348
349 private:
350#ifdef YAZE_WITH_GRPC
351 std::unique_ptr<yaze::test::ImGuiTestHarness::Stub> stub_;
352#endif
353 std::string server_address_;
354 bool connected_ = false;
355};
356
357} // namespace cli
358} // namespace yaze
359
360#endif // YAZE_CLI_SERVICE_GUI_AUTOMATION_CLIENT_H
Client for automating YAZE GUI through gRPC.
absl::StatusOr< ReplayTestResult > ReplayTest(const std::string &script_path, bool ci_mode, const std::map< std::string, std::string > &parameter_overrides={})
absl::StatusOr< AutomationResult > Screenshot(const std::string &region="full", const std::string &format="PNG")
Capture a screenshot.
absl::Status Connect()
Connect to the test harness server.
absl::StatusOr< StartRecordingResult > StartRecording(const std::string &output_path, const std::string &session_name, const std::string &description)
absl::StatusOr< AutomationResult > Ping(const std::string &message="ping")
Check if the server is reachable and responsive.
absl::StatusOr< TestStatusDetails > GetTestStatus(const std::string &test_id)
Fetch the current execution status for a harness test.
GuiAutomationClient(const std::string &server_address)
Construct a new GUI automation client.
absl::StatusOr< AutomationResult > Type(const std::string &target, const std::string &text, bool clear_first=false)
Type text into an input field.
absl::StatusOr< DiscoverWidgetsResult > DiscoverWidgets(const DiscoverWidgetsQuery &query)
bool IsConnected() const
Check if client is connected.
absl::StatusOr< AutomationResult > Wait(const std::string &condition, int timeout_ms=5000, int poll_interval_ms=100)
Wait for a condition to be met.
const std::string & ServerAddress() const
Get the server address.
absl::StatusOr< TestResultDetails > GetTestResults(const std::string &test_id, bool include_logs=false)
Retrieve detailed results for a harness test execution.
absl::StatusOr< StopRecordingResult > StopRecording(const std::string &recording_id, bool discard=false)
absl::StatusOr< AutomationResult > Assert(const std::string &condition)
Assert a GUI state condition.
absl::StatusOr< AutomationResult > Click(const std::string &target, ClickType type=ClickType::kLeft)
Click a GUI element.
absl::StatusOr< ListTestsResult > ListTests(const std::string &category_filter="", int page_size=100, const std::string &page_token="")
Enumerate harness tests with optional filtering.
TestRunStatus
Execution status codes returned by the harness.
ClickType
Type of click action to perform.
Individual assertion outcome within a harness test.
Result of a GUI automation action.
std::chrono::milliseconds execution_time
std::vector< DiscoveredWindowInfo > windows
std::optional< absl::Time > generated_at
std::vector< WidgetDescriptor > widgets
Aggregated metadata about a harness test.
std::optional< absl::Time > last_run_at
Result container for ListTests RPC.
std::vector< HarnessTestSummary > tests
std::vector< AssertionOutcome > assertions
std::vector< std::string > logs
std::optional< absl::Time > started_at
std::chrono::milliseconds duration
Detailed execution results for a specific harness test.
std::optional< absl::Time > executed_at
std::map< std::string, int > metrics
std::vector< AssertionOutcome > assertions
std::vector< std::string > logs
Detailed information about an individual test execution.
std::vector< std::string > assertion_failures
std::optional< absl::Time > completed_at
std::optional< absl::Time > started_at
std::optional< absl::Time > queued_at
std::optional< absl::Time > last_seen_at