6 #include "gtest/gtest.h"
8 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
12 #include "flutter/shell/platform/linux/testing/mock_signal_handler.h"
18 g_autoptr(GBytes) bytes = g_bytes_new(data, data_length);
26 TEST(FlAccessibleTextFieldTest, SetValue) {
33 flutter::testing::MockSignalHandler2<int, int> text_inserted(node,
35 flutter::testing::MockSignalHandler text_removed(node,
"text-remove");
37 EXPECT_SIGNAL2(text_inserted, ::testing::Eq(0), ::testing::Eq(7));
38 EXPECT_SIGNAL(text_removed).Times(0);
45 flutter::testing::MockSignalHandler text_inserted(node,
"text-insert");
46 flutter::testing::MockSignalHandler text_removed(node,
"text-remove");
48 EXPECT_SIGNAL(text_inserted).Times(0);
49 EXPECT_SIGNAL(text_removed).Times(0);
56 flutter::testing::MockSignalHandler2<int, int> text_inserted(node,
58 flutter::testing::MockSignalHandler2<int, int> text_removed(node,
61 EXPECT_SIGNAL2(text_inserted, ::testing::Eq(0), ::testing::Eq(6));
62 EXPECT_SIGNAL2(text_removed, ::testing::Eq(0), ::testing::Eq(7));
69 flutter::testing::MockSignalHandler text_inserted(node,
"text-insert");
70 flutter::testing::MockSignalHandler2<int, int> text_removed(node,
73 EXPECT_SIGNAL(text_inserted).Times(0);
74 EXPECT_SIGNAL2(text_removed, ::testing::Eq(0), ::testing::Eq(6));
83 TEST(FlAccessibleTextFieldTest, SetTextSelection) {
90 flutter::testing::MockSignalHandler text_selection_changed(
91 node,
"text-selection-changed");
92 flutter::testing::MockSignalHandler1<int> text_caret_moved(
93 node,
"text-caret-moved");
95 EXPECT_SIGNAL(text_selection_changed);
96 EXPECT_SIGNAL1(text_caret_moved, ::testing::Eq(3));
103 flutter::testing::MockSignalHandler text_selection_changed(
104 node,
"text-selection-changed");
105 flutter::testing::MockSignalHandler text_caret_moved(node,
108 EXPECT_SIGNAL(text_selection_changed);
109 EXPECT_SIGNAL(text_caret_moved).Times(0);
116 flutter::testing::MockSignalHandler text_selection_changed(
117 node,
"text-selection-changed");
118 flutter::testing::MockSignalHandler text_caret_moved(node,
121 EXPECT_SIGNAL(text_selection_changed).Times(0);
122 EXPECT_SIGNAL(text_caret_moved).Times(0);
129 flutter::testing::MockSignalHandler text_selection_changed(
130 node,
"text-selection-changed");
131 flutter::testing::MockSignalHandler1<int> text_caret_moved(
132 node,
"text-caret-moved");
134 EXPECT_SIGNAL(text_selection_changed).Times(0);
135 EXPECT_SIGNAL1(text_caret_moved, ::testing::Eq(4));
143 TEST(FlAccessibleTextFieldTest, PerformAction) {
144 g_autoptr(GPtrArray) action_datas = g_ptr_array_new_with_free_func(
150 g_autoptr(GError)
error =
nullptr;
152 EXPECT_EQ(
error,
nullptr);
156 DispatchSemanticsAction,
157 ([&action_datas](
auto engine, uint64_t
id,
158 FlutterSemanticsAction action,
const uint8_t* data,
159 size_t data_length) {
160 g_ptr_array_add(action_datas,
167 node,
static_cast<FlutterSemanticsAction
>(
168 kFlutterSemanticsActionMoveCursorForwardByCharacter |
169 kFlutterSemanticsActionMoveCursorBackwardByCharacter |
170 kFlutterSemanticsActionMoveCursorForwardByWord |
171 kFlutterSemanticsActionMoveCursorBackwardByWord));
175 for (
int i = 0;
i < 4; ++
i) {
176 atk_action_do_action(ATK_ACTION(node),
i);
178 FlValue* data =
static_cast<FlValue*
>(g_ptr_array_index(action_datas,
i));
179 EXPECT_NE(data,
nullptr);
185 TEST(FlAccessibleTextFieldTest, GetCharacterCount) {
190 EXPECT_EQ(atk_text_get_character_count(ATK_TEXT(node)), 0);
194 EXPECT_EQ(atk_text_get_character_count(ATK_TEXT(node)), 8);
198 TEST(FlAccessibleTextFieldTest, GetText) {
203 g_autofree gchar* empty = atk_text_get_text(ATK_TEXT(node), 0, -1);
204 EXPECT_STREQ(empty,
"");
206 flutter::testing::MockSignalHandler text_inserted(node,
"text-insert");
207 EXPECT_SIGNAL(text_inserted).Times(1);
211 g_autofree gchar*
flutter = atk_text_get_text(ATK_TEXT(node), 0, -1);
212 EXPECT_STREQ(
flutter,
"Flutter!");
214 g_autofree gchar* tt = atk_text_get_text(ATK_TEXT(node), 3, 5);
215 EXPECT_STREQ(tt,
"tt");
219 TEST(FlAccessibleTextFieldTest, GetCaretOffset) {
224 EXPECT_EQ(atk_text_get_caret_offset(ATK_TEXT(node)), -1);
228 EXPECT_EQ(atk_text_get_caret_offset(ATK_TEXT(node)), 2);
232 TEST(FlAccessibleTextFieldTest, SetCaretOffset) {
239 g_autoptr(GError)
error =
nullptr;
241 EXPECT_EQ(
error,
nullptr);
245 DispatchSemanticsAction,
246 ([&base, &extent](
auto engine, uint64_t
id,
247 FlutterSemanticsAction action,
const uint8_t* data,
248 size_t data_length) {
249 EXPECT_EQ(action, kFlutterSemanticsActionSetSelection);
259 EXPECT_TRUE(atk_text_set_caret_offset(ATK_TEXT(node), 3));
261 EXPECT_EQ(extent, 3);
265 TEST(FlAccessibleTextFieldTest, GetNSelections) {
270 EXPECT_EQ(atk_text_get_n_selections(ATK_TEXT(node)), 0);
274 EXPECT_EQ(atk_text_get_n_selections(ATK_TEXT(node)), 1);
278 TEST(FlAccessibleTextFieldTest, GetSelection) {
283 EXPECT_EQ(atk_text_get_selection(ATK_TEXT(node), 0,
nullptr,
nullptr),
290 g_autofree gchar* selection =
291 atk_text_get_selection(ATK_TEXT(node), 0, &
start, &
end);
292 EXPECT_STREQ(selection,
"utt");
298 g_autofree gchar* reverse =
299 atk_text_get_selection(ATK_TEXT(node), 0, &
start, &
end);
300 EXPECT_STREQ(reverse,
"utt");
306 EXPECT_EQ(atk_text_get_selection(ATK_TEXT(node), 0, &
start, &
end),
nullptr);
309 EXPECT_EQ(atk_text_get_selection(ATK_TEXT(node), 1, &
start, &
end),
nullptr);
313 TEST(FlAccessibleTextFieldTest, AddSelection) {
320 g_autoptr(GError)
error =
nullptr;
322 EXPECT_EQ(
error,
nullptr);
326 DispatchSemanticsAction,
327 ([&base, &extent](
auto engine, uint64_t
id,
328 FlutterSemanticsAction action,
const uint8_t* data,
329 size_t data_length) {
330 EXPECT_EQ(action, kFlutterSemanticsActionSetSelection);
340 EXPECT_TRUE(atk_text_add_selection(ATK_TEXT(node), 2, 4));
342 EXPECT_EQ(extent, 4);
347 EXPECT_FALSE(atk_text_add_selection(ATK_TEXT(node), 6, 7));
349 EXPECT_EQ(extent, 4);
353 TEST(FlAccessibleTextFieldTest, RemoveSelection) {
360 g_autoptr(GError)
error =
nullptr;
362 EXPECT_EQ(
error,
nullptr);
366 DispatchSemanticsAction,
367 ([&base, &extent](
auto engine, uint64_t
id,
368 FlutterSemanticsAction action,
const uint8_t* data,
369 size_t data_length) {
370 EXPECT_EQ(action, kFlutterSemanticsActionSetSelection);
381 EXPECT_FALSE(atk_text_remove_selection(ATK_TEXT(node), 0));
383 EXPECT_EQ(extent, -1);
388 EXPECT_FALSE(atk_text_remove_selection(ATK_TEXT(node), 1));
390 EXPECT_EQ(extent, -1);
393 EXPECT_TRUE(atk_text_remove_selection(ATK_TEXT(node), 0));
395 EXPECT_EQ(extent, 4);
399 TEST(FlAccessibleTextFieldTest, SetSelection) {
406 g_autoptr(GError)
error =
nullptr;
408 EXPECT_EQ(
error,
nullptr);
412 DispatchSemanticsAction,
413 ([&base, &extent](
auto engine, uint64_t
id,
414 FlutterSemanticsAction action,
const uint8_t* data,
415 size_t data_length) {
416 EXPECT_EQ(action, kFlutterSemanticsActionSetSelection);
427 EXPECT_FALSE(atk_text_set_selection(ATK_TEXT(node), 1, 2, 4));
429 EXPECT_EQ(extent, -1);
431 EXPECT_TRUE(atk_text_set_selection(ATK_TEXT(node), 0, 2, 4));
433 EXPECT_EQ(extent, 4);
435 EXPECT_TRUE(atk_text_set_selection(ATK_TEXT(node), 0, 5, 1));
437 EXPECT_EQ(extent, 1);
441 TEST(FlAccessibleTextFieldTest, SetTextContents) {
442 g_autofree gchar* text =
nullptr;
447 g_autoptr(GError)
error =
nullptr;
449 EXPECT_EQ(
error,
nullptr);
453 DispatchSemanticsAction,
454 ([&text](
auto engine, uint64_t
id, FlutterSemanticsAction action,
455 const uint8_t* data,
size_t data_length) {
456 EXPECT_EQ(action, kFlutterSemanticsActionSetText);
465 atk_editable_text_set_text_contents(ATK_EDITABLE_TEXT(node),
"Flutter");
466 EXPECT_STREQ(text,
"Flutter");
470 TEST(FlAccessibleTextFieldTest, InsertDeleteText) {
471 g_autofree gchar* text =
nullptr;
478 g_autoptr(GError)
error =
nullptr;
480 EXPECT_EQ(
error,
nullptr);
484 DispatchSemanticsAction,
485 ([&text, &base, &extent](
auto engine, uint64_t
id,
486 FlutterSemanticsAction action,
487 const uint8_t* data,
size_t data_length) {
489 ::testing::AnyOf(kFlutterSemanticsActionSetText,
490 kFlutterSemanticsActionSetSelection));
491 if (action == kFlutterSemanticsActionSetText) {
512 atk_editable_text_insert_text(ATK_EDITABLE_TEXT(node),
"utt", 3, &pos);
514 EXPECT_STREQ(text,
"Flutter");
515 EXPECT_EQ(base, pos);
516 EXPECT_EQ(extent, pos);
518 atk_editable_text_delete_text(ATK_EDITABLE_TEXT(node), 2, 5);
519 EXPECT_STREQ(text,
"Fler");
521 EXPECT_EQ(extent, 2);
525 TEST(FlAccessibleTextFieldTest, CopyCutPasteText) {
528 FlutterSemanticsAction act = kFlutterSemanticsActionCustomAction;
533 g_autoptr(GError)
error =
nullptr;
535 EXPECT_EQ(
error,
nullptr);
539 DispatchSemanticsAction,
540 ([&act, &base, &extent](
auto engine, uint64_t
id,
541 FlutterSemanticsAction action,
542 const uint8_t* data,
size_t data_length) {
544 ::testing::AnyOf(kFlutterSemanticsActionCut,
545 kFlutterSemanticsActionCopy,
546 kFlutterSemanticsActionPaste,
547 kFlutterSemanticsActionSetSelection));
549 if (action == kFlutterSemanticsActionSetSelection) {
562 atk_editable_text_copy_text(ATK_EDITABLE_TEXT(node), 2, 5);
564 EXPECT_EQ(extent, 5);
565 EXPECT_EQ(act, kFlutterSemanticsActionCopy);
567 atk_editable_text_cut_text(ATK_EDITABLE_TEXT(node), 1, 4);
569 EXPECT_EQ(extent, 4);
570 EXPECT_EQ(act, kFlutterSemanticsActionCut);
572 atk_editable_text_paste_text(ATK_EDITABLE_TEXT(node), 3);
574 EXPECT_EQ(extent, 3);
575 EXPECT_EQ(act, kFlutterSemanticsActionPaste);
578 TEST(FlAccessibleTextFieldTest, TextBoundary) {
584 "Lorem ipsum.\nDolor sit amet. Praesent commodo?"
585 "\n\nPraesent et felis dui.");
588 gint start_offset = -1, end_offset = -1;
589 g_autofree gchar* lorem_char = atk_text_get_string_at_offset(
590 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_CHAR, &start_offset, &end_offset);
591 EXPECT_STREQ(lorem_char,
"L");
592 EXPECT_EQ(start_offset, 0);
593 EXPECT_EQ(end_offset, 1);
595 g_autofree gchar* lorem_word = atk_text_get_string_at_offset(
596 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_WORD, &start_offset, &end_offset);
597 EXPECT_STREQ(lorem_word,
"Lorem");
598 EXPECT_EQ(start_offset, 0);
599 EXPECT_EQ(end_offset, 5);
601 g_autofree gchar* lorem_sentence = atk_text_get_string_at_offset(
602 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_SENTENCE, &start_offset,
604 EXPECT_STREQ(lorem_sentence,
"Lorem ipsum.");
605 EXPECT_EQ(start_offset, 0);
606 EXPECT_EQ(end_offset, 12);
608 g_autofree gchar* lorem_line = atk_text_get_string_at_offset(
609 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_LINE, &start_offset, &end_offset);
610 EXPECT_STREQ(lorem_line,
"Lorem ipsum.");
611 EXPECT_EQ(start_offset, 0);
612 EXPECT_EQ(end_offset, 12);
614 g_autofree gchar* lorem_paragraph = atk_text_get_string_at_offset(
615 ATK_TEXT(node), 0, ATK_TEXT_GRANULARITY_PARAGRAPH, &start_offset,
617 EXPECT_STREQ(lorem_paragraph,
618 "Lorem ipsum.\nDolor sit amet. Praesent commodo?");
619 EXPECT_EQ(start_offset, 0);
620 EXPECT_EQ(end_offset, 46);
623 g_autofree gchar* praesent_char = atk_text_get_string_at_offset(
624 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_CHAR, &start_offset,
626 EXPECT_STREQ(praesent_char,
"e");
627 EXPECT_EQ(start_offset, 32);
628 EXPECT_EQ(end_offset, 33);
630 g_autofree gchar* praesent_word = atk_text_get_string_at_offset(
631 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_WORD, &start_offset,
633 EXPECT_STREQ(praesent_word,
"Praesent");
634 EXPECT_EQ(start_offset, 29);
635 EXPECT_EQ(end_offset, 37);
637 g_autofree gchar* praesent_sentence = atk_text_get_string_at_offset(
638 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_SENTENCE, &start_offset,
640 EXPECT_STREQ(praesent_sentence,
"Praesent commodo?");
641 EXPECT_EQ(start_offset, 29);
642 EXPECT_EQ(end_offset, 46);
644 g_autofree gchar* praesent_line = atk_text_get_string_at_offset(
645 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_LINE, &start_offset,
647 EXPECT_STREQ(praesent_line,
"Dolor sit amet. Praesent commodo?");
648 EXPECT_EQ(start_offset, 13);
649 EXPECT_EQ(end_offset, 46);
651 g_autofree gchar* praesent_paragraph = atk_text_get_string_at_offset(
652 ATK_TEXT(node), 32, ATK_TEXT_GRANULARITY_PARAGRAPH, &start_offset,
654 EXPECT_STREQ(praesent_paragraph,
655 "Lorem ipsum.\nDolor sit amet. Praesent commodo?");
656 EXPECT_EQ(start_offset, 0);
657 EXPECT_EQ(end_offset, 46);
660 g_autofree gchar* felis_char = atk_text_get_string_at_offset(
661 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_CHAR, &start_offset,
663 EXPECT_STREQ(felis_char,
"s");
664 EXPECT_EQ(start_offset, 64);
665 EXPECT_EQ(end_offset, 65);
667 g_autofree gchar* felis_word = atk_text_get_string_at_offset(
668 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_WORD, &start_offset,
670 EXPECT_STREQ(felis_word,
"felis");
671 EXPECT_EQ(start_offset, 60);
672 EXPECT_EQ(end_offset, 65);
674 g_autofree gchar* felis_sentence = atk_text_get_string_at_offset(
675 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_SENTENCE, &start_offset,
677 EXPECT_STREQ(felis_sentence,
"Praesent et felis dui.");
678 EXPECT_EQ(start_offset, 48);
679 EXPECT_EQ(end_offset, 70);
681 g_autofree gchar* felis_line = atk_text_get_string_at_offset(
682 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_LINE, &start_offset,
684 EXPECT_STREQ(felis_line,
"Praesent et felis dui.");
685 EXPECT_EQ(start_offset, 48);
686 EXPECT_EQ(end_offset, 70);
688 g_autofree gchar* felis_paragraph = atk_text_get_string_at_offset(
689 ATK_TEXT(node), 64, ATK_TEXT_GRANULARITY_PARAGRAPH, &start_offset,
691 EXPECT_STREQ(felis_paragraph,
"\nPraesent et felis dui.");
692 EXPECT_EQ(start_offset, 47);
693 EXPECT_EQ(end_offset, 70);