Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_accessible_text_field_test.cc File Reference

Go to the source code of this file.

Classes

class  FlAccessibleTextFieldTest
 

Functions

static FlValuedecode_semantic_data (const uint8_t *data, size_t data_length)
 
 TEST_F (FlAccessibleTextFieldTest, SetValue)
 
 TEST_F (FlAccessibleTextFieldTest, SetTextSelection)
 
 TEST_F (FlAccessibleTextFieldTest, PerformAction)
 
 TEST_F (FlAccessibleTextFieldTest, GetCharacterCount)
 
 TEST_F (FlAccessibleTextFieldTest, GetText)
 
 TEST_F (FlAccessibleTextFieldTest, GetTextBoundsChecking)
 
 TEST_F (FlAccessibleTextFieldTest, GetCaretOffset)
 
 TEST_F (FlAccessibleTextFieldTest, SetCaretOffset)
 
 TEST_F (FlAccessibleTextFieldTest, GetNSelections)
 
 TEST_F (FlAccessibleTextFieldTest, GetSelection)
 
 TEST_F (FlAccessibleTextFieldTest, AddSelection)
 
 TEST_F (FlAccessibleTextFieldTest, RemoveSelection)
 
 TEST_F (FlAccessibleTextFieldTest, SetSelection)
 
 TEST_F (FlAccessibleTextFieldTest, SetTextContents)
 
 TEST_F (FlAccessibleTextFieldTest, InsertDeleteText)
 
 TEST_F (FlAccessibleTextFieldTest, CopyCutPasteText)
 
 TEST_F (FlAccessibleTextFieldTest, TextBoundary)
 
 TEST_F (FlAccessibleTextFieldTest, TextBoundaryOffsetBeyondEnd)
 
 TEST_F (FlAccessibleTextFieldTest, TextBoundaryOffsetAtStart)
 
 TEST_F (FlAccessibleTextFieldTest, TextBoundaryEmptyText)
 
 TEST_F (FlAccessibleTextFieldTest, TextBoundaryOffsetAtEnd)
 
 TEST_F (FlAccessibleTextFieldTest, TextBoundaryMultiByte)
 

Function Documentation

◆ decode_semantic_data()

static FlValue * decode_semantic_data ( const uint8_t *  data,
size_t  data_length 
)
static

Definition at line 18 of file fl_accessible_text_field_test.cc.

18 {
19 g_autoptr(GBytes) bytes = g_bytes_new(data, data_length);
20 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
21 return fl_message_codec_decode_message(FL_MESSAGE_CODEC(codec), bytes,
22 nullptr);
23}
g_autoptr(FlEngine) engine
G_MODULE_EXPORT FlValue * fl_message_codec_decode_message(FlMessageCodec *self, GBytes *message, GError **error)
G_MODULE_EXPORT FlStandardMessageCodec * fl_standard_message_codec_new()

References fl_message_codec_decode_message(), fl_standard_message_codec_new(), and g_autoptr().

Referenced by TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), and TEST_F().

◆ TEST_F() [1/22]

TEST_F ( FlAccessibleTextFieldTest  ,
AddSelection   
)

Definition at line 323 of file fl_accessible_text_field_test.cc.

323 {
324 int base = -1;
325 int extent = -1;
326
327 StartEngine();
328
330 SendSemanticsAction,
331 ([&base, &extent](auto engine,
332 const FlutterSendSemanticsActionInfo* info) {
336 EXPECT_EQ(fl_value_get_type(value), FL_VALUE_TYPE_MAP);
338 extent = fl_value_get_int(fl_value_lookup_string(value, "extent"));
339 return kSuccess;
340 }));
341
342 g_autoptr(FlAccessibleNode) node =
344
345 EXPECT_TRUE(atk_text_add_selection(ATK_TEXT(node), 2, 4));
346 EXPECT_EQ(base, 2);
347 EXPECT_EQ(extent, 4);
348
350
351 // already has selection
352 EXPECT_FALSE(atk_text_add_selection(ATK_TEXT(node), 6, 7));
353 EXPECT_EQ(base, 2);
354 EXPECT_EQ(extent, 4);
355}
int32_t value
@ kSuccess
Definition embedder.h:73
@ kFlutterSemanticsActionSetSelection
Set the text selection to the given range.
Definition embedder.h:153
FlutterEngine engine
Definition main.cc:84
void fl_accessible_node_set_text_selection(FlAccessibleNode *self, gint base, gint extent)
FlAccessibleNode * fl_accessible_text_field_new(FlEngine *engine, FlutterViewId view_id, int32_t id)
static FlValue * decode_semantic_data(const uint8_t *data, size_t data_length)
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
Definition fl_engine.cc:920
G_MODULE_EXPORT FlValue * fl_value_lookup_string(FlValue *self, const gchar *key)
Definition fl_value.cc:811
G_MODULE_EXPORT int64_t fl_value_get_int(FlValue *self)
Definition fl_value.cc:668
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
Definition fl_value.cc:466
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition fl_value.h:42
@ FL_VALUE_TYPE_MAP
Definition fl_value.h:74
#define MOCK_ENGINE_PROC(proc, mock_impl)
FlutterEngineSendSemanticsActionFnPtr SendSemanticsAction
Definition embedder.h:3810
FlutterSemanticsAction action
The semantics action.
Definition embedder.h:2839
size_t data_length
The data length.
Definition embedder.h:2845
const uint8_t * data
Data associated with the action.
Definition embedder.h:2842

