From af8fbba51b42bc8ef6bb67a7da0131c51930de24 Mon Sep 17 00:00:00 2001 From: donandren Date: Tue, 2 Aug 2016 15:08:07 +0300 Subject: [PATCH 1/3] added failing unit test for ItemsPresenter --- .../ItemsPresenterTests_Virtualization.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs index 2f6361a867..9c5cedb9d3 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs @@ -269,6 +269,41 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(new Size(100, 100), scroll.Viewport); } + [Fact] + public void Should_Add_Items_After_Clear() + { + var target = CreateTarget(itemCount: 10); + var defaultItems = (IList)target.Items; + var items = new Avalonia.Collections.AvaloniaList(defaultItems); + target.Items = items; + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(10, target.Panel.Children.Count); + + items.Clear(); + + target.Panel.Measure(new Size(100, 100)); + target.Panel.Arrange(new Rect(target.Panel.DesiredSize)); + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(0, target.Panel.Children.Count); + + items.AddRange(defaultItems.Select(s => s + " new")); + + target.Panel.Measure(new Size(100, 100)); + target.Panel.Arrange(new Rect(target.Panel.DesiredSize)); + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(10, target.Panel.Children.Count); + } + private static ItemsPresenter CreateTarget( ItemVirtualizationMode mode = ItemVirtualizationMode.Simple, Orientation orientation = Orientation.Vertical, From 7b23b6eab5430817fb76b6c258fdc886ebaa61d5 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 4 Aug 2016 13:55:30 +0200 Subject: [PATCH 2/3] Moved test to correct file. --- .../ItemsPresenterTests_Virtualization.cs | 36 +------------------ ...emsPresenterTests_Virtualization_Simple.cs | 35 ++++++++++++++++++ 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs index 9c5cedb9d3..02dffdead6 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Avalonia.Collections; using Avalonia.Controls.Generators; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; @@ -269,41 +270,6 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Equal(new Size(100, 100), scroll.Viewport); } - [Fact] - public void Should_Add_Items_After_Clear() - { - var target = CreateTarget(itemCount: 10); - var defaultItems = (IList)target.Items; - var items = new Avalonia.Collections.AvaloniaList(defaultItems); - target.Items = items; - - target.ApplyTemplate(); - target.Measure(new Size(100, 100)); - target.Arrange(new Rect(target.DesiredSize)); - - Assert.Equal(10, target.Panel.Children.Count); - - items.Clear(); - - target.Panel.Measure(new Size(100, 100)); - target.Panel.Arrange(new Rect(target.Panel.DesiredSize)); - - target.Measure(new Size(100, 100)); - target.Arrange(new Rect(target.DesiredSize)); - - Assert.Equal(0, target.Panel.Children.Count); - - items.AddRange(defaultItems.Select(s => s + " new")); - - target.Panel.Measure(new Size(100, 100)); - target.Panel.Arrange(new Rect(target.Panel.DesiredSize)); - - target.Measure(new Size(100, 100)); - target.Arrange(new Rect(target.DesiredSize)); - - Assert.Equal(10, target.Panel.Children.Count); - } - private static ItemsPresenter CreateTarget( ItemVirtualizationMode mode = ItemVirtualizationMode.Simple, Orientation orientation = Orientation.Vertical, diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs index 3ab5a928b4..1225583e79 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs @@ -522,6 +522,41 @@ namespace Avalonia.Controls.UnitTests.Presenters } } + [Fact] + public void Should_Add_Containers_For_Items_After_Clear() + { + var target = CreateTarget(itemCount: 10); + var defaultItems = (IList)target.Items; + var items = new AvaloniaList(defaultItems); + target.Items = items; + + target.ApplyTemplate(); + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(10, target.Panel.Children.Count); + + items.Clear(); + + target.Panel.Measure(new Size(100, 100)); + target.Panel.Arrange(new Rect(target.Panel.DesiredSize)); + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(0, target.Panel.Children.Count); + + items.AddRange(defaultItems.Select(s => s + " new")); + + target.Panel.Measure(new Size(100, 100)); + target.Panel.Arrange(new Rect(target.Panel.DesiredSize)); + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(10, target.Panel.Children.Count); + } + public class Vertical { [Fact] From 47beb2725c9c3db651bcfca6af39887a17aace46 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 4 Aug 2016 13:56:55 +0200 Subject: [PATCH 3/3] Don't reset available space on Arrange. This fixes the failing `Should_Add_Containers_For_Items_After_Clear` however I'm unsure if it's the correct fix. May need to revisit if it seems to be causing other problems. --- src/Avalonia.Controls/VirtualizingStackPanel.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Avalonia.Controls/VirtualizingStackPanel.cs b/src/Avalonia.Controls/VirtualizingStackPanel.cs index 840ed06c73..6daad0b90e 100644 --- a/src/Avalonia.Controls/VirtualizingStackPanel.cs +++ b/src/Avalonia.Controls/VirtualizingStackPanel.cs @@ -74,7 +74,6 @@ namespace Avalonia.Controls protected override Size ArrangeOverride(Size finalSize) { - _availableSpace = finalSize; _canBeRemoved = 0; _takenSpace = 0; _averageItemSize = 0;