PointerTestsBase.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 CreateRawPointerArgs(
  52. IPointerDevice pointerDevice,
  53. IInputRoot root,
  54. RawPointerEventType type,
  55. Point? position = default)
  56. {
  57. return new RawPointerEventArgs(pointerDevice, 0, root, type, position ?? default, default);
  58. }
  59. protected static RawPointerEventArgs CreateRawPointerMovedArgs(
  60. IPointerDevice pointerDevice,
  61. IInputRoot root,
  62. Point? position = null)
  63. {
  64. return new RawPointerEventArgs(pointerDevice, 0, root, RawPointerEventType.Move,
  65. position ?? default, default);
  66. }
  67. protected static PointerEventArgs CreatePointerMovedArgs(
  68. IInputRoot root, IInputElement? source, Point? position = null)
  69. {
  70. return new PointerEventArgs(InputElement.PointerMovedEvent, source, new Mock<IPointer>().Object, (Visual)root,
  71. position ?? default, default, PointerPointProperties.None, KeyModifiers.None);
  72. }
  73. protected static Mock<IPointerDevice> CreatePointerDeviceMock(
  74. IPointer? pointer = null,
  75. PointerType pointerType = PointerType.Mouse)
  76. {
  77. if (pointer is null)
  78. {
  79. var pointerMock = new Mock<IPointer>();
  80. pointerMock.SetupGet(p => p.Type).Returns(pointerType);
  81. pointer = pointerMock.Object;
  82. }
  83. var pointerDevice = new Mock<IPointerDevice>();
  84. pointerDevice.Setup(d => d.TryGetPointer(It.IsAny<RawPointerEventArgs>()))
  85. .Returns(pointer);
  86. return pointerDevice;
  87. }
  88. }