References FlutterSendSemanticsActionInfo::action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, decode_semantic_data(), engine, fl_accessible_node_set_text_selection(), fl_accessible_text_field_new(), fl_engine_get_embedder_api(), fl_value_get_int(), fl_value_get_type(), fl_value_lookup_string(), FL_VALUE_TYPE_MAP, g_autoptr(), kFlutterSemanticsActionSetSelection, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendSemanticsAction, and value.

◆ TEST_F() [2/22]

TEST_F ( FlAccessibleTextFieldTest  ,
CopyCutPasteText   
)

Definition at line 508 of file fl_accessible_text_field_test.cc.

508 {
509 int base = -1;
510 int extent = -1;
512
513 StartEngine();
514
516 SendSemanticsAction,
517 ([&act, &base, &extent](auto engine,
518 const FlutterSendSemanticsActionInfo* info) {
519 EXPECT_THAT(info->action,
520 ::testing::AnyOf(kFlutterSemanticsActionCut,
524 act = info->action;
528 EXPECT_EQ(fl_value_get_type(value), FL_VALUE_TYPE_MAP);
530 extent = fl_value_get_int(fl_value_lookup_string(value, "extent"));
531 }
532 return kSuccess;
533 }));
534
535 g_autoptr(FlAccessibleNode) node =
537
538 atk_editable_text_copy_text(ATK_EDITABLE_TEXT(node), 2, 5);
539 EXPECT_EQ(base, 2);
540 EXPECT_EQ(extent, 5);
541 EXPECT_EQ(act, kFlutterSemanticsActionCopy);
542
543 atk_editable_text_cut_text(ATK_EDITABLE_TEXT(node), 1, 4);
544 EXPECT_EQ(base, 1);
545 EXPECT_EQ(extent, 4);
546 EXPECT_EQ(act, kFlutterSemanticsActionCut);
547
548 atk_editable_text_paste_text(ATK_EDITABLE_TEXT(node), 3);
549 EXPECT_EQ(base, 3);
550 EXPECT_EQ(extent, 3);
551 EXPECT_EQ(act, kFlutterSemanticsActionPaste);
552}
FlutterSemanticsAction
Definition embedder.h:122
@ kFlutterSemanticsActionPaste
Paste the current content of the clipboard.
Definition embedder.h:159
@ kFlutterSemanticsActionCut
Cut the current selection and place it in the clipboard.
Definition embedder.h:157
@ kFlutterSemanticsActionCustomAction
Indicate that the user has invoked a custom accessibility action.
Definition embedder.h:165
@ kFlutterSemanticsActionCopy
Copy the current selection to the clipboard.
Definition embedder.h:155

References FlutterSendSemanticsActionInfo::action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, decode_semantic_data(), engine, fl_accessible_text_field_new(), fl_engine_get_embedder_api(), fl_value_get_int(), fl_value_get_type(), fl_value_lookup_string(), FL_VALUE_TYPE_MAP, g_autoptr(), kFlutterSemanticsActionCopy, kFlutterSemanticsActionCustomAction, kFlutterSemanticsActionCut, kFlutterSemanticsActionPaste, kFlutterSemanticsActionSetSelection, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendSemanticsAction, and value.

◆ TEST_F() [3/22]

TEST_F ( FlAccessibleTextFieldTest  ,
GetCaretOffset   
)

Definition at line 237 of file fl_accessible_text_field_test.cc.

237 {
238 g_autoptr(FlAccessibleNode) node =
240
241 EXPECT_EQ(atk_text_get_caret_offset(ATK_TEXT(node)), -1);
242
244
245 EXPECT_EQ(atk_text_get_caret_offset(ATK_TEXT(node)), 2);
246}

