MouseDeviceTests.cs 4.2 KB

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