PointerTestsBase.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #nullable enable
  2. using System;
  3. using Avalonia.Controls;
  4. using Avalonia.Controls.Presenters;
  5. using Avalonia.Controls.Templates;
  6. using Avalonia.Input;
  7. using Avalonia.Input.Raw;
  8. using Avalonia.Platform;
  9. using Avalonia.Rendering;
  10. using Avalonia.Rendering.Composition;
  11. using Avalonia.UnitTests;
  12. using Avalonia.VisualTree;
  13. using Moq;
  14. namespace Avalonia.Base.UnitTests.Input;
  15. public abstract class PointerTestsBase : ScopedTestBase
  16. {
  17. private protected static void SetHit(Mock<IHitTester> renderer, Control? hit)
  18. {
  19. renderer.Setup(x => x.HitTest(It.IsAny<Point>(), It.IsAny<Visual>(), It.IsAny<Func<Visual, bool>>()))
  20. .Returns(hit is null ? Array.Empty<Control>() : new[] { hit });
  21. renderer.Setup(x => x.HitTestFirst(It.IsAny<Point>(), It.IsAny<Visual>(), It.IsAny<Func<Visual, bool>>()))
  22. .Returns(hit);
  23. }
  24. protected static void SetMove(Mock<IPointerDevice> deviceMock, IInputRoot root, IInputElement element)
  25. {
  26. deviceMock.Setup(d => d.ProcessRawEvent(It.IsAny<RawPointerEventArgs>()))
  27. .Callback(() => element.RaiseEvent(CreatePointerMovedArgs(root, element)));
  28. }
  29. private protected static Mock<IWindowImpl> CreateTopLevelImplMock()
  30. {
  31. var impl = new Mock<IWindowImpl>();
  32. impl.DefaultValue = DefaultValue.Mock;
  33. impl.SetupAllProperties();
  34. impl.SetupGet(r => r.RenderScaling).Returns(1);
  35. impl.Setup(r => r.TryGetFeature(It.IsAny<Type>())).Returns(null);
  36. impl.Setup(r => r.Compositor).Returns(RendererMocks.CreateDummyCompositor());
  37. impl.Setup(r => r.PointToScreen(It.IsAny<Point>())).Returns<Point>(p => new PixelPoint((int)p.X, (int)p.Y));
  38. impl.Setup(r => r.PointToClient(It.IsAny<PixelPoint>())).Returns<PixelPoint>(p => new Point(p.X, p.Y));
  39. var screen1 = new Mock<Screen>(1.75, new PixelRect(new PixelSize(1920, 1080)), new PixelRect(new PixelSize(1920, 966)), true);
  40. var screens = new Mock<IScreenImpl>();
  41. screens.Setup(x => x.ScreenFromWindow(It.IsAny<IWindowBaseImpl>())).Returns(screen1.Object);
  42. impl.Setup(x => x.TryGetFeature(It.Is<Type>(t => t == typeof(IScreenImpl)))).Returns(screens.Object);
  43. return impl;
  44. }
  45. private protected static TopLevel CreateInputRoot(IWindowImpl impl, Control child, IHitTester hitTester)
  46. {
  47. var root = new Window(impl)
  48. {
  49. Width = 100,
  50. Height = 100,
  51. Content = child,
  52. Template = new FuncControlTemplate<Window>((w, _) => new ContentPresenter { Content = w.Content }),
  53. HitTesterOverride = hitTester
  54. };
  55. root.Show();
  56. return root;
  57. }
  58. protected static RawPointerEventArgs CreateRawPointerArgs(
  59. IPointerDevice pointerDevice,
  60. IInputRoot root,
  61. RawPointerEventType type,
  62. Point? position = default)
  63. {
  64. return new RawPointerEventArgs(pointerDevice, 0, root, type, position ?? default, default);
  65. }
  66. protected static RawPointerEventArgs CreateRawPointerMovedArgs(
  67. IPointerDevice pointerDevice,
  68. IInputRoot root,
  69. Point? position = null)
  70. {
  71. return new RawPointerEventArgs(pointerDevice, 0, root, RawPointerEventType.Move,
  72. position ?? default, default);
  73. }
  74. protected static PointerEventArgs CreatePointerMovedArgs(
  75. IInputRoot root, IInputElement? source, Point? position = null)
  76. {
  77. return new PointerEventArgs(InputElement.PointerMovedEvent, source, new Mock<IPointer>().Object, (Visual)root,
  78. position ?? default, default, PointerPointProperties.None, KeyModifiers.None);
  79. }
  80. protected static Mock<IPointerDevice> CreatePointerDeviceMock(
  81. IPointer? pointer = null,
  82. PointerType pointerType = PointerType.Mouse)
  83. {
  84. if (pointer is null)
  85. {
  86. var pointerMock = new Mock<IPointer>();
  87. pointerMock.SetupGet(p => p.Type).Returns(pointerType);
  88. pointer = pointerMock.Object;
  89. }
  90. var pointerDevice = new Mock<IPointerDevice>();
  91. pointerDevice.Setup(d => d.TryGetPointer(It.IsAny<RawPointerEventArgs>()))
  92. .Returns(pointer);
  93. return pointerDevice;
  94. }
  95. }