예제 #1
0
        public void DoesNotIgnoreHiddenViews()
        {
            var view       = LayoutTestHelpers.CreateTestView(new Size(100, 100));
            var hiddenView = LayoutTestHelpers.CreateTestView(new Size(100, 100));

            hiddenView.Visibility.Returns(Visibility.Hidden);

            var stack = CreateTestLayout(new List <IView>()
            {
                view, hiddenView
            });

            var manager = new HorizontalStackLayoutManager(stack);
            var measure = manager.Measure(double.PositiveInfinity, 100);

            manager.ArrangeChildren(new Rect(Point.Zero, measure));

            // View is visible, so we expect it to be measured and arranged
            view.Received().Measure(Arg.Any <double>(), Arg.Any <double>());
            view.Received().Arrange(Arg.Any <Rect>());

            // View is hidden, so we expect it to be measured and arranged (since it'll need to take up space)
            hiddenView.Received().Measure(Arg.Any <double>(), Arg.Any <double>());
            hiddenView.Received().Arrange(Arg.Any <Rect>());
        }
예제 #2
0
        public void IgnoresCollapsedViews()
        {
            var view          = LayoutTestHelpers.CreateTestView(new Size(100, 100));
            var collapsedView = LayoutTestHelpers.CreateTestView(new Size(100, 100));

            collapsedView.Visibility.Returns(Visibility.Collapsed);

            var stack = CreateTestLayout(new List <IView>()
            {
                view, collapsedView
            });

            var manager = new HorizontalStackLayoutManager(stack);
            var measure = manager.Measure(double.PositiveInfinity, 100);

            manager.ArrangeChildren(new Rect(Point.Zero, measure));

            // View is visible, so we expect it to be measured and arranged
            view.Received().Measure(Arg.Any <double>(), Arg.Any <double>());
            view.Received().Arrange(Arg.Any <Rect>());

            // View is collapsed, so we expect it not to be measured or arranged
            collapsedView.DidNotReceive().Measure(Arg.Any <double>(), Arg.Any <double>());
            collapsedView.DidNotReceive().Arrange(Arg.Any <Rect>());
        }
예제 #3
0
        public void ViewsArrangedWithDesiredHeights()
        {
            var stack   = CreateTestLayout();
            var manager = new HorizontalStackLayoutManager(stack);

            var view1 = CreateTestView(new Size(100, 200));
            var view2 = CreateTestView(new Size(100, 150));

            var children = new List <IView>()
            {
                view1, view2
            }.AsReadOnly();

            stack.Children.Returns(children);

            var measurement = manager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            manager.Arrange(new Rectangle(Point.Zero, measurement));

            // The tallest IView is 200, so the stack should be that tall
            Assert.Equal(200, measurement.Height);

            // We expect the first IView to be at 0,0 with a width of 100 and a height of 200
            var expectedRectangle1 = new Rectangle(0, 0, 100, 200);

            view1.Received().Arrange(Arg.Is(expectedRectangle1));

            // We expect the second IView to be at 100, 0 with a width of 100 and a height of 150
            var expectedRectangle2 = new Rectangle(100, 0, 100, 150);

            view2.Received().Arrange(Arg.Is(expectedRectangle2));
        }
예제 #4
0
        public void MeasureRespectsMinWidth(double minWidth, double viewWidth, double expectedWidth)
        {
            var stack = BuildStack(viewCount: 1, viewWidth: viewWidth, viewHeight: 100);

            stack.MinimumWidth.Returns(minWidth);

            var gridLayoutManager = new HorizontalStackLayoutManager(stack);
            var measure           = gridLayoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            Assert.Equal(expectedWidth, measure.Width);
        }
예제 #5
0
        public void SpacingMeasurement(int viewCount, double viewWidth, int spacing, double expectedWidth)
        {
            var stack = BuildStack(viewCount, viewWidth, 100);

            stack.Spacing.Returns(spacing);

            var manager      = new HorizontalStackLayoutManager(stack);
            var measuredSize = manager.Measure(double.PositiveInfinity, 100);

            Assert.Equal(expectedWidth, measuredSize.Width);
        }
예제 #6
0
        public void MeasureRespectsMaxHeight(double maxHeight, double viewHeight, double expectedHeight)
        {
            var stack = BuildStack(viewCount: 1, viewWidth: 100, viewHeight: viewHeight);

            stack.MaximumHeight.Returns(maxHeight);

            var layoutManager = new HorizontalStackLayoutManager(stack);
            var measure       = layoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            Assert.Equal(expectedHeight, measure.Height);
        }
