PointerTestsBase.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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.VisualTree;
  11. using Moq;
  12. namespace Avalonia.Base.UnitTests.Input;
  13. public abstract class PointerTestsBase
  14. {
  15. protected static void SetHit(Mock<IRenderer> renderer, Control? hit)
  16. {
  17. renderer.Setup(x => x.HitTest(It.IsAny<Point>(), It.IsAny<Visual>(), It.IsAny<Func<Visual, bool>>()))
  18. .Returns(hit is null ? Array.Empty<Control>() : new[] { hit });
  19. renderer.Setup(x => x.HitTestFirst(It.IsAny<Point>(), It.IsAny<Visual>(), It.IsAny<Func<Visual, bool>>()))
  20. .Returns(hit);
  21. }
  22. protected static void SetMove(Mock<IPointerDevice> deviceMock, IInputRoot root, IInputElement element)
  23. {
  24. deviceMock.Setup(d => d.ProcessRawEvent(It.IsAny<RawPointerEventArgs>()))
  25. .Callback(() => element.RaiseEvent(CreatePointerMovedArgs(root, element)));
  26. }
  27. protected static Mock<IWindowImpl> CreateTopLevelImplMock(IRenderer renderer)
  28. {
  29. var impl = new Mock<IWindowImpl>();
  30. impl.DefaultValue = DefaultValue.Mock;
  31. impl.SetupAllProperties();
  32. impl.SetupGet(r => r.RenderScaling).Returns(1);
  33. impl.Setup(r => r.TryGetFeature(It.IsAny<Type>())).Returns(null);
  34. impl.Setup(r => r.CreateRenderer(It.IsAny<IRenderRoot>())).Returns(renderer);
  35. impl.Setup(r => r.PointToScreen(It.IsAny<Point>())).Returns<Point>(p => new PixelPoint((int)p.X, (int)p.Y));
  36. impl.Setup(r => r.PointToClient(It.IsAny<PixelPoint>())).Returns<PixelPoint>(p => new Point(p.X, p.Y));
  37. return impl;
  38. }
  39. protected static IInputRoot CreateInputRoot(IWindowImpl impl, Control child)
  40. {
  41. var root = new Window(impl)
  42. {
  43. Width = 100,
  44. Height = 100,
  45. Content = child,
  46. Template = new FuncControlTemplate<Window>((w, _) => new ContentPresenter { Content = w.Content })
  47. };
  48. root.Show();
  49. return root;
  50. }
  51. protected static RawPointerEventArgs CreateRawPointerMovedArgs(
  52. IPointerDevice pointerDevice,
  53. IInputRoot root,
  54. Point? positition = null)
  55. {
  56. return new RawPointerEventArgs(pointerDevice, 0, root, RawPointerEventType.Move,
  57. positition ?? default, default);
  58. }
  59. protected static PointerEventArgs CreatePointerMovedArgs(
  60. IInputRoot root, IInputElement? source, Point? positition = null)
  61. {
  62. return new PointerEventArgs(InputElement.PointerMovedEvent, source, new Mock<IPointer>().Object, (Visual)root,
  63. positition ?? default, default, PointerPointProperties.None, KeyModifiers.None);
  64. }
  65. protected static Mock<IPointerDevice> CreatePointerDeviceMock(
  66. IPointer? pointer = null,
  67. PointerType pointerType = PointerType.Mouse)
  68. {
  69. if (pointer is null)
  70. {
  71. var pointerMock = new Mock<IPointer>();
  72. pointerMock.SetupGet(p => p.Type).Returns(pointerType);
  73. pointer = pointerMock.Object;
  74. }
  75. var pointerDevice = new Mock<IPointerDevice>();
  76. pointerDevice.Setup(d => d.TryGetPointer(It.IsAny<RawPointerEventArgs>()))
  77. .Returns(pointer);
  78. return pointerDevice;
  79. }
  80. }