References engine, fl_accessible_node_set_text_selection(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [4/22]

TEST_F ( FlAccessibleTextFieldTest  ,
GetCharacterCount   
)

Definition at line 180 of file fl_accessible_text_field_test.cc.

180 {
181 g_autoptr(FlAccessibleNode) node =
183
184 EXPECT_EQ(atk_text_get_character_count(ATK_TEXT(node)), 0);
185
186 fl_accessible_node_set_value(node, "Flutter!");
187
188 EXPECT_EQ(atk_text_get_character_count(ATK_TEXT(node)), 8);
189}
void fl_accessible_node_set_value(FlAccessibleNode *self, const gchar *value)

References engine, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [5/22]

TEST_F ( FlAccessibleTextFieldTest  ,
GetNSelections   
)

Definition at line 277 of file fl_accessible_text_field_test.cc.

277 {
278 g_autoptr(FlAccessibleNode) node =
280
281 EXPECT_EQ(atk_text_get_n_selections(ATK_TEXT(node)), 0);
282
284
285 EXPECT_EQ(atk_text_get_n_selections(ATK_TEXT(node)), 1);
286}

References engine, fl_accessible_node_set_text_selection(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [6/22]

TEST_F ( FlAccessibleTextFieldTest  ,
GetSelection   
)

Definition at line 289 of file fl_accessible_text_field_test.cc.

289 {
290 g_autoptr(FlAccessibleNode) node =
292
293 EXPECT_EQ(atk_text_get_selection(ATK_TEXT(node), 0, nullptr, nullptr),
294 nullptr);
295
296 fl_accessible_node_set_value(node, "Flutter");
298
299 gint start, end;
300 g_autofree gchar* selection =
301 atk_text_get_selection(ATK_TEXT(node), 0, &start, &end);
302 EXPECT_STREQ(selection, "utt");
303 EXPECT_EQ(start, 2);
304 EXPECT_EQ(end, 5);
305
306 // reverse
308 g_autofree gchar* reverse =
309 atk_text_get_selection(ATK_TEXT(node), 0, &start, &end);
310 EXPECT_STREQ(reverse, "utt");
311 EXPECT_EQ(start, 2);
312 EXPECT_EQ(end, 5);
313
314 // empty
316 EXPECT_EQ(atk_text_get_selection(ATK_TEXT(node), 0, &start, &end), nullptr);
317
318 // selection num != 0
319 EXPECT_EQ(atk_text_get_selection(ATK_TEXT(node), 1, &start, &end), nullptr);
320}
const size_t start
const size_t end

References end, engine, fl_accessible_node_set_text_selection(), fl_accessible_node_set_value(), fl_accessible_text_field_new(), g_autoptr(), and start.

◆ TEST_F() [7/22]

TEST_F ( FlAccessibleTextFieldTest  ,
GetText   
)

Definition at line 192 of file fl_accessible_text_field_test.cc.

192 {
193 g_autoptr(FlAccessibleNode) node =
195
196 g_autofree gchar* empty = atk_text_get_text(ATK_TEXT(node), 0, -1);
197 EXPECT_STREQ(empty, "");
198
199 flutter::testing::MockSignalHandler text_inserted(node, "text-insert");
200 EXPECT_SIGNAL(text_inserted).Times(1);
201
202 fl_accessible_node_set_value(node, "Flutter!");
203
204 g_autofree gchar* flutter = atk_text_get_text(ATK_TEXT(node), 0, -1);
205 EXPECT_STREQ(flutter, "Flutter!");
206
207 g_autofree gchar* tt = atk_text_get_text(ATK_TEXT(node), 3, 5);
208 EXPECT_STREQ(tt, "tt");
209}
#define EXPECT_SIGNAL(mock)

References engine, EXPECT_SIGNAL, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [8/22]

TEST_F ( FlAccessibleTextFieldTest  ,
GetTextBoundsChecking   
)

Definition at line 212 of file fl_accessible_text_field_test.cc.

212 {
213 g_autoptr(FlAccessibleNode) node =
215
216 fl_accessible_node_set_value(node, "Hello");
217
218 // start beyond end of text
219 g_autofree gchar* beyond = atk_text_get_text(ATK_TEXT(node), 100, -1);
220 EXPECT_STREQ(beyond, "");
221
222 // end beyond text length
223 g_autofree gchar* end_beyond = atk_text_get_text(ATK_TEXT(node), 2, 100);
224 EXPECT_STREQ(end_beyond, "llo");
225
226 // both beyond text length
227 g_autofree gchar* both_beyond = atk_text_get_text(ATK_TEXT(node), 50, 100);
228 EXPECT_STREQ(both_beyond, "");
229
230 // empty buffer
232 g_autofree gchar* empty_beyond = atk_text_get_text(ATK_TEXT(node), 5, 10);
233 EXPECT_STREQ(empty_beyond, "");
234}

References engine, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [9/22]

TEST_F ( FlAccessibleTextFieldTest  ,
InsertDeleteText   
)

Definition at line 460 of file fl_accessible_text_field_test.cc.

460 {
461 g_autofree gchar* text = nullptr;
462 int base = -1;
463 int extent = -1;
464
465 StartEngine();
466
468 SendSemanticsAction,
469 ([&text, &base, &extent](auto engine,
470 const FlutterSendSemanticsActionInfo* info) {
471 EXPECT_THAT(info->action,
472 ::testing::AnyOf(kFlutterSemanticsActionSetText,
477 EXPECT_EQ(fl_value_get_type(value), FL_VALUE_TYPE_STRING);
478 g_free(text);
479 text = g_strdup(fl_value_get_string(value));
480 } else {
483 EXPECT_EQ(fl_value_get_type(value), FL_VALUE_TYPE_MAP);
485 extent = fl_value_get_int(fl_value_lookup_string(value, "extent"));
486 }
487 return kSuccess;
488 }));
489
490 g_autoptr(FlAccessibleNode) node =
492 fl_accessible_node_set_value(node, "Fler");
493
494 gint pos = 2;
495 atk_editable_text_insert_text(ATK_EDITABLE_TEXT(node), "utt", 3, &pos);
496 EXPECT_EQ(pos, 5);
497 EXPECT_STREQ(text, "Flutter");
498 EXPECT_EQ(base, pos);
499 EXPECT_EQ(extent, pos);
500
501 atk_editable_text_delete_text(ATK_EDITABLE_TEXT(node), 2, 5);
502 EXPECT_STREQ(text, "Fler");
503 EXPECT_EQ(base, 2);
504 EXPECT_EQ(extent, 2);
505}
@ kFlutterSemanticsActionSetText
Replace the current text in the text field.
Definition embedder.h:173
G_MODULE_EXPORT const gchar * fl_value_get_string(FlValue *self)
Definition fl_value.cc:682
@ FL_VALUE_TYPE_STRING
Definition fl_value.h:68
std::u16string text

References FlutterSendSemanticsActionInfo::action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, decode_semantic_data(), engine, fl_accessible_node_set_value(), fl_accessible_text_field_new(), fl_engine_get_embedder_api(), fl_value_get_int(), fl_value_get_string(), fl_value_get_type(), fl_value_lookup_string(), FL_VALUE_TYPE_MAP, FL_VALUE_TYPE_STRING, g_autoptr(), kFlutterSemanticsActionSetSelection, kFlutterSemanticsActionSetText, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendSemanticsAction, text, and value.

◆ TEST_F() [10/22]

TEST_F ( FlAccessibleTextFieldTest  ,
PerformAction   
)

Definition at line 144 of file fl_accessible_text_field_test.cc.

144 {
145 g_autoptr(GPtrArray) action_datas = g_ptr_array_new_with_free_func(
146 reinterpret_cast<GDestroyNotify>(fl_value_unref));
147
148 StartEngine();
149
151 SendSemanticsAction,
152 ([&action_datas](auto engine,
153 const FlutterSendSemanticsActionInfo* info) {
154 g_ptr_array_add(action_datas,
156 return kSuccess;
157 }));
158
159 g_autoptr(FlAccessibleNode) node =
162 node, static_cast<FlutterSemanticsAction>(
167
168 g_autoptr(FlValue) expand_selection = fl_value_new_bool(false);
169
170 for (int i = 0; i < 4; ++i) {
171 atk_action_do_action(ATK_ACTION(node), i);
172
173 FlValue* data = static_cast<FlValue*>(g_ptr_array_index(action_datas, i));
174 EXPECT_NE(data, nullptr);
175 EXPECT_TRUE(fl_value_equal(data, expand_selection));
176 }
177}
@ kFlutterSemanticsActionMoveCursorForwardByCharacter
Move the cursor forward by one character.
Definition embedder.h:149
@ kFlutterSemanticsActionMoveCursorBackwardByCharacter
Move the cursor backward by one character.
Definition embedder.h:151
@ kFlutterSemanticsActionMoveCursorForwardByWord
Move the cursor forward by one word.
Definition embedder.h:169
@ kFlutterSemanticsActionMoveCursorBackwardByWord
Move the cursor backward by one word.
Definition embedder.h:171
void fl_accessible_node_set_actions(FlAccessibleNode *self, FlutterSemanticsAction actions)
G_MODULE_EXPORT void fl_value_unref(FlValue *self)
Definition fl_value.cc:400
G_MODULE_EXPORT FlValue * fl_value_new_bool(bool value)
Definition fl_value.cc:255
G_MODULE_EXPORT bool fl_value_equal(FlValue *a, FlValue *b)
Definition fl_value.cc:471
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switch_defs.h:36

References FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, decode_semantic_data(), engine, fl_accessible_node_set_actions(), fl_accessible_text_field_new(), fl_engine_get_embedder_api(), fl_value_equal(), fl_value_new_bool(), fl_value_unref(), g_autoptr(), i, kFlutterSemanticsActionMoveCursorBackwardByCharacter, kFlutterSemanticsActionMoveCursorBackwardByWord, kFlutterSemanticsActionMoveCursorForwardByCharacter, kFlutterSemanticsActionMoveCursorForwardByWord, kSuccess, MOCK_ENGINE_PROC, and FlutterEngineProcTable::SendSemanticsAction.

◆ TEST_F() [11/22]

TEST_F ( FlAccessibleTextFieldTest  ,
RemoveSelection   
)

Definition at line 358 of file fl_accessible_text_field_test.cc.

358 {
359 int base = -1;
360 int extent = -1;
361
362 StartEngine();
363
365 SendSemanticsAction,
366 ([&base, &extent](auto engine,
367 const FlutterSendSemanticsActionInfo* info) {
371 EXPECT_EQ(fl_value_get_type(value), FL_VALUE_TYPE_MAP);
373 extent = fl_value_get_int(fl_value_lookup_string(value, "extent"));
374 return kSuccess;
375 }));
376
377 g_autoptr(FlAccessibleNode) node =
379
380 // no selection
381 EXPECT_FALSE(atk_text_remove_selection(ATK_TEXT(node), 0));
382 EXPECT_EQ(base, -1);
383 EXPECT_EQ(extent, -1);
384
386
387 // selection num != 0
388 EXPECT_FALSE(atk_text_remove_selection(ATK_TEXT(node), 1));
389 EXPECT_EQ(base, -1);
390 EXPECT_EQ(extent, -1);
391
392 // ok, collapses selection
393 EXPECT_TRUE(atk_text_remove_selection(ATK_TEXT(node), 0));
394 EXPECT_EQ(base, 4);
395 EXPECT_EQ(extent, 4);
396}

References FlutterSendSemanticsActionInfo::action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, decode_semantic_data(), engine, fl_accessible_node_set_text_selection(), fl_accessible_text_field_new(), fl_engine_get_embedder_api(), fl_value_get_int(), fl_value_get_type(), fl_value_lookup_string(), FL_VALUE_TYPE_MAP, g_autoptr(), kFlutterSemanticsActionSetSelection, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendSemanticsAction, and value.

◆ TEST_F() [12/22]

TEST_F ( FlAccessibleTextFieldTest  ,
SetCaretOffset   
)

Definition at line 249 of file fl_accessible_text_field_test.cc.

249 {
250 int base = -1;
251 int extent = -1;
252
253 StartEngine();
254
256 SendSemanticsAction,
257 ([&base, &extent](auto engine,
258 const FlutterSendSemanticsActionInfo* info) {
262 EXPECT_EQ(fl_value_get_type(value), FL_VALUE_TYPE_MAP);
264 extent = fl_value_get_int(fl_value_lookup_string(value, "extent"));
265 return kSuccess;
266 }));
267
268 g_autoptr(FlAccessibleNode) node =
270
271 EXPECT_TRUE(atk_text_set_caret_offset(ATK_TEXT(node), 3));
272 EXPECT_EQ(base, 3);
273 EXPECT_EQ(extent, 3);
274}

References FlutterSendSemanticsActionInfo::action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, decode_semantic_data(), engine, fl_accessible_text_field_new(), fl_engine_get_embedder_api(), fl_value_get_int(), fl_value_get_type(), fl_value_lookup_string(), FL_VALUE_TYPE_MAP, g_autoptr(), kFlutterSemanticsActionSetSelection, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendSemanticsAction, and value.

◆ TEST_F() [13/22]

TEST_F ( FlAccessibleTextFieldTest  ,
SetSelection   
)

Definition at line 399 of file fl_accessible_text_field_test.cc.

399 {
400 int base = -1;
401 int extent = -1;
402
403 StartEngine();
404
406 SendSemanticsAction,
407 ([&base, &extent](auto engine,
408 const FlutterSendSemanticsActionInfo* info) {
412 EXPECT_EQ(fl_value_get_type(value), FL_VALUE_TYPE_MAP);
414 extent = fl_value_get_int(fl_value_lookup_string(value, "extent"));
415 return kSuccess;
416 }));
417
418 g_autoptr(FlAccessibleNode) node =
420
421 // selection num != 0
422 EXPECT_FALSE(atk_text_set_selection(ATK_TEXT(node), 1, 2, 4));
423 EXPECT_EQ(base, -1);
424 EXPECT_EQ(extent, -1);
425
426 EXPECT_TRUE(atk_text_set_selection(ATK_TEXT(node), 0, 2, 4));
427 EXPECT_EQ(base, 2);
428 EXPECT_EQ(extent, 4);
429
430 EXPECT_TRUE(atk_text_set_selection(ATK_TEXT(node), 0, 5, 1));
431 EXPECT_EQ(base, 5);
432 EXPECT_EQ(extent, 1);
433}

