From 4abd223f860c52cb31326431771fe68ec2616911 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 10 Sep 2016 15:38:06 +0200 Subject: [PATCH 1/2] Fixed up existing TextBox tests. Some tests were leaking services. --- .../TextBoxTests.cs | 157 +++++++++--------- 1 file changed, 78 insertions(+), 79 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 8f206cc016..a6d2f3e2e4 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -51,6 +51,84 @@ namespace Avalonia.Controls.UnitTests } } + [Fact] + public void Control_Backspace_Should_Remove_The_Word_Before_The_Caret_If_There_Is_No_Selection() + { + using (UnitTestApplication.Start(Services)) + { + TextBox textBox = new TextBox + { + Text = "First Second Third Fourth", + CaretIndex = 5 + }; + + // (First| Second Third Fourth) + RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); + Assert.Equal(" Second Third Fourth", textBox.Text); + + // ( Second |Third Fourth) + textBox.CaretIndex = 8; + RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); + Assert.Equal(" Third Fourth", textBox.Text); + + // ( Thi|rd Fourth) + textBox.CaretIndex = 4; + RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); + Assert.Equal(" rd Fourth", textBox.Text); + + // ( rd F[ou]rth) + textBox.SelectionStart = 5; + textBox.SelectionEnd = 7; + + RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); + Assert.Equal(" rd Frth", textBox.Text); + + // ( |rd Frth) + textBox.CaretIndex = 1; + RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); + Assert.Equal("rd Frth", textBox.Text); + } + } + + [Fact] + public void Control_Delete_Should_Remove_The_Word_After_The_Caret_If_There_Is_No_Selection() + { + using (UnitTestApplication.Start(Services)) + { + TextBox textBox = new TextBox + { + Text = "First Second Third Fourth", + CaretIndex = 19 + }; + + // (First Second Third |Fourth) + RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); + Assert.Equal("First Second Third ", textBox.Text); + + // (First Second| Third ) + textBox.CaretIndex = 12; + RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); + Assert.Equal("First Second ", textBox.Text); + + // (First Sec|ond ) + textBox.CaretIndex = 9; + RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); + Assert.Equal("First Sec ", textBox.Text); + + // (Fi[rs]t Sec ) + textBox.SelectionStart = 2; + textBox.SelectionEnd = 4; + + RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); + Assert.Equal("Fit Sec ", textBox.Text); + + // (Fit Sec| ) + textBox.CaretIndex = 7; + RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); + Assert.Equal("Fit Sec", textBox.Text); + } + } + private static TestServices Services => TestServices.MockThreadingInterface.With( standardCursorFactory: Mock.Of()); @@ -70,85 +148,6 @@ namespace Avalonia.Controls.UnitTests }); } - public void Control_Backspace_Should_Remove_The_Word_Before_The_Caret_If_There_Is_No_Selection() - { - AvaloniaLocator.CurrentMutable - .Bind() - .ToConstant(TestServices.MockThreadingInterface.ThreadingInterface); - - TextBox textBox = new TextBox - { - Text = "First Second Third Fourth", - CaretIndex = 5 - }; - - // (First| Second Third Fourth) - RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); - Assert.Equal(" Second Third Fourth", textBox.Text); - - // ( Second |Third Fourth) - textBox.CaretIndex = 8; - RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); - Assert.Equal(" Third Fourth", textBox.Text); - - // ( Thi|rd Fourth) - textBox.CaretIndex = 4; - RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); - Assert.Equal(" rd Fourth", textBox.Text); - - // ( rd F[ou]rth) - textBox.SelectionStart = 5; - textBox.SelectionEnd = 7; - - RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); - Assert.Equal(" rd Frth", textBox.Text); - - // ( |rd Frth) - textBox.CaretIndex = 1; - RaiseKeyEvent(textBox, Key.Back, InputModifiers.Control); - Assert.Equal("rd Frth", textBox.Text); - } - - [Fact] - public void Control_Delete_Should_Remove_The_Word_After_The_Caret_If_There_Is_No_Selection() - { - AvaloniaLocator.CurrentMutable - .Bind() - .ToConstant(TestServices.MockThreadingInterface.ThreadingInterface); - - TextBox textBox = new TextBox - { - Text = "First Second Third Fourth", - CaretIndex = 19 - }; - - // (First Second Third |Fourth) - RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); - Assert.Equal("First Second Third ", textBox.Text); - - // (First Second| Third ) - textBox.CaretIndex = 12; - RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); - Assert.Equal("First Second ", textBox.Text); - - // (First Sec|ond ) - textBox.CaretIndex = 9; - RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); - Assert.Equal("First Sec ", textBox.Text); - - // (Fi[rs]t Sec ) - textBox.SelectionStart = 2; - textBox.SelectionEnd = 4; - - RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); - Assert.Equal("Fit Sec ", textBox.Text); - - // (Fit Sec| ) - textBox.CaretIndex = 7; - RaiseKeyEvent(textBox, Key.Delete, InputModifiers.Control); - Assert.Equal("Fit Sec", textBox.Text); - } - private void RaiseKeyEvent(TextBox textBox, Key key, InputModifiers inputModifiers) { textBox.RaiseEvent(new KeyEventArgs From 6e7fb769669bcd3bf296749c8b6ec6c2f6bf6586 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 10 Sep 2016 15:44:07 +0200 Subject: [PATCH 2/2] Allow movement to after last char with arrow keys. Fixes #716. --- src/Avalonia.Controls/TextBox.cs | 7 ++++++- .../TextBoxTests.cs | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 5806dd5bb3..104b1ba2a7 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -575,10 +575,15 @@ namespace Avalonia.Controls { var index = caretIndex + direction; - if (index < 0 || index >= text.Length) + if (index < 0 || index > text.Length) { return; } + else if (index == text.Length) + { + CaretIndex = index; + return; + } var c = text[index]; diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index a6d2f3e2e4..168d9786c2 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -23,6 +23,24 @@ namespace Avalonia.Controls.UnitTests TextBox.TextProperty.GetMetadata(typeof(TextBox)).DefaultBindingMode); } + [Fact] + public void CaretIndex_Can_Moved_To_Position_After_The_End_Of_Text_With_Arrow_Key() + { + using (UnitTestApplication.Start(Services)) + { + var target = new TextBox + { + Template = CreateTemplate(), + Text = "1234" + }; + + target.CaretIndex = 3; + RaiseKeyEvent(target, Key.Right, 0); + + Assert.Equal(4, target.CaretIndex); + } + } + [Fact] public void Typing_Beginning_With_0_Should_Not_Modify_Text_When_Bound_To_Int() {