From 13642613cf39a752d1200599db0067fd82ca23af Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 10 Jun 2016 19:37:52 +0200 Subject: [PATCH] Added failing test. --- .../ItemsPresenterTests_Virtualization.cs | 46 ++++++++++++++++--- tests/Avalonia.UnitTests/TestServices.cs | 3 ++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs index d8ebbe50c6..26657a0fbb 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization.cs +++ b/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)); diff --git a/tests/Avalonia.UnitTests/TestServices.cs b/tests/Avalonia.UnitTests/TestServices.cs index 9ea13e07ff..c4a0c98908 100644 --- a/tests/Avalonia.UnitTests/TestServices.cs +++ b/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());