References FlutterSendSemanticsActionInfo::action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, decode_semantic_data(), engine, fl_accessible_text_field_new(), fl_engine_get_embedder_api(), fl_value_get_int(), fl_value_get_type(), fl_value_lookup_string(), FL_VALUE_TYPE_MAP, g_autoptr(), kFlutterSemanticsActionSetSelection, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendSemanticsAction, and value.

◆ TEST_F() [14/22]

TEST_F ( FlAccessibleTextFieldTest  ,
SetTextContents   
)

Definition at line 436 of file fl_accessible_text_field_test.cc.

436 {
437 g_autofree gchar* text = nullptr;
438
439 StartEngine();
440
442 SendSemanticsAction,
443 ([&text](auto engine, const FlutterSendSemanticsActionInfo* info) {
444 EXPECT_EQ(info->action, kFlutterSemanticsActionSetText);
447 EXPECT_EQ(fl_value_get_type(value), FL_VALUE_TYPE_STRING);
448 text = g_strdup(fl_value_get_string(value));
449 return kSuccess;
450 }));
451
452 g_autoptr(FlAccessibleNode) node =
454
455 atk_editable_text_set_text_contents(ATK_EDITABLE_TEXT(node), "Flutter");
456 EXPECT_STREQ(text, "Flutter");
457}

