6 #include "gtest/gtest.h"
9 #include "flutter/shell/platform/linux/testing/mock_gtk.h"
20 ::testing::NiceMock<flutter::testing::MockGtk>
mock_gtk;
35 g_ptr_array_new_with_free_func(g_object_unref);
36 g_ptr_array_add(children, g_object_ref(child1));
37 g_ptr_array_add(children, g_object_ref(child2));
40 EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(root)), 2);
41 EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(root)), 0);
43 atk_object_ref_accessible_child(ATK_OBJECT(root), 0);
44 EXPECT_EQ(ATK_OBJECT(child1), c1);
46 atk_object_ref_accessible_child(ATK_OBJECT(root), 1);
47 EXPECT_EQ(ATK_OBJECT(child2), c2);
48 EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(root)),
nullptr);
50 EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(child1)), ATK_OBJECT(root));
51 EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(child1)), 0);
52 EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(child1)), 0);
54 EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(child2)), ATK_OBJECT(root));
55 EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(child2)), 1);
56 EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(child2)), 0);
63 EXPECT_STREQ(atk_object_get_name(ATK_OBJECT(node)),
"test");
71 atk_component_get_extents(ATK_COMPONENT(node), &x, &y, &
width, &
height,
83 FlutterSemanticsFlags flags1 = {};
84 flags1.is_focused = kFlutterTristateNone;
86 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
87 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_FOCUSABLE));
88 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_FOCUSED));
89 g_object_unref(state1);
91 FlutterSemanticsFlags flags2 = {};
92 flags2.is_focused = kFlutterTristateFalse;
93 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
94 ::testing::_, ATK_STATE_FOCUSABLE,
TRUE));
96 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
97 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_FOCUSABLE));
98 EXPECT_FALSE(atk_state_set_contains_state(state2, ATK_STATE_FOCUSED));
99 g_object_unref(state2);
101 FlutterSemanticsFlags flags3 = {};
102 flags3.is_focused = kFlutterTristateTrue;
103 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
104 ::testing::_, ATK_STATE_FOCUSED,
TRUE));
106 AtkStateSet* state3 = atk_object_ref_state_set(ATK_OBJECT(node));
107 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_FOCUSABLE));
108 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_FOCUSED));
109 g_object_unref(state3);
116 FlutterSemanticsFlags flags1 = {};
117 flags1.is_checked = kFlutterCheckStateNone;
118 flags1.is_toggled = kFlutterTristateNone;
120 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
121 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_CHECKABLE));
122 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_CHECKED));
123 g_object_unref(state1);
125 FlutterSemanticsFlags flags2 = {};
126 flags2.is_checked = kFlutterCheckStateFalse;
127 flags2.is_toggled = kFlutterTristateFalse;
128 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
129 ::testing::_, ATK_STATE_CHECKABLE,
TRUE));
131 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
132 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_CHECKABLE));
133 EXPECT_FALSE(atk_state_set_contains_state(state2, ATK_STATE_CHECKED));
134 g_object_unref(state2);
136 FlutterSemanticsFlags flags3 = {};
137 flags3.is_checked = kFlutterCheckStateTrue;
138 flags3.is_toggled = kFlutterTristateTrue;
139 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
140 ::testing::_, ATK_STATE_CHECKED,
TRUE));
142 AtkStateSet* state3 = atk_object_ref_state_set(ATK_OBJECT(node));
143 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_CHECKABLE));
144 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_CHECKED));
145 g_object_unref(state3);
147 FlutterSemanticsFlags flags4 = {};
148 flags4.is_checked = kFlutterCheckStateTrue;
149 flags4.is_toggled = kFlutterTristateNone;
151 AtkStateSet* state4 = atk_object_ref_state_set(ATK_OBJECT(node));
152 EXPECT_TRUE(atk_state_set_contains_state(state4, ATK_STATE_CHECKABLE));
153 EXPECT_TRUE(atk_state_set_contains_state(state4, ATK_STATE_CHECKED));
154 g_object_unref(state4);
156 FlutterSemanticsFlags flags5 = {};
157 flags5.is_checked = kFlutterCheckStateNone;
158 flags5.is_toggled = kFlutterTristateTrue;
160 AtkStateSet* state5 = atk_object_ref_state_set(ATK_OBJECT(node));
161 EXPECT_TRUE(atk_state_set_contains_state(state5, ATK_STATE_CHECKABLE));
162 EXPECT_TRUE(atk_state_set_contains_state(state5, ATK_STATE_CHECKED));
163 g_object_unref(state5);
170 FlutterSemanticsFlags flags1 = {};
171 flags1.is_selected = kFlutterTristateNone;
173 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
174 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_SELECTED));
175 g_object_unref(state1);
177 FlutterSemanticsFlags flags2 = {};
178 flags2.is_selected = kFlutterTristateFalse;
180 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
181 EXPECT_FALSE(atk_state_set_contains_state(state2, ATK_STATE_SELECTED));
182 g_object_unref(state2);
184 FlutterSemanticsFlags flags3 = {};
185 flags3.is_selected = kFlutterTristateTrue;
186 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
187 ::testing::_, ATK_STATE_SELECTED,
TRUE));
189 AtkStateSet* state3 = atk_object_ref_state_set(ATK_OBJECT(node));
190 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_SELECTED));
191 g_object_unref(state3);
198 FlutterSemanticsFlags flags1 = {};
199 flags1.is_enabled = kFlutterTristateNone;
201 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
202 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_SENSITIVE));
203 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_ENABLED));
204 g_object_unref(state1);
206 FlutterSemanticsFlags flags2 = {};
207 flags2.is_enabled = kFlutterTristateFalse;
208 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
209 ::testing::_, ATK_STATE_SENSITIVE,
TRUE));
211 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
212 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_SENSITIVE));
213 EXPECT_FALSE(atk_state_set_contains_state(state2, ATK_STATE_ENABLED));
214 g_object_unref(state2);
216 FlutterSemanticsFlags flags3 = {};
217 flags3.is_enabled = kFlutterTristateTrue;
218 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
219 ::testing::_, ATK_STATE_ENABLED,
TRUE));
221 AtkStateSet* state3 = atk_object_ref_state_set(ATK_OBJECT(node));
222 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_SENSITIVE));
223 EXPECT_TRUE(atk_state_set_contains_state(state3, ATK_STATE_ENABLED));
224 g_object_unref(state3);
231 FlutterSemanticsFlags flags1 = {};
232 flags1.is_obscured =
true;
234 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
235 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_SHOWING));
236 g_object_unref(state1);
238 FlutterSemanticsFlags flags2 = {};
239 flags2.is_obscured =
false;
240 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
241 ::testing::_, ATK_STATE_SHOWING,
TRUE));
243 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
244 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_SHOWING));
245 g_object_unref(state2);
252 FlutterSemanticsFlags flags1 = {};
253 flags1.is_hidden =
true;
255 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
256 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_VISIBLE));
257 g_object_unref(state1);
259 FlutterSemanticsFlags flags2 = {};
260 flags2.is_hidden =
false;
261 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
262 ::testing::_, ATK_STATE_VISIBLE,
TRUE));
264 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
265 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_VISIBLE));
266 g_object_unref(state2);
273 FlutterSemanticsFlags flags1 = {};
274 flags1.is_read_only =
false;
276 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
277 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_READ_ONLY));
278 g_object_unref(state1);
280 FlutterSemanticsFlags flags2 = {};
281 flags2.is_read_only =
true;
282 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
283 ::testing::_, ATK_STATE_READ_ONLY,
TRUE));
285 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
286 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_READ_ONLY));
287 g_object_unref(state2);
294 FlutterSemanticsFlags flags1 = {};
295 flags1.is_text_field =
false;
297 AtkStateSet* state1 = atk_object_ref_state_set(ATK_OBJECT(node));
298 EXPECT_FALSE(atk_state_set_contains_state(state1, ATK_STATE_EDITABLE));
299 g_object_unref(state1);
301 FlutterSemanticsFlags flags2 = {};
302 flags2.is_text_field =
true;
303 EXPECT_CALL(mock_gtk, atk_object_notify_state_change(
304 ::testing::_, ATK_STATE_EDITABLE,
TRUE));
306 AtkStateSet* state2 = atk_object_ref_state_set(ATK_OBJECT(node));
307 EXPECT_TRUE(atk_state_set_contains_state(state2, ATK_STATE_EDITABLE));
308 g_object_unref(state2);
315 FlutterSemanticsFlags flags1 = {};
316 flags1.is_button =
true;
318 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_PUSH_BUTTON);
320 FlutterSemanticsFlags flags2 = {};
321 flags2.is_checked = kFlutterCheckStateFalse;
323 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_CHECK_BOX);
325 FlutterSemanticsFlags flags3 = {};
326 flags3.is_checked = kFlutterCheckStateFalse;
327 flags3.is_in_mutually_exclusive_group =
true;
329 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_RADIO_BUTTON);
331 FlutterSemanticsFlags flags4 = {};
332 flags4.is_toggled = kFlutterTristateFalse;
334 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_TOGGLE_BUTTON);
336 FlutterSemanticsFlags flags5 = {};
337 flags5.is_text_field =
true;
339 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_TEXT);
341 FlutterSemanticsFlags flags6 = {};
342 flags6.is_text_field =
true;
343 flags6.is_obscured =
true;
345 EXPECT_EQ(atk_object_get_role(ATK_OBJECT(node)), ATK_ROLE_PASSWORD_TEXT);
352 node,
static_cast<FlutterSemanticsAction
>(
353 kFlutterSemanticsActionTap | kFlutterSemanticsActionLongPress));
355 EXPECT_EQ(atk_action_get_n_actions(ATK_ACTION(node)), 2);
356 EXPECT_STREQ(atk_action_get_name(ATK_ACTION(node), 0),
"Tap");
357 EXPECT_STREQ(atk_action_get_name(ATK_ACTION(node), 1),
"LongPress");
::testing::NiceMock< flutter::testing::MockGtk > mock_gtk
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)
g_autoptr(GMutexLocker) locker
G_MODULE_EXPORT FlDartProject * fl_dart_project_new()
G_MODULE_EXPORT FlEngine * fl_engine_new(FlDartProject *project)
G_BEGIN_DECLS FlutterViewId view_id