MouseDeviceTests.cs 4.2 KB

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