References FlutterSendSemanticsActionInfo::action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, decode_semantic_data(), engine, fl_accessible_text_field_new(), fl_engine_get_embedder_api(), fl_value_get_string(), fl_value_get_type(), FL_VALUE_TYPE_STRING, g_autoptr(), kFlutterSemanticsActionSetText, kSuccess, MOCK_ENGINE_PROC, FlutterEngineProcTable::SendSemanticsAction, text, and value.

◆ TEST_F() [15/22]

TEST_F ( FlAccessibleTextFieldTest  ,
SetTextSelection   
)

Definition at line 85 of file fl_accessible_text_field_test.cc.

85 {
86 g_autoptr(FlAccessibleNode) node =
88
89 // [-1,-1] -> [2,3]
90 {
91 flutter::testing::MockSignalHandler text_selection_changed(
92 node, "text-selection-changed");
94 node, "text-caret-moved");
95
96 EXPECT_SIGNAL(text_selection_changed);
97 EXPECT_SIGNAL1(text_caret_moved, ::testing::Eq(3));
98
100 }
101
102 // [2,3] -> [3,3]
103 {
104 flutter::testing::MockSignalHandler text_selection_changed(
105 node, "text-selection-changed");
106 flutter::testing::MockSignalHandler text_caret_moved(node,
107 "text-caret-moved");
108
109 EXPECT_SIGNAL(text_selection_changed);
110 EXPECT_SIGNAL(text_caret_moved).Times(0);
111
113 }
114
115 // [3,3] -> [3,3]
116 {
117 flutter::testing::MockSignalHandler text_selection_changed(
118 node, "text-selection-changed");
119 flutter::testing::MockSignalHandler text_caret_moved(node,
120 "text-caret-moved");
121
122 EXPECT_SIGNAL(text_selection_changed).Times(0);
123 EXPECT_SIGNAL(text_caret_moved).Times(0);
124
126 }
127
128 // [3,3] -> [4,4]
129 {
130 flutter::testing::MockSignalHandler text_selection_changed(
131 node, "text-selection-changed");
133 node, "text-caret-moved");
134
135 EXPECT_SIGNAL(text_selection_changed).Times(0);
136 EXPECT_SIGNAL1(text_caret_moved, ::testing::Eq(4));
137
139 }
140}
#define EXPECT_SIGNAL1(mock, a1)

