Browse Source

Added failing test.

Steven Kirk 9 years ago
parent
commit
13642613cf

+ 39 - 7
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs

@@ -7,6 +7,8 @@ using Avalonia.Controls.Generators;
 using Avalonia.Controls.Presenters;
 using Avalonia.Controls.Primitives;
 using Avalonia.Controls.Templates;
+using Avalonia.Layout;
+using Avalonia.UnitTests;
 using Xunit;
 
 namespace Avalonia.Controls.UnitTests.Presenters
@@ -158,7 +160,6 @@ namespace Avalonia.Controls.UnitTests.Presenters
             var target = CreateTarget(mode: ItemVirtualizationMode.None);
             var scroll = (ScrollContentPresenter)target.Parent;
 
-            target.ApplyTemplate();
             scroll.Measure(new Size(100, 100));
             scroll.Arrange(new Rect(0, 0, 100, 100));
 
@@ -167,29 +168,60 @@ namespace Avalonia.Controls.UnitTests.Presenters
             Assert.Equal(new Size(100, 100), scroll.Viewport);
 
             target.VirtualizationMode = ItemVirtualizationMode.Simple;
-            scroll.Measure(new Size(100, 100));
-            scroll.Arrange(new Rect(0, 0, 100, 100));
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
 
             Assert.Equal(10, target.Panel.Children.Count);
             Assert.Equal(new Size(0, 20), scroll.Extent);
             Assert.Equal(new Size(0, 10), scroll.Viewport);
         }
 
+        [Fact]
+        public void Changing_VirtualizationMode_None_To_Simple_Should_Add_Correct_Number_Of_Controls()
+        {
+            using (UnitTestApplication.Start(TestServices.RealLayoutManager))
+            {
+                var target = CreateTarget(mode: ItemVirtualizationMode.None);
+                var scroll = (ScrollContentPresenter)target.Parent;
+
+                scroll.Measure(new Size(100, 100));
+                scroll.Arrange(new Rect(0, 0, 100, 100));
+
+                // Ensure than an intermediate measure pass doesn't add more controls than it
+                // should. This can happen if target gets measured with Size.Infinity which
+                // is what the available size should be when VirtualizationMode == None but not
+                // what it should after VirtualizationMode is changed to Simple.
+                target.Panel.Children.CollectionChanged += (s, e) =>
+                {
+                    Assert.InRange(target.Panel.Children.Count, 0, 10);
+                };
+
+                target.VirtualizationMode = ItemVirtualizationMode.Simple;
+                LayoutManager.Instance.ExecuteLayoutPass();
+
+                Assert.Equal(10, target.Panel.Children.Count);
+            }
+        }
+
         [Fact]
         public void Changing_VirtualizationMode_Simple_To_None_Should_Update_Control()
         {
             var target = CreateTarget();
+            var scroll = (ScrollContentPresenter)target.Parent;
 
-            target.ApplyTemplate();
-            target.Measure(new Size(100, 100));
-            target.Arrange(new Rect(0, 0, 100, 100));
+            scroll.Measure(new Size(100, 100));
+            scroll.Arrange(new Rect(0, 0, 100, 100));
 
-            var scroll = (ScrollContentPresenter)target.Parent;
             Assert.Equal(10, target.Panel.Children.Count);
             Assert.Equal(new Size(0, 20), scroll.Extent);
             Assert.Equal(new Size(0, 10), scroll.Viewport);
 
             target.VirtualizationMode = ItemVirtualizationMode.None;
+            target.Measure(new Size(100, 100));
+            target.Arrange(new Rect(0, 0, 100, 100));
+
+            // Here - unlike changing the other way - we need to do a layout pass on the scroll
+            // content presenter as non-logical scroll values are only updated on arrange.
             scroll.Measure(new Size(100, 100));
             scroll.Arrange(new Rect(0, 0, 100, 100));
 

+ 3 - 0
tests/Avalonia.UnitTests/TestServices.cs

@@ -44,6 +44,9 @@ namespace Avalonia.UnitTests
             keyboardDevice: () => new KeyboardDevice(),
             inputManager: new InputManager());
 
+        public static readonly TestServices RealLayoutManager = new TestServices(
+            layoutManager: new LayoutManager());
+
         public static readonly TestServices RealStyler = new TestServices(
             styler: new Styler());