예제 #7
0
        public void MinHeightDominatesMaxHeight()
        {
            var stack = BuildStack(viewCount: 1, viewWidth: 100, viewHeight: 100);

            stack.MinimumHeight.Returns(75);
            stack.MaximumHeight.Returns(50);

            var layoutManager = new HorizontalStackLayoutManager(stack);
            var measure       = layoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            // The minimum value should beat out the maximum value
            Assert.Equal(75, measure.Height);
        }
예제 #8
0
        public void MaxHeightDominatesHeight()
        {
            var stack = BuildStack(viewCount: 1, viewWidth: 100, viewHeight: 100);

            stack.Height.Returns(75);
            stack.MaximumHeight.Returns(50);

            var gridLayoutManager = new HorizontalStackLayoutManager(stack);
            var measure           = gridLayoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            // The maximum value beats out the explicit value
            Assert.Equal(50, measure.Height);
        }
예제 #9
0
        public void ArrangeRespectsBounds()
        {
            var stack = BuildStack(viewCount: 1, viewWidth: 100, viewHeight: 100);

            var manager      = new HorizontalStackLayoutManager(stack);
            var measuredSize = manager.Measure(double.PositiveInfinity, 100);

            manager.ArrangeChildren(new Rect(new Point(10, 15), measuredSize));

            var expectedRectangle0 = new Rect(10, 15, 100, 100);

            stack[0].Received().Arrange(Arg.Is(expectedRectangle0));
        }
예제 #10
0
        public void ArrangeAccountsForPadding(double left, double top, double right, double bottom)
        {
            var viewWidth  = 100d;
            var viewHeight = 100d;
            var padding    = new Thickness(left, top, right, bottom);

            var stack = BuildPaddedStack(padding, viewWidth, viewHeight);

            var manager      = new HorizontalStackLayoutManager(stack);
            var measuredSize = manager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            manager.ArrangeChildren(new Rect(Point.Zero, measuredSize));

            AssertArranged(stack[0], padding.Left, padding.Top, viewWidth, viewHeight);
        }
예제 #11
0
        public void ChildMeasureAccountsForPadding(Size viewSize, Thickness padding, Size measureConstraints, Size expectedMeasureConstraint)
        {
            var view  = LayoutTestHelpers.CreateTestView(new Size(viewSize.Width, viewSize.Height));
            var stack = CreateTestLayout(new List <IView>()
            {
                view
            });

            stack.Padding.Returns(padding);

            var manager      = new HorizontalStackLayoutManager(stack);
            var measuredSize = manager.Measure(measureConstraints.Width, measureConstraints.Height);

            view.Received().Measure(Arg.Is(expectedMeasureConstraint.Width), Arg.Is(expectedMeasureConstraint.Height));
        }
예제 #12
0
        public void SpacingArrangementOneItem(int spacing)
        {
            var stack = BuildStack(1, 100, 100);

            stack.Spacing.Returns(spacing);

            var manager = new HorizontalStackLayoutManager(stack);

            var measuredSize = manager.Measure(double.PositiveInfinity, 100);

            manager.ArrangeChildren(new Rect(Point.Zero, measuredSize));

            var expectedRectangle = new Rect(0, 0, 100, 100);

            stack[0].Received().Arrange(Arg.Is(expectedRectangle));
        }
예제 #13
0
        public void StackAppliesWidth(double viewWidth, double stackWidth, double expectedWidth)
        {
            var view = LayoutTestHelpers.CreateTestView(new Size(viewWidth, 100));

            var stack = CreateTestLayout(new List <IView>()
            {
                view
            });

            stack.Width.Returns(stackWidth);

            var manager     = new HorizontalStackLayoutManager(stack);
            var measurement = manager.Measure(double.PositiveInfinity, 100);

            Assert.Equal(expectedWidth, measurement.Width);
        }
예제 #14
0
        public void MeasureAccountsForPadding(double left, double top, double right, double bottom)
        {
            var viewWidth  = 100d;
            var viewHeight = 100d;
            var padding    = new Thickness(left, top, right, bottom);

            var expectedHeight = padding.VerticalThickness + viewHeight;
            var expectedWidth  = padding.HorizontalThickness + viewWidth;

            var stack = BuildPaddedStack(padding, viewWidth, viewHeight);

            var manager      = new HorizontalStackLayoutManager(stack);
            var measuredSize = manager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            Assert.Equal(expectedHeight, measuredSize.Height);
            Assert.Equal(expectedWidth, measuredSize.Width);
        }