References engine, EXPECT_SIGNAL, EXPECT_SIGNAL1, fl_accessible_node_set_text_selection(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [16/22]

TEST_F ( FlAccessibleTextFieldTest  ,
SetValue   
)

Definition at line 29 of file fl_accessible_text_field_test.cc.

29 {
30 g_autoptr(FlAccessibleNode) node =
32
33 // "" -> "Flutter"
34 {
36 "text-insert");
37 flutter::testing::MockSignalHandler text_removed(node, "text-remove");
38
39 EXPECT_SIGNAL2(text_inserted, ::testing::Eq(0), ::testing::Eq(7));
40 EXPECT_SIGNAL(text_removed).Times(0);
41
42 fl_accessible_node_set_value(node, "Flutter");
43 }
44
45 // "Flutter" -> "Flutter"
46 {
47 flutter::testing::MockSignalHandler text_inserted(node, "text-insert");
48 flutter::testing::MockSignalHandler text_removed(node, "text-remove");
49
50 EXPECT_SIGNAL(text_inserted).Times(0);
51 EXPECT_SIGNAL(text_removed).Times(0);
52
53 fl_accessible_node_set_value(node, "Flutter");
54 }
55
56 // "Flutter" -> "engine"
57 {
59 "text-insert");
61 "text-remove");
62
63 EXPECT_SIGNAL2(text_inserted, ::testing::Eq(0), ::testing::Eq(6));
64 EXPECT_SIGNAL2(text_removed, ::testing::Eq(0), ::testing::Eq(7));
65
66 fl_accessible_node_set_value(node, "engine");
67 }
68
69 // "engine" -> ""
70 {
71 flutter::testing::MockSignalHandler text_inserted(node, "text-insert");
73 "text-remove");
74
75 EXPECT_SIGNAL(text_inserted).Times(0);
76 EXPECT_SIGNAL2(text_removed, ::testing::Eq(0), ::testing::Eq(6));
77
79 }
80}
#define EXPECT_SIGNAL2(mock, a1, a2)

References engine, EXPECT_SIGNAL, EXPECT_SIGNAL2, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [17/22]

TEST_F ( FlAccessibleTextFieldTest  ,
TextBoundary   
)

Definition at line 554 of file fl_accessible_text_field_test.cc.

