From 81b58e955f06782f2b89af5a8084df5e64a7b558 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 8 Oct 2018 23:40:41 +0300 Subject: [PATCH 1/4] unit tests for textbox OutOfRangeException issue #1954 --- .../TextBoxTests.cs | 75 ++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 4a8c171ecf..8fbbfdd40b 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -8,7 +8,6 @@ using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Input; -using Avalonia.Markup.Data; using Avalonia.Media; using Avalonia.Platform; using Avalonia.UnitTests; @@ -322,6 +321,71 @@ namespace Avalonia.Controls.UnitTests } } + [Fact] + public void SelectionEnd_Dont_Cause_Exception() + { + using (UnitTestApplication.Start(Services)) + { + var target = new TextBox + { + Template = CreateTemplate(), + Text = "0123456789" + }; + + target.SelectionStart = 0; + target.SelectionEnd = 9; + + target.Text = "123"; + + RaiseTextEvent(target, "456"); + + Assert.True(true); + } + } + + [Fact] + public void SelectionStart_Dont_Cause_Exception() + { + using (UnitTestApplication.Start(Services)) + { + var target = new TextBox + { + Template = CreateTemplate(), + Text = "0123456789" + }; + + target.SelectionStart = 8; + target.SelectionEnd = 9; + + target.Text = "123"; + + RaiseTextEvent(target, "456"); + + Assert.True(true); + } + } + + [Fact] + public void SelectionStartEnd_Are_Valid_AterTextChange() + { + using (UnitTestApplication.Start(Services)) + { + var target = new TextBox + { + Template = CreateTemplate(), + Text = "0123456789" + }; + + target.SelectionStart = 8; + target.SelectionEnd = 9; + + target.Text = "123"; + + Assert.True(target.SelectionStart <= "123".Length); + Assert.True(target.SelectionEnd <= "123".Length); + } + } + private static TestServices Services => TestServices.MockThreadingInterface.With( standardCursorFactory: Mock.Of()); @@ -351,6 +415,15 @@ namespace Avalonia.Controls.UnitTests }); } + private void RaiseTextEvent(TextBox textBox, string text) + { + textBox.RaiseEvent(new TextInputEventArgs + { + RoutedEvent = InputElement.TextInputEvent, + Text = text + }); + } + private class Class1 : NotifyingBase { private int _foo; From 0959be5e01ea2e15d83a2f8a6b5179d1bf31465f Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Mon, 8 Oct 2018 23:48:19 +0300 Subject: [PATCH 2/4] fix for textbox OutOfRangeException issue #1954 --- src/Avalonia.Controls/TextBox.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 388f984b78..f8f0667759 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -213,6 +213,8 @@ namespace Avalonia.Controls if (!_ignoreTextChanges) { CaretIndex = CoerceCaretIndex(CaretIndex, value?.Length ?? 0); + SelectionStart = CoerceCaretIndex(SelectionStart, value?.Length ?? 0); + SelectionEnd = CoerceCaretIndex(SelectionEnd, value?.Length ?? 0); if (SetAndRaise(TextProperty, ref _text, value) && !_isUndoingRedoing) { From 3b302006fdd1eae03bf3460e40f2f5a9f6852e23 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Tue, 9 Oct 2018 14:48:02 +0300 Subject: [PATCH 3/4] fix failing text e.g. restore carretIndex in textbox when text changed --- src/Avalonia.Controls/TextBox.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index f8f0667759..2f29d229e5 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -212,9 +212,10 @@ namespace Avalonia.Controls { if (!_ignoreTextChanges) { - CaretIndex = CoerceCaretIndex(CaretIndex, value?.Length ?? 0); + var carretIndex = CaretIndex; SelectionStart = CoerceCaretIndex(SelectionStart, value?.Length ?? 0); SelectionEnd = CoerceCaretIndex(SelectionEnd, value?.Length ?? 0); + CaretIndex = CoerceCaretIndex(carretIndex, value?.Length ?? 0); if (SetAndRaise(TextProperty, ref _text, value) && !_isUndoingRedoing) { From eabf122ce76711aa8a3c12f04e9b1a56ff537e76 Mon Sep 17 00:00:00 2001 From: Andrey Kunchev Date: Wed, 10 Oct 2018 18:08:54 +0300 Subject: [PATCH 4/4] fix nits --- src/Avalonia.Controls/TextBox.cs | 4 ++-- tests/Avalonia.Controls.UnitTests/TextBoxTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 2f29d229e5..e2d2f562ec 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -212,10 +212,10 @@ namespace Avalonia.Controls { if (!_ignoreTextChanges) { - var carretIndex = CaretIndex; + var caretIndex = CaretIndex; SelectionStart = CoerceCaretIndex(SelectionStart, value?.Length ?? 0); SelectionEnd = CoerceCaretIndex(SelectionEnd, value?.Length ?? 0); - CaretIndex = CoerceCaretIndex(carretIndex, value?.Length ?? 0); + CaretIndex = CoerceCaretIndex(caretIndex, value?.Length ?? 0); if (SetAndRaise(TextProperty, ref _text, value) && !_isUndoingRedoing) { diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index 8fbbfdd40b..0d87f6d0fe 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -322,7 +322,7 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void SelectionEnd_Dont_Cause_Exception() + public void SelectionEnd_Doesnt_Cause_Exception() { using (UnitTestApplication.Start(Services)) { @@ -344,7 +344,7 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void SelectionStart_Dont_Cause_Exception() + public void SelectionStart_Doesnt_Cause_Exception() { using (UnitTestApplication.Start(Services)) {