From 32d7938c7cdbc346d3eb938c27b9d400dbceffb7 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 25 Jul 2019 00:36:55 +0200 Subject: [PATCH] Added failing tests for #2714. --- .../Rendering/DeferredRenderer.cs | 2 + .../Rendering/DeferredRendererTests.cs | 174 ++++++++++++++++++ 2 files changed, 176 insertions(+) diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 0d077d2a3a..b6546eee08 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -229,6 +229,8 @@ namespace Avalonia.Rendering internal void UnitTestRender() => Render(false); + internal Scene UnitTestScene() => _scene.Item; + private void Render(bool forceComposite) { using (var l = _lock.TryLock()) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs index f094d9c78d..4c302a24a2 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests.cs @@ -96,6 +96,180 @@ namespace Avalonia.Visuals.UnitTests.Rendering Assert.Equal(new List { root, decorator, border, canvas }, result); } + [Fact] + public void Should_Update_VisualNode_Order_On_Child_Remove_Insert() + { + var dispatcher = new ImmediateDispatcher(); + var loop = new Mock(); + + StackPanel stack; + Canvas canvas1; + Canvas canvas2; + var root = new TestRoot + { + Child = stack = new StackPanel + { + Children= + { + (canvas1 = new Canvas()), + (canvas2 = new Canvas()), + } + } + }; + + var sceneBuilder = new SceneBuilder(); + var target = new DeferredRenderer( + root, + loop.Object, + sceneBuilder: sceneBuilder, + dispatcher: dispatcher); + + root.Renderer = target; + target.Start(); + RunFrame(target); + + stack.Children.Remove(canvas2); + stack.Children.Insert(0, canvas2); + + RunFrame(target); + + var scene = target.UnitTestScene(); + var stackNode = scene.FindNode(stack); + + Assert.Same(stackNode.Children[0].Visual, canvas2); + Assert.Same(stackNode.Children[1].Visual, canvas1); + } + + [Fact] + public void Should_Update_VisualNode_Order_On_Child_Move() + { + var dispatcher = new ImmediateDispatcher(); + var loop = new Mock(); + + StackPanel stack; + Canvas canvas1; + Canvas canvas2; + var root = new TestRoot + { + Child = stack = new StackPanel + { + Children = + { + (canvas1 = new Canvas()), + (canvas2 = new Canvas()), + } + } + }; + + var sceneBuilder = new SceneBuilder(); + var target = new DeferredRenderer( + root, + loop.Object, + sceneBuilder: sceneBuilder, + dispatcher: dispatcher); + + root.Renderer = target; + target.Start(); + RunFrame(target); + + stack.Children.Move(1, 0); + + RunFrame(target); + + var scene = target.UnitTestScene(); + var stackNode = scene.FindNode(stack); + + Assert.Same(stackNode.Children[0].Visual, canvas2); + Assert.Same(stackNode.Children[1].Visual, canvas1); + } + + [Fact] + public void Should_Update_VisualNode_Order_On_ZIndex_Change() + { + var dispatcher = new ImmediateDispatcher(); + var loop = new Mock(); + + StackPanel stack; + Canvas canvas1; + Canvas canvas2; + var root = new TestRoot + { + Child = stack = new StackPanel + { + Children = + { + (canvas1 = new Canvas { ZIndex = 1 }), + (canvas2 = new Canvas { ZIndex = 2 }), + } + } + }; + + var sceneBuilder = new SceneBuilder(); + var target = new DeferredRenderer( + root, + loop.Object, + sceneBuilder: sceneBuilder, + dispatcher: dispatcher); + + root.Renderer = target; + target.Start(); + RunFrame(target); + + canvas1.ZIndex = 3; + + RunFrame(target); + + var scene = target.UnitTestScene(); + var stackNode = scene.FindNode(stack); + + Assert.Same(stackNode.Children[0].Visual, canvas2); + Assert.Same(stackNode.Children[1].Visual, canvas1); + } + + [Fact] + public void Should_Update_VisualNode_Order_On_ZIndex_Change_With_Dirty_Ancestor() + { + var dispatcher = new ImmediateDispatcher(); + var loop = new Mock(); + + StackPanel stack; + Canvas canvas1; + Canvas canvas2; + var root = new TestRoot + { + Child = stack = new StackPanel + { + Children = + { + (canvas1 = new Canvas { ZIndex = 1 }), + (canvas2 = new Canvas { ZIndex = 2 }), + } + } + }; + + var sceneBuilder = new SceneBuilder(); + var target = new DeferredRenderer( + root, + loop.Object, + sceneBuilder: sceneBuilder, + dispatcher: dispatcher); + + root.Renderer = target; + target.Start(); + RunFrame(target); + + root.InvalidateVisual(); + canvas1.ZIndex = 3; + + RunFrame(target); + + var scene = target.UnitTestScene(); + var stackNode = scene.FindNode(stack); + + Assert.Same(stackNode.Children[0].Visual, canvas2); + Assert.Same(stackNode.Children[1].Visual, canvas1); + } + [Fact] public void Should_Push_Opacity_For_Controls_With_Less_Than_1_Opacity() {