554 {
555 g_autoptr(FlAccessibleNode) node =
557
559 "Lorem ipsum.\nDolor sit amet. Praesent commodo?"
560 "\n\nPraesent et felis dui.");
561
562 // |Lorem
563 gint start_offset = -1, end_offset = -1;
564 g_autofree gchar* lorem_char = atk_text_get_string_at_offset(
565 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_CHAR, &start_offset, &end_offset);
566 EXPECT_STREQ(lorem_char, "L");
567 EXPECT_EQ(start_offset, 0);
568 EXPECT_EQ(end_offset, 1);
569
570 g_autofree gchar* lorem_word = atk_text_get_string_at_offset(
571 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_WORD, &start_offset, &end_offset);
572 EXPECT_STREQ(lorem_word, "Lorem");
573 EXPECT_EQ(start_offset, 0);
574 EXPECT_EQ(end_offset, 5);
575
576 g_autofree gchar* lorem_sentence = atk_text_get_string_at_offset(
577 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_SENTENCE, &start_offset,
578 &end_offset);
579 EXPECT_STREQ(lorem_sentence, "Lorem ipsum.");
580 EXPECT_EQ(start_offset, 0);
581 EXPECT_EQ(end_offset, 12);
582
583 g_autofree gchar* lorem_line = atk_text_get_string_at_offset(
584 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_LINE, &start_offset, &end_offset);
585 EXPECT_STREQ(lorem_line, "Lorem ipsum.");
586 EXPECT_EQ(start_offset, 0);
587 EXPECT_EQ(end_offset, 12);
588
589 g_autofree gchar* lorem_paragraph = atk_text_get_string_at_offset(
590 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_PARAGRAPH, &start_offset,
591 &end_offset);
592 EXPECT_STREQ(lorem_paragraph,
593 "Lorem ipsum.\nDolor sit amet. Praesent commodo?");
594 EXPECT_EQ(start_offset, 0);
595 EXPECT_EQ(end_offset, 46);
596
597 // Pra|esent
598 g_autofree gchar* praesent_char = atk_text_get_string_at_offset(
599 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_CHAR, &start_offset,
600 &end_offset);
601 EXPECT_STREQ(praesent_char, "e");
602 EXPECT_EQ(start_offset, 32);
603 EXPECT_EQ(end_offset, 33);
604
605 g_autofree gchar* praesent_word = atk_text_get_string_at_offset(
606 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_WORD, &start_offset,
607 &end_offset);
608 EXPECT_STREQ(praesent_word, "Praesent");
609 EXPECT_EQ(start_offset, 29);
610 EXPECT_EQ(end_offset, 37);
611
612 g_autofree gchar* praesent_sentence = atk_text_get_string_at_offset(
613 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_SENTENCE, &start_offset,
614 &end_offset);
615 EXPECT_STREQ(praesent_sentence, "Praesent commodo?");
616 EXPECT_EQ(start_offset, 29);
617 EXPECT_EQ(end_offset, 46);
618
619 g_autofree gchar* praesent_line = atk_text_get_string_at_offset(
620 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_LINE, &start_offset,
621 &end_offset);
622 EXPECT_STREQ(praesent_line, "Dolor sit amet. Praesent commodo?");
623 EXPECT_EQ(start_offset, 13);
624 EXPECT_EQ(end_offset, 46);
625
626 g_autofree gchar* praesent_paragraph = atk_text_get_string_at_offset(
627 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_PARAGRAPH, &start_offset,
628 &end_offset);
629 EXPECT_STREQ(praesent_paragraph,
630 "Lorem ipsum.\nDolor sit amet. Praesent commodo?");
631 EXPECT_EQ(start_offset, 0);
632 EXPECT_EQ(end_offset, 46);
633
634 // feli|s
635 g_autofree gchar* felis_char = atk_text_get_string_at_offset(
636 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_CHAR, &start_offset,
637 &end_offset);
638 EXPECT_STREQ(felis_char, "s");
639 EXPECT_EQ(start_offset, 64);
640 EXPECT_EQ(end_offset, 65);
641
642 g_autofree gchar* felis_word = atk_text_get_string_at_offset(
643 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_WORD, &start_offset,
644 &end_offset);
645 EXPECT_STREQ(felis_word, "felis");
646 EXPECT_EQ(start_offset, 60);
647 EXPECT_EQ(end_offset, 65);
648
649 g_autofree gchar* felis_sentence = atk_text_get_string_at_offset(
650 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_SENTENCE, &start_offset,
651 &end_offset);
652 EXPECT_STREQ(felis_sentence, "Praesent et felis dui.");
653 EXPECT_EQ(start_offset, 48);
654 EXPECT_EQ(end_offset, 70);
655
656 g_autofree gchar* felis_line = atk_text_get_string_at_offset(
657 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_LINE, &start_offset,
658 &end_offset);
659 EXPECT_STREQ(felis_line, "Praesent et felis dui.");
660 EXPECT_EQ(start_offset, 48);
661 EXPECT_EQ(end_offset, 70);
662
663 g_autofree gchar* felis_paragraph = atk_text_get_string_at_offset(
664 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_PARAGRAPH, &start_offset,
665 &end_offset);
666 EXPECT_STREQ(felis_paragraph, "\nPraesent et felis dui.");
667 EXPECT_EQ(start_offset, 47);
668 EXPECT_EQ(end_offset, 70);
669}

References engine, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [18/22]

TEST_F ( FlAccessibleTextFieldTest  ,
TextBoundaryEmptyText   
)

Definition at line 728 of file fl_accessible_text_field_test.cc.

728 {
729 g_autoptr(FlAccessibleNode) node =
731
732 // Empty text - should not crash.
733 gint start_offset = -1, end_offset = -1;
734 g_autofree gchar* char_result = atk_text_get_string_at_offset(
735 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_CHAR, &start_offset, &end_offset);
736 EXPECT_NE(char_result, nullptr);
737 EXPECT_EQ(start_offset, 0);
738 EXPECT_STREQ(char_result, "");
739
740 g_autofree gchar* word_result = atk_text_get_string_at_offset(
741 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_WORD, &start_offset, &end_offset);
742 EXPECT_NE(word_result, nullptr);
743 EXPECT_EQ(start_offset, 0);
744 EXPECT_STREQ(word_result, "");
745}

References engine, fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [19/22]

TEST_F ( FlAccessibleTextFieldTest  ,
TextBoundaryMultiByte   
)

Definition at line 776 of file fl_accessible_text_field_test.cc.

