浏览代码

Added test for mouse device

Yoh Deadfall 2 年之前
父节点
当前提交
a62096ed05

+ 53 - 3
tests/Avalonia.Base.UnitTests/Input/MouseDeviceTests.cs

@@ -1,13 +1,63 @@
 using Avalonia.Controls;
 using Avalonia.Controls;
 using Avalonia.Input;
 using Avalonia.Input;
+using Avalonia.Input.Raw;
 using Avalonia.Media;
 using Avalonia.Media;
+using Avalonia.Platform;
 using Avalonia.UnitTests;
 using Avalonia.UnitTests;
+using Moq;
 using Xunit;
 using Xunit;
 
 
 namespace Avalonia.Base.UnitTests.Input
 namespace Avalonia.Base.UnitTests.Input
 {
 {
     public class MouseDeviceTests : PointerTestsBase
     public class MouseDeviceTests : PointerTestsBase
     {
     {
+        [Fact]
+        public void Initial_Buttons_Are_Not_Set_Without_Corresponding_Mouse_Down()
+        {
+            using var scope = AvaloniaLocator.EnterScope();
+            var settingsMock = new Mock<IPlatformSettings>();
+            var threadingMock = new Mock<IPlatformThreadingInterface>();
+
+            threadingMock.Setup(x => x.CurrentThreadIsLoopThread).Returns(true);
+
+            AvaloniaLocator.CurrentMutable.BindToSelf(this)
+                .Bind<IPlatformSettings>().ToConstant(settingsMock.Object);
+
+            using var app = UnitTestApplication.Start(
+                new TestServices(
+                    inputManager: new InputManager(),
+                    threadingInterface: threadingMock.Object));
+
+            var renderer = RendererMocks.CreateRenderer();
+            var device = new MouseDevice();
+            var impl = CreateTopLevelImplMock(renderer.Object);
+
+            var control = new Control();
+            var root = CreateInputRoot(impl.Object, control);
+           
+            MouseButton button = default;
+
+            root.PointerReleased += (s, e) => button = e.InitialPressMouseButton;
+
+            var down = CreateRawPointerArgs(device, root, RawPointerEventType.LeftButtonDown);
+            var up = CreateRawPointerArgs(device, root, RawPointerEventType.LeftButtonUp);
+
+            SetHit(renderer, control);
+
+            impl.Object.Input!(up);
+
+            Assert.Equal(MouseButton.None, button);
+
+            impl.Object.Input!(down);
+            impl.Object.Input!(up);
+
+            Assert.Equal(MouseButton.Left, button);
+           
+            impl.Object.Input!(up);
+
+            Assert.Equal(MouseButton.None, button);        
+        }
+
         [Fact]
         [Fact]
         public void Capture_Is_Transferred_To_Parent_When_Control_Removed()
         public void Capture_Is_Transferred_To_Parent_When_Control_Removed()
         {
         {
@@ -37,7 +87,7 @@ namespace Avalonia.Base.UnitTests.Input
             impl.Object.Input!(CreateRawPointerMovedArgs(device, root));
             impl.Object.Input!(CreateRawPointerMovedArgs(device, root));
 
 
             Assert.NotNull(result);
             Assert.NotNull(result);
-            
+           
             result.Capture(control);
             result.Capture(control);
             Assert.Same(control, result.Captured);
             Assert.Same(control, result.Captured);
 
 
@@ -67,8 +117,8 @@ namespace Avalonia.Base.UnitTests.Input
                     })
                     })
                 }
                 }
             });
             });
-            
-            
+           
+           
             Point? result = null;
             Point? result = null;
             root.PointerMoved += (_, a) =>
             root.PointerMoved += (_, a) =>
             {
             {

+ 13 - 4
tests/Avalonia.Base.UnitTests/Input/PointerTestsBase.cs

@@ -55,20 +55,29 @@ public abstract class PointerTestsBase
         return root;
         return root;
     }
     }
 
 
+    protected static RawPointerEventArgs CreateRawPointerArgs(
+        IPointerDevice pointerDevice,
+        IInputRoot root,
+        RawPointerEventType type,
+        Point? position = default)
+    {
+        return new RawPointerEventArgs(pointerDevice, 0, root, type, position ?? default, default);
+    }
+
     protected static RawPointerEventArgs CreateRawPointerMovedArgs(
     protected static RawPointerEventArgs CreateRawPointerMovedArgs(
         IPointerDevice pointerDevice,
         IPointerDevice pointerDevice,
         IInputRoot root,
         IInputRoot root,
-        Point? positition = null)
+        Point? position = null)
     {
     {
         return new RawPointerEventArgs(pointerDevice, 0, root, RawPointerEventType.Move,
         return new RawPointerEventArgs(pointerDevice, 0, root, RawPointerEventType.Move,
-            positition ?? default, default);
+            position ?? default, default);
     }
     }
 
 
     protected static PointerEventArgs CreatePointerMovedArgs(
     protected static PointerEventArgs CreatePointerMovedArgs(
-        IInputRoot root, IInputElement? source, Point? positition = null)
+        IInputRoot root, IInputElement? source, Point? position = null)
     {
     {
         return new PointerEventArgs(InputElement.PointerMovedEvent, source, new Mock<IPointer>().Object, (Visual)root,
         return new PointerEventArgs(InputElement.PointerMovedEvent, source, new Mock<IPointer>().Object, (Visual)root,
-            positition ?? default, default, PointerPointProperties.None, KeyModifiers.None);
+            position ?? default, default, PointerPointProperties.None, KeyModifiers.None);
     }
     }
 
 
     protected static Mock<IPointerDevice> CreatePointerDeviceMock(
     protected static Mock<IPointerDevice> CreatePointerDeviceMock(