diff --git a/Terminal.Gui/Views/TextField.cs b/Terminal.Gui/Views/TextField.cs index 8e843b22b..14fc56394 100644 --- a/Terminal.Gui/Views/TextField.cs +++ b/Terminal.Gui/Views/TextField.cs @@ -298,6 +298,7 @@ namespace Terminal.Gui { } return; } + ClearAllSelection (); text = TextModel.ToRunes (newText.NewText); if (!Secret && !historyText.IsFromHistory) { diff --git a/UnitTests/TextFieldTests.cs b/UnitTests/TextFieldTests.cs index cc3559848..a931f72e0 100644 --- a/UnitTests/TextFieldTests.cs +++ b/UnitTests/TextFieldTests.cs @@ -1296,5 +1296,32 @@ namespace Terminal.Gui.Views { Assert.Equal ($"{text}A", tf.Text); Assert.True (tf.IsDirty); } + + [InlineData ("a")] // Lower than selection + [InlineData ("aaaaaaaaaaa")] // Greater than selection + [InlineData ("aaaa")] // Equal than selection + [Theory] + public void TestSetTextAndMoveCursorToEnd_WhenExistingSelection (string newText) + { + var tf = new TextField (); + tf.Text = "fish"; + tf.CursorPosition = tf.Text.Length; + + tf.ProcessKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ())); + + tf.ProcessKey (new KeyEvent (Key.CursorLeft | Key.ShiftMask, new KeyModifiers { Shift = true })); + tf.ProcessKey (new KeyEvent (Key.CursorLeft | Key.ShiftMask, new KeyModifiers { Shift = true })); + + Assert.Equal (1, tf.CursorPosition); + Assert.Equal (2, tf.SelectedLength); + Assert.Equal ("is", tf.SelectedText); + + tf.Text = newText; + tf.CursorPosition = tf.Text.Length; + + Assert.Equal (newText.Length, tf.CursorPosition); + Assert.Equal (0, tf.SelectedLength); + Assert.Null (tf.SelectedText); + } } } \ No newline at end of file