776 {
777 g_autoptr(FlAccessibleNode) node =
779
780 // "Café" is 4 characters but 5 bytes (é is 2 bytes).
781 // "Münch" is 5 characters but 6 bytes (ü is 2 bytes).
782 // Character offsets: C(0) a(1) f(2) é(3) \n(4) M(5) ü(6) n(7) c(8) h(9)
783 fl_accessible_node_set_value(node, "Café\nMünch");
784
785 // The field has 10 characters.
786 EXPECT_EQ(atk_text_get_character_count(ATK_TEXT(node)), 10);
787
788 // First line: "Café" at character offsets [0, 4).
789 gint start_offset = -1, end_offset = -1;
790 g_autofree gchar* line0 = atk_text_get_string_at_offset(
791 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_LINE, &start_offset, &end_offset);
792 EXPECT_STREQ(line0, "Café");
793 EXPECT_EQ(start_offset, 0);
794 EXPECT_EQ(end_offset, 4);
795
796 // Second line: "Münch" at character offsets [5, 10). Query at offset 6
797 // (the 'ü'), which sits in the middle of a multi-byte sequence in byte
798 // space - the buggy byte-based logic would return the wrong substring here.
799 g_autofree gchar* line1 = atk_text_get_string_at_offset(
800 ATK_TEXT(node), 6, ATK_TEXT_GRANULARITY_LINE, &start_offset, &end_offset);
801 EXPECT_STREQ(line1, "Münch");
802 EXPECT_EQ(start_offset, 5);
803 EXPECT_EQ(end_offset, 10);
804
805 // Whole text is a single paragraph spanning both lines.
806 g_autofree gchar* paragraph = atk_text_get_string_at_offset(
807 ATK_TEXT(node), 6, ATK_TEXT_GRANULARITY_PARAGRAPH, &start_offset,
808 &end_offset);
809 EXPECT_STREQ(paragraph, "Café\nMünch");
810 EXPECT_EQ(start_offset, 0);
811 EXPECT_EQ(end_offset, 10);
812}

References engine, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [20/22]

TEST_F ( FlAccessibleTextFieldTest  ,
TextBoundaryOffsetAtEnd   
)

Definition at line 748 of file fl_accessible_text_field_test.cc.

748 {
749 g_autoptr(FlAccessibleNode) node =
751
752 fl_accessible_node_set_value(node, "Hello world");
753
754 // Offset at exactly the character count (one past last char).
755 gint char_count = atk_text_get_character_count(ATK_TEXT(node));
756 EXPECT_EQ(char_count, 11);
757
758 gint start_offset = -1, end_offset = -1;
759 g_autofree gchar* char_result = atk_text_get_string_at_offset(
760 ATK_TEXT(node), char_count, ATK_TEXT_GRANULARITY_CHAR, &start_offset,
761 &end_offset);
762 EXPECT_NE(char_result, nullptr);
763 EXPECT_GE(start_offset, 0);
764 EXPECT_LE(end_offset, char_count);
765
766 g_autofree gchar* word_result = atk_text_get_string_at_offset(
767 ATK_TEXT(node), char_count, ATK_TEXT_GRANULARITY_WORD, &start_offset,
768 &end_offset);
769 EXPECT_NE(word_result, nullptr);
770 EXPECT_GE(start_offset, 0);
771 EXPECT_LE(end_offset, char_count);
772}

References engine, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [21/22]

TEST_F ( FlAccessibleTextFieldTest  ,
TextBoundaryOffsetAtStart   
)

Definition at line 704 of file fl_accessible_text_field_test.cc.

704 {
705 g_autoptr(FlAccessibleNode) node =
707
708 fl_accessible_node_set_value(node, "Hello");
709
710 // Offset at zero should return the first character/word.
711 gint start_offset = -1, end_offset = -1;
712 g_autofree gchar* char_result = atk_text_get_string_at_offset(
713 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_CHAR, &start_offset, &end_offset);
714 EXPECT_NE(char_result, nullptr);
715 EXPECT_EQ(start_offset, 0);
716 EXPECT_EQ(end_offset, 1);
717 EXPECT_STREQ(char_result, "H");
718
719 g_autofree gchar* word_result = atk_text_get_string_at_offset(
720 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_WORD, &start_offset, &end_offset);
721 EXPECT_NE(word_result, nullptr);
722 EXPECT_EQ(start_offset, 0);
723 EXPECT_EQ(end_offset, 5);
724 EXPECT_STREQ(word_result, "Hello");
725}

References engine, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().

◆ TEST_F() [22/22]

TEST_F ( FlAccessibleTextFieldTest  ,
TextBoundaryOffsetBeyondEnd   
)

Definition at line 672 of file fl_accessible_text_field_test.cc.

672 {
673 g_autoptr(FlAccessibleNode) node =
675
676 fl_accessible_node_set_value(node, "Hello");
677
678 // Offset well beyond the text length should not crash and should return
679 // a valid result clamped to the text boundaries.
680 gint start_offset = -1, end_offset = -1;
681 g_autofree gchar* char_result = atk_text_get_string_at_offset(
682 ATK_TEXT(node), 100, ATK_TEXT_GRANULARITY_CHAR, &start_offset,
683 &end_offset);
684 EXPECT_NE(char_result, nullptr);
685 EXPECT_GE(start_offset, 0);
686 EXPECT_LE(end_offset, 5);
687
688 g_autofree gchar* word_result = atk_text_get_string_at_offset(
689 ATK_TEXT(node), 100, ATK_TEXT_GRANULARITY_WORD, &start_offset,
690 &end_offset);
691 EXPECT_NE(word_result, nullptr);
692 EXPECT_GE(start_offset, 0);
693 EXPECT_LE(end_offset, 5);
694
695 g_autofree gchar* sentence_result = atk_text_get_string_at_offset(
696 ATK_TEXT(node), 100, ATK_TEXT_GRANULARITY_SENTENCE, &start_offset,
697 &end_offset);
698 EXPECT_NE(sentence_result, nullptr);
699 EXPECT_GE(start_offset, 0);
700 EXPECT_LE(end_offset, 5);
701}

References engine, fl_accessible_node_set_value(), fl_accessible_text_field_new(), and g_autoptr().