예제 #15
0
        public void LtrShouldHaveFirstItemOnTheLeft()
        {
            var stack = BuildStack(viewCount: 2, viewWidth: 100, viewHeight: 100);

            stack.FlowDirection.Returns(FlowDirection.LeftToRight);

            var manager      = new HorizontalStackLayoutManager(stack);
            var measuredSize = manager.Measure(double.PositiveInfinity, 100);

            manager.ArrangeChildren(new Rect(Point.Zero, measuredSize));

            // We expect that the starting view (0) should be arranged on the left,
            // and the next rectangle (1) should be on the right
            var expectedRectangle0 = new Rect(0, 0, 100, 100);
            var expectedRectangle1 = new Rect(100, 0, 100, 100);

            stack[0].Received().Arrange(Arg.Is(expectedRectangle0));
            stack[1].Received().Arrange(Arg.Is(expectedRectangle1));
        }
        public void StackAppliesWidth(double viewWidth, double stackWidth, double expectedWidth)
        {
            var stack = CreateTestLayout();

            var view = CreateTestView(new Size(viewWidth, 100));

            var children = new List <IView>()
            {
                view
            }.AsReadOnly();

            stack.Children.Returns(children);
            stack.Width.Returns(stackWidth);

            var manager     = new HorizontalStackLayoutManager(stack);
            var measurement = manager.Measure(double.PositiveInfinity, 100);

            Assert.That(measurement.Width, Is.EqualTo(expectedWidth));
        }
예제 #17
0
        public void SpacingArrangementTwoItems(int spacing)
        {
            var stack = BuildStack(2, 100, 100);

            stack.Spacing.Returns(spacing);

            var manager = new HorizontalStackLayoutManager(stack);

            var measuredSize = manager.Measure(double.PositiveInfinity, 100);

            manager.Arrange(new Rectangle(Point.Zero, measuredSize));

            var expectedRectangle0 = new Rectangle(0, 0, 100, 100);

            stack.Children[0].Received().Arrange(Arg.Is(expectedRectangle0));

            var expectedRectangle1 = new Rectangle(100 + spacing, 0, 100, 100);

            stack.Children[1].Received().Arrange(Arg.Is(expectedRectangle1));
        }
예제 #18
0
        public void ArrangeAccountsForFill()
        {
            var stack = BuildStack(viewCount: 1, viewWidth: 100, viewHeight: 100);

            stack.HorizontalLayoutAlignment.Returns(LayoutAlignment.Fill);
            stack.VerticalLayoutAlignment.Returns(LayoutAlignment.Fill);

            var layoutManager = new HorizontalStackLayoutManager(stack);

            _ = layoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            var arrangedWidth  = 1000;
            var arrangedHeight = 1000;

            var target = new Rect(Point.Zero, new Size(arrangedWidth, arrangedHeight));

            var actual = layoutManager.ArrangeChildren(target);

            // Since we're arranging in a space larger than needed and the layout is set to Fill in both directions,
            // we expect the returned actual arrangement size to be as large as the target space
            Assert.Equal(arrangedWidth, actual.Width);
            Assert.Equal(arrangedHeight, actual.Height);
        }
예제 #19
0
        public void RtlShouldStartAtRightEdge()
        {
            var stack = BuildStack(viewCount: 2, viewWidth: 100, viewHeight: 100);

            stack.FlowDirection.Returns(FlowDirection.RightToLeft);
            stack.HorizontalLayoutAlignment.Returns(LayoutAlignment.Fill);
            stack.Spacing.Returns(0);

            var manager      = new HorizontalStackLayoutManager(stack);
            var measuredSize = manager.Measure(double.PositiveInfinity, 100);

            // Arranging in a larger space than measured to simulate a Fill situation
            var rightEdge = measuredSize.Width * 2;

            manager.ArrangeChildren(new Rect(0, 0, rightEdge, measuredSize.Height));

            // We expect that the starting view (0) should be arranged on the right,
            // and the next rectangle (1) should be on the left
            var expectedRectangle0 = new Rect(rightEdge - 100, 0, 100, 100);
            var expectedRectangle1 = new Rect(rightEdge - 200, 0, 100, 100);

            stack[0].Received().Arrange(Arg.Is(expectedRectangle0));
            stack[1].Received().Arrange(Arg.Is(expectedRectangle1));
        }