| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- using Avalonia.Controls;
- using Avalonia.Input.Raw;
- using Avalonia.Interactivity;
- using Avalonia.Media;
- using Avalonia.Rendering;
- using Avalonia.UnitTests;
- using Avalonia.VisualTree;
- using Moq;
- using System;
- using System.Collections.Generic;
- using Xunit;
- namespace Avalonia.Input.UnitTests
- {
- public class MouseDeviceTests
- {
- [Fact]
- public void Capture_Is_Transferred_To_Parent_When_Control_Removed()
- {
- Canvas control;
- var root = new TestRoot
- {
- Child = control = new Canvas(),
- };
- var target = new MouseDevice();
- target.Capture(control);
- Assert.Same(control, target.Captured);
- root.Child = null;
- Assert.Same(root, target.Captured);
- }
- [Fact]
- public void MouseMove_Should_Update_IsPointerOver()
- {
- var renderer = new Mock<IRenderer>();
- using (TestApplication(renderer.Object))
- {
- var inputManager = InputManager.Instance;
- Canvas canvas;
- Border border;
- Decorator decorator;
- var root = new TestRoot
- {
- MouseDevice = new MouseDevice(),
- Renderer = renderer.Object,
- Child = new Panel
- {
- Children =
- {
- (canvas = new Canvas()),
- (border = new Border
- {
- Child = decorator = new Decorator(),
- })
- }
- }
- };
- SetHit(renderer, decorator);
- SendMouseMove(inputManager, root);
- Assert.True(decorator.IsPointerOver);
- Assert.True(border.IsPointerOver);
- Assert.False(canvas.IsPointerOver);
- Assert.True(root.IsPointerOver);
- SetHit(renderer, canvas);
- SendMouseMove(inputManager, root);
- Assert.False(decorator.IsPointerOver);
- Assert.False(border.IsPointerOver);
- Assert.True(canvas.IsPointerOver);
- Assert.True(root.IsPointerOver);
- }
- }
- [Fact]
- public void IsPointerOver_Should_Be_Updated_When_Child_Sets_Handled_True()
- {
- var renderer = new Mock<IRenderer>();
- using (TestApplication(renderer.Object))
- {
- var inputManager = InputManager.Instance;
- Canvas canvas;
- Border border;
- Decorator decorator;
- var root = new TestRoot
- {
- MouseDevice = new MouseDevice(),
- Renderer = renderer.Object,
- Child = new Panel
- {
- Children =
- {
- (canvas = new Canvas()),
- (border = new Border
- {
- Child = decorator = new Decorator(),
- })
- }
- }
- };
- SetHit(renderer, canvas);
- SendMouseMove(inputManager, root);
- Assert.False(decorator.IsPointerOver);
- Assert.False(border.IsPointerOver);
- Assert.True(canvas.IsPointerOver);
- Assert.True(root.IsPointerOver);
- // Ensure that e.Handled is reset between controls.
- decorator.PointerEnter += (s, e) => e.Handled = true;
- SetHit(renderer, decorator);
- SendMouseMove(inputManager, root);
- Assert.True(decorator.IsPointerOver);
- Assert.True(border.IsPointerOver);
- Assert.False(canvas.IsPointerOver);
- Assert.True(root.IsPointerOver);
- }
- }
- [Fact]
- public void PointerEnter_Leave_Should_Be_Raised_In_Correct_Order()
- {
- var renderer = new Mock<IRenderer>();
- var result = new List<(object, string)>();
- void HandleEvent(object sender, PointerEventArgs e)
- {
- result.Add((sender, e.RoutedEvent.Name));
- }
- using (TestApplication(renderer.Object))
- {
- var inputManager = InputManager.Instance;
- Canvas canvas;
- Border border;
- Decorator decorator;
- var root = new TestRoot
- {
- MouseDevice = new MouseDevice(),
- Renderer = renderer.Object,
- Child = new Panel
- {
- Children =
- {
- (canvas = new Canvas()),
- (border = new Border
- {
- Child = decorator = new Decorator(),
- })
- }
- }
- };
- SetHit(renderer, canvas);
- SendMouseMove(inputManager, root);
- AddEnterLeaveHandlers(HandleEvent, root, canvas, border, decorator);
- SetHit(renderer, decorator);
- SendMouseMove(inputManager, root);
- Assert.Equal(
- new[]
- {
- ((object)canvas, "PointerLeave"),
- ((object)decorator, "PointerEnter"),
- ((object)border, "PointerEnter"),
- },
- result);
- }
- }
- [Fact]
- public void GetPosition_Should_Respect_Control_RenderTransform()
- {
- var renderer = new Mock<IRenderer>();
- using (TestApplication(renderer.Object))
- {
- var inputManager = InputManager.Instance;
- var root = new TestRoot
- {
- MouseDevice = new MouseDevice(),
- Child = new Border
- {
- Background = Brushes.Black,
- RenderTransform = new TranslateTransform(10, 0),
- }
- };
- SendMouseMove(inputManager, root, new Point(11, 11));
- var result = root.MouseDevice.GetPosition(root.Child);
- Assert.Equal(new Point(1, 11), result);
- }
- }
- private void AddEnterLeaveHandlers(
- EventHandler<PointerEventArgs> handler,
- params IControl[] controls)
- {
- foreach (var c in controls)
- {
- c.PointerEnter += handler;
- c.PointerLeave += handler;
- }
- }
- private void SendMouseMove(IInputManager inputManager, TestRoot root, Point p = new Point())
- {
- inputManager.ProcessInput(new RawPointerEventArgs(
- root.MouseDevice,
- 0,
- root,
- RawPointerEventType.Move,
- p,
- RawInputModifiers.None));
- }
- private void SetHit(Mock<IRenderer> renderer, IControl hit)
- {
- renderer.Setup(x => x.HitTest(It.IsAny<Point>(), It.IsAny<IVisual>(), It.IsAny<Func<IVisual, bool>>()))
- .Returns(new[] { hit });
- }
- private IDisposable TestApplication(IRenderer renderer)
- {
- return UnitTestApplication.Start(
- new TestServices(inputManager: new InputManager()));
- }
- }
- }
|