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
21
22#include <grpcpp/grpcpp.h>
23
24#include "protos/imgui_test_harness.grpc.pb.h"
25#endif
26
27namespace yaze {
28namespace cli {
29
34
39 bool success;
40 std::string message;
41 std::chrono::milliseconds execution_time;
42 std::string actual_value; // For assertions
43 std::string expected_value; // For assertions
44 std::string test_id; // Test execution identifier (for introspection)
45 std::string resolved_widget_key; // Selector-v2: resolved widget key
46 std::string resolved_path; // Selector-v2: resolved legacy path
47};
48
52enum class TestRunStatus {
54 kQueued,
56 kPassed,
57 kFailed,
59};
60
65 std::string test_id;
67 std::optional<absl::Time> queued_at;
68 std::optional<absl::Time> started_at;
69 std::optional<absl::Time> completed_at;
71 std::string error_message;
72 std::vector<std::string> assertion_failures;
73};
74
79 std::string test_id;
80 std::string name;
81 std::string category;
82 std::optional<absl::Time> last_run_at;
83 int total_runs = 0;
84 int pass_count = 0;
85 int fail_count = 0;
87};
88
93 std::vector<HarnessTestSummary> tests;
94 std::string next_page_token;
95 int total_count = 0;
96};
97
102 std::string description;
103 bool passed = false;
104 std::string expected_value;
105 std::string actual_value;
106 std::string error_message;
107};
108
113 std::string test_id;
114 bool success = false;
115 std::string test_name;
116 std::string category;
117 std::optional<absl::Time> executed_at;
118 int duration_ms = 0;
119 std::vector<AssertionOutcome> assertions;
120 std::vector<std::string> logs;
121 std::map<std::string, int> metrics;
122 std::string screenshot_path;
124 std::string failure_context;
125 std::string widget_state;
126};
127
129 bool success = false;
130 std::string message;
131 std::string replay_session_id;
133 std::vector<AssertionOutcome> assertions;
134 std::vector<std::string> logs;
135};
136
138 bool success = false;
139 std::string message;
140 std::string recording_id;
141 std::optional<absl::Time> started_at;
142};
143
145 bool success = false;
146 std::string message;
147 std::string output_path;
148 int step_count = 0;
149 std::chrono::milliseconds duration{0};
150};
151
154 kAll,
155 kButton,
156 kInput,
157 kMenu,
158 kTab,
159 kCheckbox,
160 kSlider,
161 kCanvas,
163 kOther,
164};
165
167 float min_x = 0.0f;
168 float min_y = 0.0f;
169 float max_x = 0.0f;
170 float max_y = 0.0f;
171};
172
174 std::string path;
175 std::string widget_key;
176 std::string legacy_path;
177 std::string alias_of;
178 std::string label;
179 std::string type;
180 std::string description;
181 std::string suggested_action;
182 bool visible = true;
183 bool enabled = true;
185 uint32_t widget_id = 0;
186 bool has_bounds = false;
187 int64_t last_seen_frame = -1;
188 std::optional<absl::Time> last_seen_at;
189 bool stale = false;
190};
191
193 std::string name;
194 bool visible = true;
195 std::vector<WidgetDescriptor> widgets;
196};
197
205
207 std::vector<DiscoveredWindowInfo> windows;
209 std::optional<absl::Time> generated_at;
210};
211
223
225 bool success = false;
226 std::string message;
227 std::chrono::milliseconds elapsed{0};
228 int64_t last_frame_id = 0;
231 std::string timeout_reason;
232};
233
254 public:
260 explicit GuiAutomationClient(const std::string& server_address);
261
266 absl::Status Connect();
267
273 absl::StatusOr<AutomationResult> Ping(const std::string& message = "ping");
274
282 absl::StatusOr<AutomationResult> Click(const std::string& target,
284 const std::string& widget_key = "");
285
294 absl::StatusOr<AutomationResult> Type(const std::string& target,
295 const std::string& text,
296 bool clear_first = false,
297 const std::string& widget_key = "");
298
307 absl::StatusOr<AutomationResult> Wait(const std::string& condition,
308 int timeout_ms = 5000,
309 int poll_interval_ms = 100,
310 const std::string& widget_key = "");
311
318 absl::StatusOr<AutomationResult> Assert(const std::string& condition,
319 const std::string& widget_key = "");
320
324 absl::StatusOr<UiSyncStateSnapshot> FlushUiActions(int timeout_ms = 2000);
325
329 absl::StatusOr<WaitForIdleResult> WaitForIdle(int timeout_ms = 5000,
330 int stable_frames = 2,
331 bool flush_first = true,
332 int poll_interval_ms = 25);
333
337 absl::StatusOr<UiSyncStateSnapshot> GetUiSyncState();
338
345 absl::StatusOr<AutomationResult> Screenshot(
346 const std::string& region = "full", const std::string& format = "PNG");
347
351 absl::StatusOr<TestStatusDetails> GetTestStatus(const std::string& test_id);
352
356 absl::StatusOr<ListTestsResult> ListTests(
357 const std::string& category_filter = "", int page_size = 100,
358 const std::string& page_token = "");
359
363 absl::StatusOr<TestResultDetails> GetTestResults(const std::string& test_id,
364 bool include_logs = false);
365
366 absl::StatusOr<DiscoverWidgetsResult> DiscoverWidgets(
367 const DiscoverWidgetsQuery& query);
368
369 absl::StatusOr<ReplayTestResult> ReplayTest(
370 const std::string& script_path, bool ci_mode,
371 const std::map<std::string, std::string>& parameter_overrides = {});
372
373 absl::StatusOr<StartRecordingResult> StartRecording(
374 const std::string& output_path, const std::string& session_name,
375 const std::string& description);
376
377 absl::StatusOr<StopRecordingResult> StopRecording(
378 const std::string& recording_id, bool discard = false);
379
383 bool IsConnected() const { return connected_; }
384
388 const std::string& ServerAddress() const { return server_address_; }
389
390 private:
391#ifdef YAZE_WITH_GRPC
392 std::unique_ptr<yaze::test::ImGuiTestHarness::Stub> stub_;
393#endif
394 std::string server_address_;
395 bool connected_ = false;
396};
397
398} // namespace cli
399} // namespace yaze
400
401#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 > Type(const std::string &target, const std::string &text, bool clear_first=false, const std::string &widget_key="")
Type text into an input field.
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.
absl::StatusOr< UiSyncStateSnapshot > GetUiSyncState()
Fetch low-level UI synchronization counters for diagnostics.
GuiAutomationClient(const std::string &server_address)
Construct a new GUI automation client.
absl::StatusOr< DiscoverWidgetsResult > DiscoverWidgets(const DiscoverWidgetsQuery &query)
absl::StatusOr< AutomationResult > Assert(const std::string &condition, const std::string &widget_key="")
Assert a GUI state condition.
bool IsConnected() const
Check if client is connected.
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< UiSyncStateSnapshot > FlushUiActions(int timeout_ms=2000)
Force a frame-boundary flush for deferred UI actions.
absl::StatusOr< StopRecordingResult > StopRecording(const std::string &recording_id, bool discard=false)
absl::StatusOr< WaitForIdleResult > WaitForIdle(int timeout_ms=5000, int stable_frames=2, bool flush_first=true, int poll_interval_ms=25)
Wait until UI reaches deterministic idle criteria.
absl::StatusOr< AutomationResult > Wait(const std::string &condition, int timeout_ms=5000, int poll_interval_ms=100, const std::string &widget_key="")
Wait for a condition to be met.
absl::StatusOr< AutomationResult > Click(const std::string &target, ClickType type=ClickType::kLeft, const std::string &widget_key="")
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 > sampled_at
std::chrono::milliseconds elapsed
std::optional< absl::Time > last_seen_at