Browse Source

fixing PR for data validation for Combobox control and all SelectingItemsControl

pull/5653/head
aljosas 5 years ago
parent
commit
ede1e2db94
  1. 6
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  2. 80
      tests/Avalonia.Controls.UnitTests/CarouselTests.cs
  3. 37
      tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs
  4. 19
      tests/Avalonia.Controls.UnitTests/ListBoxTests.cs

6
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -517,7 +517,6 @@ namespace Avalonia.Controls.Primitives
{
AutoScrollToSelectedItemIfNecessary();
}
if (change.Property == ItemsProperty && _updateState is null && _selection is object)
{
var newValue = change.NewValue.GetValueOrDefault<IEnumerable>();
@ -868,7 +867,10 @@ namespace Avalonia.Controls.Primitives
private ISelectionModel CreateDefaultSelectionModel()
{
return new InternalSelectionModel { SingleSelect = !SelectionMode.HasFlagCustom(SelectionMode.Multiple), };
return new InternalSelectionModel
{
SingleSelect = !SelectionMode.HasFlagCustom(SelectionMode.Multiple),
};
}
private void InitializeSelectionModel(ISelectionModel model)

80
tests/Avalonia.Controls.UnitTests/CarouselTests.cs

@ -20,7 +20,12 @@ namespace Avalonia.Controls.UnitTests
{
var target = new Carousel
{
Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = new[] { "Foo", "Bar" }
Template = new FuncControlTemplate<Carousel>(CreateTemplate),
Items = new[]
{
"Foo",
"Bar"
}
};
target.ApplyTemplate();
@ -34,7 +39,12 @@ namespace Avalonia.Controls.UnitTests
{
var target = new Carousel
{
Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = new[] { "Foo", "Bar" }
Template = new FuncControlTemplate<Carousel>(CreateTemplate),
Items = new[]
{
"Foo",
"Bar"
}
};
target.ApplyTemplate();
@ -69,11 +79,18 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void Selected_Item_Changes_To_First_Item_When_Items_Property_Changes()
{
var items = new ObservableCollection<string> { "Foo", "Bar", "FooBar" };
var items = new ObservableCollection<string>
{
"Foo",
"Bar",
"FooBar"
};
var target = new Carousel
{
Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
Template = new FuncControlTemplate<Carousel>(CreateTemplate),
Items = items,
IsVirtualized = false
};
target.ApplyTemplate();
@ -98,11 +115,18 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void Selected_Item_Changes_To_First_Item_When_Items_Property_Changes_And_Virtualized()
{
var items = new ObservableCollection<string> { "Foo", "Bar", "FooBar" };
var items = new ObservableCollection<string>
{
"Foo",
"Bar",
"FooBar"
};
var target = new Carousel
{
Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = true,
Template = new FuncControlTemplate<Carousel>(CreateTemplate),
Items = items,
IsVirtualized = true,
};
target.ApplyTemplate();
@ -130,7 +154,9 @@ namespace Avalonia.Controls.UnitTests
var items = new ObservableCollection<string>();
var target = new Carousel
{
Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
Template = new FuncControlTemplate<Carousel>(CreateTemplate),
Items = items,
IsVirtualized = false
};
target.ApplyTemplate();
@ -148,11 +174,18 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void Selected_Index_Changes_To_None_When_Items_Assigned_Null()
{
var items = new ObservableCollection<string> { "Foo", "Bar", "FooBar" };
var items = new ObservableCollection<string>
{
"Foo",
"Bar",
"FooBar"
};
var target = new Carousel
{
Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
Template = new FuncControlTemplate<Carousel>(CreateTemplate),
Items = items,
IsVirtualized = false
};
target.ApplyTemplate();
@ -175,7 +208,12 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void Selected_Index_Is_Maintained_Carousel_Created_With_Non_Zero_SelectedIndex()
{
var items = new ObservableCollection<string> { "Foo", "Bar", "FooBar" };
var items = new ObservableCollection<string>
{
"Foo",
"Bar",
"FooBar"
};
var target = new Carousel
{
@ -199,11 +237,18 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void Selected_Item_Changes_To_Next_First_Item_When_Item_Removed_From_Beggining_Of_List()
{
var items = new ObservableCollection<string> { "Foo", "Bar", "FooBar" };
var items = new ObservableCollection<string>
{
"Foo",
"Bar",
"FooBar"
};
var target = new Carousel
{
Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
Template = new FuncControlTemplate<Carousel>(CreateTemplate),
Items = items,
IsVirtualized = false
};
target.ApplyTemplate();
@ -226,11 +271,18 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void Selected_Item_Changes_To_First_Item_If_SelectedItem_Is_Removed_From_Middle()
{
var items = new ObservableCollection<string> { "Foo", "Bar", "FooBar" };
var items = new ObservableCollection<string>
{
"Foo",
"Bar",
"FooBar"
};
var target = new Carousel
{
Template = new FuncControlTemplate<Carousel>(CreateTemplate), Items = items, IsVirtualized = false
Template = new FuncControlTemplate<Carousel>(CreateTemplate),
Items = items,
IsVirtualized = false
};
target.ApplyTemplate();

37
tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs

@ -202,41 +202,6 @@ namespace Avalonia.Controls.UnitTests
}
}
private ComboBox CreateControl()
{
var control = new ComboBox()
{
Template = GetTemplate()
};
control.ApplyTemplate();
return control;
}
private TextBox GetTextBox(ComboBox control)
{
return control.GetTemplateChildren()
// .OfType<ButtonSpinner>()
// .Select(b => b.Content)
.OfType<TextBox>()
.First();
}
// private IControlTemplate CreateTemplate()
// {
// return new FuncControlTemplate<ComboBox>((control, scope) =>
// {
// var textBox =
// new TextBox
// {
// Name = "PART_TextBox"
// }.RegisterInNameScope(scope);
// return new ButtonSpinner
// {
// Name = "PART_Spinner",
// Content = textBox,
// }.RegisterInNameScope(scope);
// });
// }
}
}
}

19
tests/Avalonia.Controls.UnitTests/ListBoxTests.cs

@ -1,11 +1,14 @@
using System.Linq;
using System.Reactive.Subjects;
using Avalonia.Collections;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Input;
using Avalonia.LogicalTree;
using Avalonia.Styling;
using Avalonia.Threading;
using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Xunit;
@ -564,7 +567,23 @@ namespace Avalonia.Controls.UnitTests
[Fact]
public void SelectedItem_Validation()
{
var target = new ListBox
{
Template = ListBoxTemplate(),
Items = new[] { "Foo" },
ItemTemplate = new FuncDataTemplate<string>((_, __) => new Canvas()),
};
Prepare(target);
var exception = new System.InvalidCastException("failed validation");
var textObservable = new BehaviorSubject<BindingNotification>(new BindingNotification(exception, BindingErrorType.DataValidationError));
target.Bind(ComboBox.SelectedItemProperty, textObservable);
Dispatcher.UIThread.RunJobs();
Assert.True(DataValidationErrors.GetHasErrors(target));
Assert.True(DataValidationErrors.GetErrors(target).SequenceEqual(new[] { exception }));
}
}
}

Loading…
Cancel
Save