Browse Source

Mock IPlatformThreadingInterface

pull/9652/head
Max Katz 3 years ago
committed by Emmanuel Hansen
parent
commit
1776522397
  1. 100
      tests/Avalonia.Base.UnitTests/Input/GesturesTests.cs

100
tests/Avalonia.Base.UnitTests/Input/GesturesTests.cs

@ -6,6 +6,7 @@ using Avalonia.Input;
using Avalonia.Input.GestureRecognizers;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Threading;
using Avalonia.UnitTests;
using Moq;
using Xunit;
@ -174,14 +175,52 @@ namespace Avalonia.Base.UnitTests.Input
}
[Fact]
public void Hold_Should_Not_Be_Raised_For_Multiple_Contact()
public void Hold_Is_Raised_When_Pointer_Pressed()
{
using var app = UnitTestApplication.Start(TestServices.MockThreadingInterface);
using var scope = AvaloniaLocator.EnterScope();
var iSettingsMock = new Mock<IPlatformSettings>();
iSettingsMock.Setup(x => x.HoldWaitDuration).Returns(TimeSpan.FromMilliseconds(300));
AvaloniaLocator.CurrentMutable.BindToSelf(this)
.Bind<IPlatformSettings>().ToConstant(iSettingsMock.Object);
var scheduledTimers = new List<(TimeSpan time, Action action)>();
using var app = UnitTestApplication.Start(new TestServices(
threadingInterface: CreatePlatformThreadingInterface(t => scheduledTimers.Add(t))));
Border border = new Border();
border.IsHoldWithMouseEnabled = true;
var decorator = new Decorator
{
Child = border
};
var raised = false;
decorator.AddHandler(Gestures.HoldingEvent, (s, e) => raised = e.HoldingState == HoldingState.Started);
_mouse.Down(border);
Assert.False(raised);
// Verify timer duration, but execute it immediately.
var timer = Assert.Single(scheduledTimers);
Assert.Equal(iSettingsMock.Object.HoldWaitDuration, timer.time);
timer.action();
Assert.True(raised);
}
[Fact]
public void Hold_Is_Not_Raised_When_Pointer_Released_Before_Timer()
{
using var scope = AvaloniaLocator.EnterScope();
var iSettingsMock = new Mock<IPlatformSettings>();
iSettingsMock.Setup(x => x.HoldWaitDuration).Returns(TimeSpan.FromMilliseconds(300));
AvaloniaLocator.CurrentMutable.BindToSelf(this)
.Bind<IPlatformSettings>().ToConstant(iSettingsMock.Object);
.Bind<IPlatformSettings>().ToConstant(iSettingsMock.Object);
var scheduledTimers = new List<(TimeSpan time, Action action)>();
using var app = UnitTestApplication.Start(new TestServices(
threadingInterface: CreatePlatformThreadingInterface(t => scheduledTimers.Add(t))));
Border border = new Border();
border.IsHoldWithMouseEnabled = true;
var decorator = new Decorator
@ -190,18 +229,69 @@ namespace Avalonia.Base.UnitTests.Input
};
var raised = false;
decorator.AddHandler(Gestures.HoldingEvent, (s, e) => raised = true);
decorator.AddHandler(Gestures.HoldingEvent, (s, e) => raised = e.HoldingState == HoldingState.Completed);
_mouse.Down(border);
Assert.False(raised);
_mouse.Up(border);
Assert.False(raised);
// Verify timer duration, but execute it immediately.
var timer = Assert.Single(scheduledTimers);
Assert.Equal(iSettingsMock.Object.HoldWaitDuration, timer.time);
timer.action();
Assert.False(raised);
}
[Fact]
public void Hold_Should_Not_Be_Raised_For_Multiple_Contact()
{
using var scope = AvaloniaLocator.EnterScope();
var iSettingsMock = new Mock<IPlatformSettings>();
iSettingsMock.Setup(x => x.HoldWaitDuration).Returns(TimeSpan.FromMilliseconds(300));
AvaloniaLocator.CurrentMutable.BindToSelf(this)
.Bind<IPlatformSettings>().ToConstant(iSettingsMock.Object);
var scheduledTimers = new List<(TimeSpan time, Action action)>();
using var app = UnitTestApplication.Start(new TestServices(
threadingInterface: CreatePlatformThreadingInterface(t => scheduledTimers.Add(t))));
Border border = new Border();
border.IsHoldWithMouseEnabled = true;
var decorator = new Decorator
{
Child = border
};
var raised = false;
decorator.AddHandler(Gestures.HoldingEvent, (s, e) => raised = e.HoldingState == HoldingState.Completed);
var secondMouse = new MouseTestHelper();
_mouse.Down(border, MouseButton.Left);
Thread.Sleep(1000);
// Verify timer duration, but execute it immediately.
var timer = Assert.Single(scheduledTimers);
Assert.Equal(iSettingsMock.Object.HoldWaitDuration, timer.time);
timer.action();
secondMouse.Down(border, MouseButton.Left);
Assert.False(raised);
}
private static IPlatformThreadingInterface CreatePlatformThreadingInterface(Action<(TimeSpan, Action)> callback)
{
var threadingInterface = new Mock<IPlatformThreadingInterface>();
threadingInterface.SetupGet(p => p.CurrentThreadIsLoopThread).Returns(true);
threadingInterface.Setup(p => p
.StartTimer(It.IsAny<DispatcherPriority>(), It.IsAny<TimeSpan>(), It.IsAny<Action>()))
.Callback<DispatcherPriority, TimeSpan, Action>((_, t, a) => callback((t, a)));
return threadingInterface.Object;
}
private static void AddHandlers(
Decorator decorator,
Border border,

Loading…
Cancel
Save