Browse Source

another failing unit test for invalidate on immediate renderer when renderedtransfom is used, issue #1998

Andrey Kunchev 7 years ago
parent
commit
5ce71be598
1 changed files with 48 additions and 4 deletions
  1. 48 4
      tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs

+ 48 - 4
tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests.cs

@@ -1,7 +1,7 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
+using System.Collections.Generic;
+using Avalonia.Collections;
 using Avalonia.Media;
+using Avalonia.Platform;
 using Avalonia.Rendering;
 using Avalonia.VisualTree;
 using Moq;
@@ -33,7 +33,6 @@ namespace Avalonia.Visuals.UnitTests.Rendering
             renderRoot.Verify(v => v.Invalidate(new Rect(10, 10, 100, 100)));
         }
 
-
         [Fact]
         public void AddDirty_With_RenderTransform_Call_RenderRoot_Invalidate()
         {
@@ -56,6 +55,51 @@ namespace Avalonia.Visuals.UnitTests.Rendering
             renderRoot.Verify(v => v.Invalidate(new Rect(50, 50, 200, 200)));
         }
 
+        [Fact]
+        public void AddDirty_For_Child_Moved_Should_Invalidate_Previous_Bounds()
+        {
+            var visual = new Mock<Visual>();
+            var child = new Mock<Visual>();
+            var renderRoot = visual.As<IRenderRoot>();
+            var renderTarget = visual.As<IRenderTarget>();
+
+            renderRoot.Setup(r => r.CreateRenderTarget()).Returns(renderTarget.Object);
+            renderTarget.Setup(r => r.CreateDrawingContext(It.IsAny<IVisualBrushRenderer>())).Returns(Mock.Of<IDrawingContextImpl>());
+
+            visual.As<IVisual>().Setup(v => v.Bounds).Returns(new Rect(0, 0, 400, 400));
+            visual.As<IVisual>().Setup(v => v.VisualChildren).Returns(new AvaloniaList<IVisual>() { child.As<IVisual>().Object });
+
+            Rect childBounds = new Rect(0, 0, 100, 100);
+            child.As<IVisual>().Setup(v => v.Bounds).Returns(() => childBounds);
+            child.As<IVisual>().Setup(v => v.VisualParent).Returns(visual.Object);
+            child.As<IVisual>().Setup(v => v.TransformToVisual(It.IsAny<IVisual>())).CallBase();
+            child.As<IVisual>().Setup(v => v.VisualChildren).Returns(new AvaloniaList<IVisual>());
+
+            var invalidationCalls = new List<Rect>();
+
+            renderRoot.Setup(v => v.Invalidate(It.IsAny<Rect>())).Callback<Rect>(v => invalidationCalls.Add(v));
+
+            var target = new ImmediateRenderer(visual.Object);
+
+            target.AddDirty(child.Object);
+
+            Assert.Equal(new Rect(0, 0, 100, 100), invalidationCalls[0]);
+
+            target.Paint(new Rect(0, 0, 100, 100));
+
+            //move child 100 pixels bottom/right
+            childBounds = new Rect(100, 100, 100, 100);
+
+            //renderer should invalidate old child bounds with new one
+            //as on old area there can be artifacts
+            target.AddDirty(child.Object);
+
+            //invalidate first old position
+            Assert.Equal(new Rect(0, 0, 100, 100), invalidationCalls[1]);
+
+            //then new position
+            Assert.Equal(new Rect(100, 100, 100, 100), invalidationCalls[2]);
+        }
 
         public class TestVisual : Visual
         {