From 67e6b2eaed82bcf4b49b62038a004684891cf8b2 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 5 May 2015 23:25:55 +0200 Subject: [PATCH] Fixed ScrollPresenter arrange. And added tests because I think it's about the 5th time I've tried to get this right... --- .../Presenters/ScrollContentPresenter.cs | 2 +- .../ScrollContentPresenterTests.cs | 135 ++++++++++++++++++ .../ScrollViewerTests.cs | 1 + 3 files changed, 137 insertions(+), 1 deletion(-) diff --git a/Perspex.Controls/Presenters/ScrollContentPresenter.cs b/Perspex.Controls/Presenters/ScrollContentPresenter.cs index 3baef37e6a..e92f5f846b 100644 --- a/Perspex.Controls/Presenters/ScrollContentPresenter.cs +++ b/Perspex.Controls/Presenters/ScrollContentPresenter.cs @@ -95,7 +95,7 @@ namespace Perspex.Controls.Presenters if (child != null) { - child.Arrange(new Rect((Point)(-this.Offset), child.DesiredSize)); + child.Arrange(new Rect((Point)(-this.Offset), finalSize)); return finalSize; } diff --git a/Tests/Perspex.Controls.UnitTests/ScrollContentPresenterTests.cs b/Tests/Perspex.Controls.UnitTests/ScrollContentPresenterTests.cs index 0e358560a6..b0822ba872 100644 --- a/Tests/Perspex.Controls.UnitTests/ScrollContentPresenterTests.cs +++ b/Tests/Perspex.Controls.UnitTests/ScrollContentPresenterTests.cs @@ -11,9 +11,144 @@ namespace Perspex.Controls.UnitTests using System.Reactive.Linq; using Perspex.Controls.Presenters; using Xunit; + using Perspex.Layout; public class ScrollContentPresenterTests { + [Fact] + public void Content_Can_Be_Left_Aligned() + { + Border content; + var target = new ScrollContentPresenter + { + Content = (content = new Border + { + Padding = new Thickness(8), + HorizontalAlignment = HorizontalAlignment.Left + }), + }; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(0, 0, 16, 100), content.Bounds); + } + + [Fact] + public void Content_Can_Be_Stretched() + { + Border content; + var target = new ScrollContentPresenter + { + Content = (content = new Border + { + Padding = new Thickness(8), + }), + }; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(0, 0, 100, 100), content.Bounds); + } + + [Fact] + public void Content_Can_Be_Right_Aligned() + { + Border content; + var target = new ScrollContentPresenter + { + Content = (content = new Border + { + Padding = new Thickness(8), + HorizontalAlignment = HorizontalAlignment.Right + }), + }; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(84, 0, 16, 100), content.Bounds); + } + + [Fact] + public void Content_Can_Be_Bottom_Aligned() + { + Border content; + var target = new ScrollContentPresenter + { + Content = (content = new Border + { + Padding = new Thickness(8), + VerticalAlignment = VerticalAlignment.Bottom, + }), + }; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(0, 84, 100, 16), content.Bounds); + } + + [Fact] + public void Content_Can_Be_TopRight_Aligned() + { + Border content; + var target = new ScrollContentPresenter + { + Content = (content = new Border + { + Padding = new Thickness(8), + HorizontalAlignment = HorizontalAlignment.Right, + VerticalAlignment = VerticalAlignment.Top, + }), + }; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(84, 0, 16, 16), content.Bounds); + } + + [Fact] + public void Content_Can_Be_Larger_Than_Viewport() + { + Border content; + var target = new ScrollContentPresenter + { + Content = (content = new Border + { + Width = 150, + Height = 150, + }), + }; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(0, 0, 150, 150), content.Bounds); + } + + [Fact] + public void Content_Can_Be_Offset() + { + Border content; + var target = new ScrollContentPresenter + { + Content = (content = new Border + { + Width = 150, + Height = 150, + }), + Offset = new Vector(25, 25), + }; + + target.Measure(new Size(100, 100)); + target.Arrange(new Rect(0, 0, 100, 100)); + + Assert.Equal(new Rect(-25, -25, 150, 150), content.Bounds); + } + [Fact] public void Arrange_Should_Set_Viewport_And_Extent_In_That_Order() { diff --git a/Tests/Perspex.Controls.UnitTests/ScrollViewerTests.cs b/Tests/Perspex.Controls.UnitTests/ScrollViewerTests.cs index 6a494577c8..deccb37246 100644 --- a/Tests/Perspex.Controls.UnitTests/ScrollViewerTests.cs +++ b/Tests/Perspex.Controls.UnitTests/ScrollViewerTests.cs @@ -13,6 +13,7 @@ namespace Perspex.Controls.UnitTests using Perspex.Controls.Templates; using Perspex.VisualTree; using Xunit; + using Perspex.Layout; public class ScrollViewerTests {