public void RelativePositionRespectsPadding(double left, double top,
                                                    double right, double bottom, double expectedX, double expectedY)
        {
            double width  = 20;
            double height = 20;
            double propX  = 0.5;
            double propY  = 0.5;

            var abs = CreateTestLayout();

            var padding = new Thickness(left, top, right, bottom);

            abs.Padding.Returns(padding);

            var child = CreateTestView();

            SubstituteChildren(abs, child);

            var childBounds = new Rectangle(propX, propY, width, height);

            SetLayoutBounds(abs, child, childBounds);
            SetLayoutFlags(abs, child, AbsoluteLayoutFlags.PositionProportional);

            var manager = new AbsoluteLayoutManager(abs);

            manager.Measure(100, 100);
            manager.ArrangeChildren(new Rectangle(0, 0, 100, 100));

            var expectedRectangle = new Rectangle(expectedX, expectedY, width, height);

            child.Received().Arrange(Arg.Is(expectedRectangle));
        }
        public void ArrangeAccountsForFill()
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rectangle(0, 0, 100, 100);

            SetLayoutBounds(abs, child, childBounds);

            var layoutManager = new AbsoluteLayoutManager(abs);

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

            var arrangedWidth  = 1000;
            var arrangedHeight = 1000;

            var target = new Rectangle(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);
        }
        public void RelativePositionRelativeSize(double propX, double propY, double propHeight, double propWidth)
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rectangle(propX, propY, propWidth, propHeight);

            SetLayoutBounds(abs, child, childBounds);
            SetLayoutFlags(abs, child, AbsoluteLayoutFlags.All);

            var manager = new AbsoluteLayoutManager(abs);

            manager.Measure(100, 100);
            manager.ArrangeChildren(new Rectangle(0, 0, 100, 100));

            double expectedWidth  = 100 * propWidth;
            double expectedHeight = 100 * propHeight;
            double expectedX      = (100 - expectedWidth) * propX;
            double expectedY      = (100 - expectedHeight) * propY;

            var expectedRectangle = new Rectangle(expectedX, expectedY, expectedWidth, expectedHeight);

            child.Received().Arrange(Arg.Is(expectedRectangle));
        }
        Size MeasureAndArrange(IAbsoluteLayout absoluteLayout, double widthConstraint = double.PositiveInfinity, double heightConstraint = double.PositiveInfinity, double left = 0, double top = 0)
        {
            var manager      = new AbsoluteLayoutManager(absoluteLayout);
            var measuredSize = manager.Measure(widthConstraint, heightConstraint);

            manager.ArrangeChildren(new Rectangle(new Point(left, top), measuredSize));

            return(measuredSize);
        }
        public void MeasureRespectsMinWidth(double minWidth, double viewWidth, double expectedWidth)
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rectangle(0, 0, viewWidth, 100);

            SetLayoutBounds(abs, child, childBounds);

            abs.MinimumWidth.Returns(minWidth);

            var gridLayoutManager = new AbsoluteLayoutManager(abs);
            var measure           = gridLayoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            Assert.Equal(expectedWidth, measure.Width);
        }
        public void MeasureRespectsMaxHeight(double maxHeight, double viewHeight, double expectedHeight)
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rectangle(0, 0, 100, viewHeight);

            SetLayoutBounds(abs, child, childBounds);

            abs.MaximumHeight.Returns(maxHeight);

            var layoutManager = new AbsoluteLayoutManager(abs);
            var measure       = layoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            Assert.Equal(expectedHeight, measure.Height);
        }
        public void ChildMeasureRespectsAbsoluteBounds()
        {
            double expectedWidth  = 115;
            double expectedHeight = 230;

            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rectangle(0, 0, expectedWidth, expectedHeight);

            SetLayoutBounds(abs, child, childBounds);

            var gridLayoutManager = new AbsoluteLayoutManager(abs);
            var measure           = gridLayoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            child.Received().Measure(Arg.Is(expectedWidth), Arg.Is(expectedHeight));
        }
        public void MinHeightDominatesMaxHeight()
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rectangle(0, 0, 100, 100);

            SetLayoutBounds(abs, child, childBounds);

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

            var gridLayoutManager = new AbsoluteLayoutManager(abs);
            var measure           = gridLayoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            // The minimum value should beat out the maximum value
            Assert.Equal(75, measure.Height);
        }
        public void MaxWidthDominatesWidth()
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rectangle(0, 0, 100, 100);

            SetLayoutBounds(abs, child, childBounds);

            abs.Width.Returns(75);
            abs.MaximumWidth.Returns(50);

            var gridLayoutManager = new AbsoluteLayoutManager(abs);
            var measure           = gridLayoutManager.Measure(double.PositiveInfinity, double.PositiveInfinity);

            // The maximum value beats out the explicit value
            Assert.Equal(50, measure.Width);
        }
        public void ChildMeasureRespectsProportionalBounds()
        {
            double expectedWidth  = 0.5;
            double expectedHeight = 0.6;

            double widthConstraint  = 200;
            double heightConstraint = 200;

            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rectangle(0, 0, expectedWidth, expectedHeight);

            SetLayoutBounds(abs, child, childBounds);
            SetLayoutFlags(abs, child, AbsoluteLayoutFlags.SizeProportional);

            var gridLayoutManager = new AbsoluteLayoutManager(abs);
            var measure           = gridLayoutManager.Measure(widthConstraint, heightConstraint);

            child.Received().Measure(Arg.Is(expectedWidth * widthConstraint), Arg.Is(expectedHeight * heightConstraint));
        }
        public void RtlShouldHaveFirstItemOnTheRight()
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);
            var childBounds = new Rect(10, 0, 100, 100);

            SetLayoutBounds(abs, child, childBounds);

            abs.FlowDirection.Returns(FlowDirection.RightToLeft);

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

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

            // We expect that the view should be arranged on the right
            var expectedRectangle = new Rect(0, 0, 100, 100);

            abs[0].Received().Arrange(Arg.Is(expectedRectangle));
        }
        public void AbsolutePositionRelativeSize()
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);

            var childBounds = new Rectangle(10, 20, 0.4, 0.5);

            SetLayoutBounds(abs, child, childBounds);
            SetLayoutFlags(abs, child, AbsoluteLayoutFlags.SizeProportional);

            var manager = new AbsoluteLayoutManager(abs);

            var measure = manager.Measure(100, 100);

            manager.ArrangeChildren(new Rectangle(0, 0, 100, 100));

            var expectedMeasure = new Size(10 + 40, 20 + 50);

            Assert.Equal(expectedMeasure, measure);
            child.Received().Arrange(Arg.Is <Rectangle>(r => r.X == 10 && r.Y == 20 && r.Width == 40 && r.Height == 50));
        }
        public void RelativePositionAbsoluteSize(double width, double height, double propX, double propY)
        {
            var abs   = CreateTestLayout();
            var child = CreateTestView();

            SubstituteChildren(abs, child);

            var childBounds = new Rect(propX, propY, width, height);

            SetLayoutBounds(abs, child, childBounds);
            SetLayoutFlags(abs, child, AbsoluteLayoutFlags.PositionProportional);

            var manager = new AbsoluteLayoutManager(abs);

            manager.Measure(100, 100);
            manager.ArrangeChildren(new Rect(0, 0, 100, 100));

            double expectedX = (100 - width) * propX;
            double expectedY = (100 - height) * propY;

            var expectedRectangle = new Rect(expectedX, expectedY, width, height);

            child.Received().Arrange(Arg.Is(expectedRectangle));
        }