@@ -103,8 +103,8 @@ TEST(TextInputModel, AddCodePointSelectionWideCharacter) {
103103TEST (TextInputModel, AddText) {
104104 auto model = std::make_unique<TextInputModel>(" " , " " );
105105 model->AddText (u" ABCDE" );
106- model->AddText (u " 😄" );
107- model->AddText (u " FGHIJ" );
106+ model->AddText (" 😄" );
107+ model->AddText (" FGHIJ" );
108108 EXPECT_EQ (model->selection_base (), 12 );
109109 EXPECT_EQ (model->selection_extent (), 12 );
110110 EXPECT_STREQ (model->GetText ().c_str (), " ABCDE😄FGHIJ" );
@@ -113,7 +113,7 @@ TEST(TextInputModel, AddText) {
113113TEST (TextInputModel, AddTextSelection) {
114114 auto model = std::make_unique<TextInputModel>(" " , " " );
115115 EXPECT_TRUE (model->SetEditingState (1 , 4 , " ABCDE" ));
116- model->AddText (u " xy" );
116+ model->AddText (" xy" );
117117 EXPECT_EQ (model->selection_base (), 3 );
118118 EXPECT_EQ (model->selection_extent (), 3 );
119119 EXPECT_STREQ (model->GetText ().c_str (), " AxyE" );
@@ -173,6 +173,87 @@ TEST(TextInputModel, DeleteSelection) {
173173 EXPECT_STREQ (model->GetText ().c_str (), " AE" );
174174}
175175
176+ TEST (TextInputModel, DeleteSurroundingAtCursor) {
177+ auto model = std::make_unique<TextInputModel>(" " , " " );
178+ model->SetEditingState (2 , 2 , " ABCDE" );
179+ EXPECT_TRUE (model->DeleteSurrounding (0 , 1 ));
180+ EXPECT_EQ (model->selection_base (), 2 );
181+ EXPECT_EQ (model->selection_extent (), 2 );
182+ EXPECT_STREQ (model->GetText ().c_str (), " ABDE" );
183+ }
184+
185+ TEST (TextInputModel, DeleteSurroundingAtCursorAll) {
186+ auto model = std::make_unique<TextInputModel>(" " , " " );
187+ model->SetEditingState (2 , 2 , " ABCDE" );
188+ EXPECT_TRUE (model->DeleteSurrounding (0 , 3 ));
189+ EXPECT_EQ (model->selection_base (), 2 );
190+ EXPECT_EQ (model->selection_extent (), 2 );
191+ EXPECT_STREQ (model->GetText ().c_str (), " AB" );
192+ }
193+
194+ TEST (TextInputModel, DeleteSurroundingAtCursorGreedy) {
195+ auto model = std::make_unique<TextInputModel>(" " , " " );
196+ model->SetEditingState (2 , 2 , " ABCDE" );
197+ EXPECT_TRUE (model->DeleteSurrounding (0 , 4 ));
198+ EXPECT_EQ (model->selection_base (), 2 );
199+ EXPECT_EQ (model->selection_extent (), 2 );
200+ EXPECT_STREQ (model->GetText ().c_str (), " AB" );
201+ }
202+
203+ TEST (TextInputModel, DeleteSurroundingBeforeCursor) {
204+ auto model = std::make_unique<TextInputModel>(" " , " " );
205+ model->SetEditingState (2 , 2 , " ABCDE" );
206+ EXPECT_TRUE (model->DeleteSurrounding (-1 , 1 ));
207+ EXPECT_EQ (model->selection_base (), 1 );
208+ EXPECT_EQ (model->selection_extent (), 1 );
209+ EXPECT_STREQ (model->GetText ().c_str (), " ACDE" );
210+ }
211+
212+ TEST (TextInputModel, DeleteSurroundingBeforeCursorAll) {
213+ auto model = std::make_unique<TextInputModel>(" " , " " );
214+ model->SetEditingState (2 , 2 , " ABCDE" );
215+ EXPECT_TRUE (model->DeleteSurrounding (-2 , 2 ));
216+ EXPECT_EQ (model->selection_base (), 0 );
217+ EXPECT_EQ (model->selection_extent (), 0 );
218+ EXPECT_STREQ (model->GetText ().c_str (), " CDE" );
219+ }
220+
221+ TEST (TextInputModel, DeleteSurroundingBeforeCursorGreedy) {
222+ auto model = std::make_unique<TextInputModel>(" " , " " );
223+ model->SetEditingState (2 , 2 , " ABCDE" );
224+ EXPECT_TRUE (model->DeleteSurrounding (-3 , 3 ));
225+ EXPECT_EQ (model->selection_base (), 0 );
226+ EXPECT_EQ (model->selection_extent (), 0 );
227+ EXPECT_STREQ (model->GetText ().c_str (), " CDE" );
228+ }
229+
230+ TEST (TextInputModel, DeleteSurroundingAfterCursor) {
231+ auto model = std::make_unique<TextInputModel>(" " , " " );
232+ model->SetEditingState (2 , 2 , " ABCDE" );
233+ EXPECT_TRUE (model->DeleteSurrounding (1 , 1 ));
234+ EXPECT_EQ (model->selection_base (), 2 );
235+ EXPECT_EQ (model->selection_extent (), 2 );
236+ EXPECT_STREQ (model->GetText ().c_str (), " ABCE" );
237+ }
238+
239+ TEST (TextInputModel, DeleteSurroundingAfterCursorAll) {
240+ auto model = std::make_unique<TextInputModel>(" " , " " );
241+ model->SetEditingState (2 , 2 , " ABCDE" );
242+ EXPECT_TRUE (model->DeleteSurrounding (1 , 2 ));
243+ EXPECT_EQ (model->selection_base (), 2 );
244+ EXPECT_EQ (model->selection_extent (), 2 );
245+ EXPECT_STREQ (model->GetText ().c_str (), " ABC" );
246+ }
247+
248+ TEST (TextInputModel, DeleteSurroundingAfterCursorGreedy) {
249+ auto model = std::make_unique<TextInputModel>(" " , " " );
250+ model->SetEditingState (2 , 2 , " ABCDE" );
251+ EXPECT_TRUE (model->DeleteSurrounding (1 , 3 ));
252+ EXPECT_EQ (model->selection_base (), 2 );
253+ EXPECT_EQ (model->selection_extent (), 2 );
254+ EXPECT_STREQ (model->GetText ().c_str (), " ABC" );
255+ }
256+
176257TEST (TextInputModel, BackspaceStart) {
177258 auto model = std::make_unique<TextInputModel>(" " , " " );
178259 EXPECT_TRUE (model->SetEditingState (0 , 0 , " ABCDE" ));
@@ -380,4 +461,19 @@ TEST(TextInputModel, MoveCursorToEndSelection) {
380461 EXPECT_STREQ (model->GetText ().c_str (), " ABCDE" );
381462}
382463
464+ TEST (TextInputModel, GetCursorOffset) {
465+ auto model = std::make_unique<TextInputModel>(" " , " " );
466+ // These characters take 1, 2, 3 and 4 bytes in UTF-8
467+ model->SetEditingState (0 , 0 , " $¢€𐍈" );
468+ EXPECT_EQ (model->GetCursorOffset (), 0 );
469+ EXPECT_TRUE (model->MoveCursorForward ());
470+ EXPECT_EQ (model->GetCursorOffset (), 1 );
471+ EXPECT_TRUE (model->MoveCursorForward ());
472+ EXPECT_EQ (model->GetCursorOffset (), 3 );
473+ EXPECT_TRUE (model->MoveCursorForward ());
474+ EXPECT_EQ (model->GetCursorOffset (), 6 );
475+ EXPECT_TRUE (model->MoveCursorForward ());
476+ EXPECT_EQ (model->GetCursorOffset (), 10 );
477+ }
478+
383479} // namespace flutter
0 commit comments