diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/CustomHitTestBorder.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/CustomHitTestBorder.cs new file mode 100644 index 0000000000..3221f097ad --- /dev/null +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/CustomHitTestBorder.cs @@ -0,0 +1,17 @@ +using Avalonia.Controls; +using Avalonia.Media; +using Avalonia.Rendering; + +namespace Avalonia.Visuals.UnitTests.Rendering +{ + internal class CustomHitTestBorder : Border, ICustomHitTest + { + public bool HitTest(Point point) + { + // Move hit testing window halfway to the left + return Bounds + .WithX(Bounds.X - Bounds.Width / 2) + .Contains(point); + } + } +} diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs index 90b01e2ddb..d24d183709 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs @@ -1,6 +1,9 @@ -using System.Linq; +using System; +using System.Linq; using Avalonia.Controls; using Avalonia.Controls.Presenters; +using Avalonia.Controls.Shapes; +using Avalonia.Input; using Avalonia.Layout; using Avalonia.Media; using Avalonia.Platform; @@ -9,8 +12,6 @@ using Avalonia.UnitTests; using Avalonia.VisualTree; using Moq; using Xunit; -using System; -using Avalonia.Controls.Shapes; namespace Avalonia.Visuals.UnitTests.Rendering { @@ -501,6 +502,42 @@ namespace Avalonia.Visuals.UnitTests.Rendering } } + [Fact] + public void HitTest_Should_Accommodate_ICustomHitTest() + { + using (TestApplication()) + { + Border border; + + var root = new TestRoot + { + Width = 300, + Height = 200, + Child = border = new CustomHitTestBorder + { + Width = 100, + Height = 100, + Background = Brushes.Red, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center + } + }; + + root.Renderer = new DeferredRenderer(root, null); + root.Measure(Size.Infinity); + root.Arrange(new Rect(root.DesiredSize)); + + var result = root.Renderer.HitTest(new Point(75, 100), root, null); + Assert.Equal(new[] { border }, result); + + result = root.Renderer.HitTest(new Point(125, 100), root, null); + Assert.Equal(new[] { border }, result); + + result = root.Renderer.HitTest(new Point(175, 100), root, null); + Assert.Empty(result); + } + } + private IDisposable TestApplication() { return UnitTestApplication.Start(TestServices.MockPlatformRenderInterface); diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs index c4ef9d5ee7..a3b0a0cdd5 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs @@ -413,6 +413,43 @@ namespace Avalonia.Visuals.UnitTests.Rendering } } + [Fact] + public void HitTest_Should_Accommodate_ICustomHitTest() + { + using (TestApplication()) + { + Border border; + + var root = new TestRoot + { + Width = 300, + Height = 200, + Child = border = new CustomHitTestBorder + { + Width = 100, + Height = 100, + Background = Brushes.Red, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center + } + }; + + root.Renderer = new ImmediateRenderer(root); + root.Measure(Size.Infinity); + root.Arrange(new Rect(root.DesiredSize)); + root.Renderer.Paint(new Rect(root.ClientSize)); + + var result = root.Renderer.HitTest(new Point(75, 100), root, null).First(); + Assert.Equal(border, result); + + result = root.Renderer.HitTest(new Point(125, 100), root, null).First(); + Assert.Equal(border, result); + + result = root.Renderer.HitTest(new Point(175, 100), root, null).First(); + Assert.Equal(root, result); + } + } + private IDisposable TestApplication() { return UnitTestApplication.Start(TestServices.MockPlatformRenderInterface);