MouseDeviceTests.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using Avalonia.Controls;
  2. using Avalonia.Input;
  3. using Avalonia.Input.Raw;
  4. using Avalonia.Media;
  5. using Avalonia.Platform;
  6. using Avalonia.Threading;
  7. using Avalonia.UnitTests;
  8. using Moq;
  9. using Xunit;
  10. namespace Avalonia.Base.UnitTests.Input
  11. {
  12. public class MouseDeviceTests : PointerTestsBase
  13. {
  14. [Fact]
  15. public void Initial_Buttons_Are_Not_Set_Without_Corresponding_Mouse_Down()
  16. {
  17. using var scope = AvaloniaLocator.EnterScope();
  18. var settingsMock = new Mock<IPlatformSettings>();
  19. var dispatcherMock = new Mock<IDispatcherImpl>();
  20. dispatcherMock.Setup(x => x.CurrentThreadIsLoopThread).Returns(true);
  21. AvaloniaLocator.CurrentMutable.BindToSelf(this)
  22. .Bind<IPlatformSettings>().ToConstant(settingsMock.Object);
  23. using var app = UnitTestApplication.Start(
  24. new TestServices(
  25. inputManager: new InputManager(),
  26. dispatcherImpl: dispatcherMock.Object));
  27. var renderer = RendererMocks.CreateRenderer();
  28. var device = new MouseDevice();
  29. var impl = CreateTopLevelImplMock(renderer.Object);
  30. var control = new Control();
  31. var root = CreateInputRoot(impl.Object, control);
  32. MouseButton button = default;
  33. root.PointerReleased += (s, e) => button = e.InitialPressMouseButton;
  34. var down = CreateRawPointerArgs(device, root, RawPointerEventType.LeftButtonDown);
  35. var up = CreateRawPointerArgs(device, root, RawPointerEventType.LeftButtonUp);
  36. SetHit(renderer, control);
  37. impl.Object.Input!(up);
  38. Assert.Equal(MouseButton.None, button);
  39. impl.Object.Input!(down);
  40. impl.Object.Input!(up);
  41. Assert.Equal(MouseButton.Left, button);
  42. impl.Object.Input!(up);
  43. Assert.Equal(MouseButton.None, button);
  44. }
  45. [Fact]
  46. public void Capture_Is_Transferred_To_Parent_When_Control_Removed()
  47. {
  48. using var app = UnitTestApplication.Start(new TestServices(inputManager: new InputManager()));
  49. var renderer = RendererMocks.CreateRenderer();
  50. var device = new MouseDevice();
  51. var impl = CreateTopLevelImplMock(renderer.Object);
  52. Canvas control;
  53. Panel rootChild;
  54. var root = CreateInputRoot(impl.Object, rootChild = new Panel
  55. {
  56. Children =
  57. {
  58. (control = new Canvas())
  59. }
  60. });
  61. // Synthesize event to receive a pointer.
  62. IPointer result = null;
  63. root.PointerMoved += (_, a) =>
  64. {
  65. result = a.Pointer;
  66. };
  67. SetHit(renderer, control);
  68. impl.Object.Input!(CreateRawPointerMovedArgs(device, root));
  69. Assert.NotNull(result);
  70. result.Capture(control);
  71. Assert.Same(control, result.Captured);
  72. rootChild.Children.Clear();
  73. Assert.Same(rootChild, result.Captured);
  74. }
  75. [Fact]
  76. public void GetPosition_Should_Respect_Control_RenderTransform()
  77. {
  78. using var app = UnitTestApplication.Start(new TestServices(inputManager: new InputManager()));
  79. var renderer = RendererMocks.CreateRenderer();
  80. var device = new MouseDevice();
  81. var impl = CreateTopLevelImplMock(renderer.Object);
  82. Border border;
  83. var root = CreateInputRoot(impl.Object, new Panel
  84. {
  85. Children =
  86. {
  87. (border = new Border
  88. {
  89. Background = Brushes.Black,
  90. RenderTransform = new TranslateTransform(10, 0),
  91. })
  92. }
  93. });
  94. Point? result = null;
  95. root.PointerMoved += (_, a) =>
  96. {
  97. result = a.GetPosition(border);
  98. };
  99. SetHit(renderer, border);
  100. impl.Object.Input!(CreateRawPointerMovedArgs(device, root, new Point(11, 11)));
  101. Assert.Equal(new Point(1, 11), result);
  102. }
  103. }
  104. }