6 #include "flutter/shell/platform/linux/testing/linux_test.h"
7 #include "gtest/gtest.h"
10 #include "flutter/shell/platform/linux/testing/mock_gtk.h"
14 ::testing::NiceMock<flutter::testing::MockGtk>
mock_gtk;
28 g_ptr_array_new_with_free_func(g_object_unref);
29 g_ptr_array_add(children, g_object_ref(child1));
30 g_ptr_array_add(children, g_object_ref(child2));
33 EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(root)), 2);
34 EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(root)), 0);
36 atk_object_ref_accessible_child(ATK_OBJECT(root), 0);
37 EXPECT_EQ(ATK_OBJECT(child1), c1);
39 atk_object_ref_accessible_child(ATK_OBJECT(root), 1);
40 EXPECT_EQ(ATK_OBJECT(child2), c2);
41 EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(root)),
nullptr);
43 EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(child1)), ATK_OBJECT(root));
44 EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(child1)), 0);
45 EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(child1)), 0);
47 EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(child2)), ATK_OBJECT(root));
48 EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(child2)), 1);
49 EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(child2)), 0);
56 EXPECT_STREQ(atk_object_get_name(ATK_OBJECT(node)),
"test");
64 atk_component_get_extents(ATK_COMPONENT(node), &
x, &
y, &
width, &
height,
76 FlutterSemanticsFlags flags1 = {};
77 flags1.is_focused = kFlutterTristateNone;
79 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
80 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_FOCUSABLE));
81 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_FOCUSED));
82 g_object_unref(state1);
84 FlutterSemanticsFlags flags2 = {};
85 flags2.is_focused = kFlutterTristateFalse;
86 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
87 ::testing::_, ATK_STATE_FOCUSABLE,
TRUE));
89 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
90 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_FOCUSABLE));
91 EXPECT_FALSE(atk_state_set_contains_state(state2, ATK_STATE_FOCUSED));
92 g_object_unref(state2);
94 FlutterSemanticsFlags flags3 = {};
95 flags3.is_focused = kFlutterTristateTrue;
96 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
97 ::testing::_, ATK_STATE_FOCUSED,
TRUE));
99 AtkStateSet* state3 = atk_object_ref_state_set(ATK_OBJECT(node));
100 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_FOCUSABLE));
101 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_FOCUSED));
102 g_object_unref(state3);
109 FlutterSemanticsFlags flags1 = {};
110 flags1.is_checked = kFlutterCheckStateNone;
111 flags1.is_toggled = kFlutterTristateNone;
113 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
114 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_CHECKABLE));
115 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_CHECKED));
116 g_object_unref(state1);
118 FlutterSemanticsFlags flags2 = {};
119 flags2.is_checked = kFlutterCheckStateFalse;
120 flags2.is_toggled = kFlutterTristateFalse;
121 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
122 ::testing::_, ATK_STATE_CHECKABLE,
TRUE));
124 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
125 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_CHECKABLE));
126 EXPECT_FALSE(atk_state_set_contains_state(state2, ATK_STATE_CHECKED));
127 g_object_unref(state2);
129 FlutterSemanticsFlags flags3 = {};
130 flags3.is_checked = kFlutterCheckStateTrue;
131 flags3.is_toggled = kFlutterTristateTrue;
132 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
133 ::testing::_, ATK_STATE_CHECKED,
TRUE));
135 AtkStateSet* state3 = atk_object_ref_state_set(ATK_OBJECT(node));
136 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_CHECKABLE));
137 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_CHECKED));
138 g_object_unref(state3);
140 FlutterSemanticsFlags flags4 = {};
141 flags4.is_checked = kFlutterCheckStateTrue;
142 flags4.is_toggled = kFlutterTristateNone;
144 AtkStateSet* state4 = atk_object_ref_state_set(ATK_OBJECT(node));
145 EXPECT_TRUE(atk_state_set_contains_state(state4, ATK_STATE_CHECKABLE));
146 EXPECT_TRUE(atk_state_set_contains_state(state4, ATK_STATE_CHECKED));
147 g_object_unref(state4);
149 FlutterSemanticsFlags flags5 = {};
150 flags5.is_checked = kFlutterCheckStateNone;
151 flags5.is_toggled = kFlutterTristateTrue;
153 AtkStateSet* state5 = atk_object_ref_state_set(ATK_OBJECT(node));
154 EXPECT_TRUE(atk_state_set_contains_state(state5, ATK_STATE_CHECKABLE));
155 EXPECT_TRUE(atk_state_set_contains_state(state5, ATK_STATE_CHECKED));
156 g_object_unref(state5);
163 FlutterSemanticsFlags flags1 = {};
164 flags1.is_selected = kFlutterTristateNone;
166 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
167 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_SELECTED));
168 g_object_unref(state1);
170 FlutterSemanticsFlags flags2 = {};
171 flags2.is_selected = kFlutterTristateFalse;
173 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
174 EXPECT_FALSE(atk_state_set_contains_state(state2, ATK_STATE_SELECTED));
175 g_object_unref(state2);
177 FlutterSemanticsFlags flags3 = {};
178 flags3.is_selected = kFlutterTristateTrue;
179 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
180 ::testing::_, ATK_STATE_SELECTED,
TRUE));
182 AtkStateSet* state3 = atk_object_ref_state_set(ATK_OBJECT(node));
183 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_SELECTED));
184 g_object_unref(state3);
191 FlutterSemanticsFlags flags1 = {};
192 flags1.is_enabled = kFlutterTristateNone;
194 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
195 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_SENSITIVE));
196 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_ENABLED));
197 g_object_unref(state1);
199 FlutterSemanticsFlags flags2 = {};
200 flags2.is_enabled = kFlutterTristateFalse;
201 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
202 ::testing::_, ATK_STATE_SENSITIVE,
TRUE));
204 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
205 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_SENSITIVE));
206 EXPECT_FALSE(atk_state_set_contains_state(state2, ATK_STATE_ENABLED));
207 g_object_unref(state2);
209 FlutterSemanticsFlags flags3 = {};
210 flags3.is_enabled = kFlutterTristateTrue;
211 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
212 ::testing::_, ATK_STATE_ENABLED,
TRUE));
214 AtkStateSet* state3 = atk_object_ref_state_set(ATK_OBJECT(node));
215 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_SENSITIVE));
216 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_ENABLED));
217 g_object_unref(state3);
224 FlutterSemanticsFlags flags1 = {};
225 flags1.is_obscured =
true;
227 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
228 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_SHOWING));
229 g_object_unref(state1);
231 FlutterSemanticsFlags flags2 = {};
232 flags2.is_obscured =
false;
233 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
234 ::testing::_, ATK_STATE_SHOWING,
TRUE));
236 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
237 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_SHOWING));
238 g_object_unref(state2);
245 FlutterSemanticsFlags flags1 = {};
246 flags1.is_hidden =
true;
248 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
249 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_VISIBLE));
250 g_object_unref(state1);
252 FlutterSemanticsFlags flags2 = {};
253 flags2.is_hidden =
false;
254 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
255 ::testing::_, ATK_STATE_VISIBLE,
TRUE));
257 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
258 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_VISIBLE));
259 g_object_unref(state2);
266 FlutterSemanticsFlags flags1 = {};
267 flags1.is_read_only =
false;
269 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
270 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_READ_ONLY));
271 g_object_unref(state1);
273 FlutterSemanticsFlags flags2 = {};
274 flags2.is_read_only =
true;
275 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
276 ::testing::_, ATK_STATE_READ_ONLY,
TRUE));
278 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
279 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_READ_ONLY));
280 g_object_unref(state2);
287 FlutterSemanticsFlags flags1 = {};
288 flags1.is_text_field =
false;
290 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
291 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_EDITABLE));
292 g_object_unref(state1);
294 FlutterSemanticsFlags flags2 = {};
295 flags2.is_text_field =
true;
296 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
297 ::testing::_, ATK_STATE_EDITABLE,
TRUE));
299 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
300 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_EDITABLE));
301 g_object_unref(state2);
308 FlutterSemanticsFlags flags1 = {};
309 flags1.is_button =
true;
311 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_PUSH_BUTTON);
313 FlutterSemanticsFlags flags2 = {};
314 flags2.is_checked = kFlutterCheckStateFalse;
316 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_CHECK_BOX);
318 FlutterSemanticsFlags flags3 = {};
319 flags3.is_checked = kFlutterCheckStateFalse;
320 flags3.is_in_mutually_exclusive_group =
true;
322 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_RADIO_BUTTON);
324 FlutterSemanticsFlags flags4 = {};
325 flags4.is_toggled = kFlutterTristateFalse;
327 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_TOGGLE_BUTTON);
329 FlutterSemanticsFlags flags5 = {};
330 flags5.is_text_field =
true;
332 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_TEXT);
334 FlutterSemanticsFlags flags6 = {};
335 flags6.is_text_field =
true;
336 flags6.is_obscured =
true;
338 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_PASSWORD_TEXT);
340 FlutterSemanticsFlags flags7 = {};
341 flags7.is_header =
true;
343 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_HEADING);
352 EXPECT_EQ(atk_text_get_character_count(ATK_TEXT(node)), 11);
354 g_autofree gchar* text = atk_text_get_text(ATK_TEXT(node), 0, -1);
355 EXPECT_STREQ(text,
"Section One");
357 g_autofree gchar* substring = atk_text_get_text(ATK_TEXT(node), 0, 7);
358 EXPECT_STREQ(substring,
"Section");
360 EXPECT_EQ(atk_text_get_character_at_offset(ATK_TEXT(node), 0), gunichar(
'S'));
362 EXPECT_EQ(atk_text_get_caret_offset(ATK_TEXT(node)), -1);
363 EXPECT_EQ(atk_text_get_n_selections(ATK_TEXT(node)), 0);
365 gint start_offset = -1;
366 gint end_offset = -1;
367 g_autofree gchar* selection =
368 atk_text_get_selection(ATK_TEXT(node), 0, &start_offset, &end_offset);
369 EXPECT_EQ(selection,
nullptr);
370 EXPECT_EQ(start_offset, 0);
371 EXPECT_EQ(end_offset, 0);
375 g_autofree gchar* text_at_offset = atk_text_get_string_at_offset(
376 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_CHAR, &start_offset, &end_offset);
377 EXPECT_STREQ(text_at_offset,
"S");
378 EXPECT_EQ(start_offset, 0);
379 EXPECT_EQ(end_offset, 1);
383 g_autofree gchar* text_at_line_offset = atk_text_get_string_at_offset(
384 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_LINE, &start_offset, &end_offset);
385 EXPECT_STREQ(text_at_line_offset,
"Section One");
386 EXPECT_EQ(start_offset, 0);
387 EXPECT_EQ(end_offset, 11);
391 g_autofree gchar* text_out_of_bounds = atk_text_get_string_at_offset(
392 ATK_TEXT(node), 100, ATK_TEXT_GRANULARITY_CHAR, &start_offset,
394 EXPECT_EQ(text_out_of_bounds,
nullptr);
395 EXPECT_EQ(start_offset, 0);
396 EXPECT_EQ(end_offset, 0);
403 node,
static_cast<FlutterSemanticsAction
>(
404 kFlutterSemanticsActionTap | kFlutterSemanticsActionLongPress));
406 EXPECT_EQ(atk_action_get_n_actions(ATK_ACTION(node)), 2);
407 EXPECT_STREQ(atk_action_get_name(ATK_ACTION(node), 0),
"Tap");
408 EXPECT_STREQ(atk_action_get_name(ATK_ACTION(node), 1),
"LongPress");
422 g_object_unref(local_engine);
425 EXPECT_FALSE(atk_action_do_action(ATK_ACTION(node), 0));
436 g_object_unref(root);
439 EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(child)),
nullptr);
441 atk_component_get_extents(ATK_COMPONENT(child), &
x, &
y, &
width, &
height,
::testing::NiceMock< flutter::testing::MockGtk > mock_gtk
g_autoptr(FlEngine) engine
void fl_accessible_node_set_name(FlAccessibleNode *self, const gchar *name)
void fl_accessible_node_set_actions(FlAccessibleNode *self, FlutterSemanticsAction actions)
void fl_accessible_node_set_children(FlAccessibleNode *self, GPtrArray *children)
void fl_accessible_node_set_extents(FlAccessibleNode *self, gint x, gint y, gint width, gint height)
void fl_accessible_node_set_parent(FlAccessibleNode *self, AtkObject *parent, gint index)
void fl_accessible_node_set_flags(FlAccessibleNode *self, FlutterSemanticsFlags *flags)
FlAccessibleNode * fl_accessible_node_new(FlEngine *engine, FlutterViewId view_id, int32_t node_id)
TEST_F(FlAccessibleNodeTest, BuildTree)
FlFramebuffer double double int int height
FlFramebuffer double double int width
FlFramebuffer double double y
G_MODULE_EXPORT FlDartProject * fl_dart_project_new()
G_MODULE_EXPORT FlEngine * fl_engine_new(FlDartProject *project)
G_BEGIN_DECLS FlutterViewId view_id