Browse Source

Merge remote-tracking branch 'origin/nunit-headless-intergration' into unify-test-mocks

pull/11169/head
Max Katz 3 years ago
parent
commit
eacaaea837
  1. 9
      src/Headless/Avalonia.Headless/HeadlessUnitTestSession.cs
  2. 19
      src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
  3. 2
      tests/Avalonia.Headless.UnitTests/InputTests.cs

9
src/Headless/Avalonia.Headless/HeadlessUnitTestSession.cs

@ -64,13 +64,14 @@ public sealed class HeadlessUnitTestSession : IDisposable
_queue.Add(() => _queue.Add(() =>
{ {
var cts = new CancellationTokenSource(); var cts = new CancellationTokenSource();
using var globalCts = token.Register(s => ((CancellationTokenSource)s!).Cancel(), cts); using var globalCts = token.Register(s => ((CancellationTokenSource)s!).Cancel(), cts, true);
using var localCts = cancellationToken.Register(s => ((CancellationTokenSource)s!).Cancel(), cts); using var localCts = cancellationToken.Register(s => ((CancellationTokenSource)s!).Cancel(), cts, true);
try try
{ {
var task = action(); var task = action();
task.ContinueWith((_, s) => ((CancellationTokenSource)s!).Cancel(), cts); task.ContinueWith((_, s) => ((CancellationTokenSource)s!).Cancel(), cts,
TaskScheduler.FromCurrentSynchronizationContext());
if (cts.IsCancellationRequested) if (cts.IsCancellationRequested)
{ {
@ -78,7 +79,7 @@ public sealed class HeadlessUnitTestSession : IDisposable
} }
var frame = new DispatcherFrame(); var frame = new DispatcherFrame();
using var innerCts = cts.Token.Register(() => frame.Continue = false); using var innerCts = cts.Token.Register(() => frame.Continue = false, true);
Dispatcher.UIThread.PushFrame(frame); Dispatcher.UIThread.PushFrame(frame);
var result = task.GetAwaiter().GetResult(); var result = task.GetAwaiter().GetResult();

19
src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs

@ -44,53 +44,54 @@ public static class HeadlessWindowExtensions
/// Simulates keyboard press on the headless window/toplevel. /// Simulates keyboard press on the headless window/toplevel.
/// </summary> /// </summary>
public static void KeyPress(this TopLevel topLevel, Key key, RawInputModifiers modifiers) => public static void KeyPress(this TopLevel topLevel, Key key, RawInputModifiers modifiers) =>
RunJobsAndGetImpl(topLevel).KeyPress(key, modifiers); RunJobsOnImpl(topLevel, w => w.KeyPress(key, modifiers));
/// <summary> /// <summary>
/// Simulates keyboard release on the headless window/toplevel. /// Simulates keyboard release on the headless window/toplevel.
/// </summary> /// </summary>
public static void KeyRelease(this TopLevel topLevel, Key key, RawInputModifiers modifiers) => public static void KeyRelease(this TopLevel topLevel, Key key, RawInputModifiers modifiers) =>
RunJobsAndGetImpl(topLevel).KeyRelease(key, modifiers); RunJobsOnImpl(topLevel, w => w.KeyRelease(key, modifiers));
/// <summary> /// <summary>
/// Simulates mouse down on the headless window/toplevel. /// Simulates mouse down on the headless window/toplevel.
/// </summary> /// </summary>
public static void MouseDown(this TopLevel topLevel, Point point, MouseButton button, public static void MouseDown(this TopLevel topLevel, Point point, MouseButton button,
RawInputModifiers modifiers = RawInputModifiers.None) => RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsAndGetImpl(topLevel).MouseDown(point, button, modifiers); RunJobsOnImpl(topLevel, w => w.MouseDown(point, button, modifiers));
/// <summary> /// <summary>
/// Simulates mouse move on the headless window/toplevel. /// Simulates mouse move on the headless window/toplevel.
/// </summary> /// </summary>
public static void MouseMove(this TopLevel topLevel, Point point, public static void MouseMove(this TopLevel topLevel, Point point,
RawInputModifiers modifiers = RawInputModifiers.None) => RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsAndGetImpl(topLevel).MouseMove(point, modifiers); RunJobsOnImpl(topLevel, w => w.MouseMove(point, modifiers));
/// <summary> /// <summary>
/// Simulates mouse up on the headless window/toplevel. /// Simulates mouse up on the headless window/toplevel.
/// </summary> /// </summary>
public static void MouseUp(this TopLevel topLevel, Point point, MouseButton button, public static void MouseUp(this TopLevel topLevel, Point point, MouseButton button,
RawInputModifiers modifiers = RawInputModifiers.None) => RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsAndGetImpl(topLevel).MouseUp(point, button, modifiers); RunJobsOnImpl(topLevel, w => w.MouseUp(point, button, modifiers));
/// <summary> /// <summary>
/// Simulates mouse wheel on the headless window/toplevel. /// Simulates mouse wheel on the headless window/toplevel.
/// </summary> /// </summary>
public static void MouseWheel(this TopLevel topLevel, Point point, Vector delta, public static void MouseWheel(this TopLevel topLevel, Point point, Vector delta,
RawInputModifiers modifiers = RawInputModifiers.None) => RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsAndGetImpl(topLevel).MouseWheel(point, delta, modifiers); RunJobsOnImpl(topLevel, w => w.MouseWheel(point, delta, modifiers));
/// <summary> /// <summary>
/// Simulates drag'n'drop target on the headless window/toplevel. /// Simulates drag'n'drop target on the headless window/toplevel.
/// </summary> /// </summary>
public static void DragDrop(this TopLevel topLevel, Point point, RawDragEventType type, IDataObject data, public static void DragDrop(this TopLevel topLevel, Point point, RawDragEventType type, IDataObject data,
DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None) => DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsAndGetImpl(topLevel).DragDrop(point, type, data, effects, modifiers); RunJobsOnImpl(topLevel, w => w.DragDrop(point, type, data, effects, modifiers));
private static IHeadlessWindow RunJobsAndGetImpl(this TopLevel topLevel) private static void RunJobsOnImpl(this TopLevel topLevel, Action<IHeadlessWindow> action)
{ {
Dispatcher.UIThread.RunJobs(); Dispatcher.UIThread.RunJobs();
return GetImpl(topLevel); action(GetImpl(topLevel));
Dispatcher.UIThread.RunJobs();
} }
private static IHeadlessWindow GetImpl(this TopLevel topLevel) private static IHeadlessWindow GetImpl(this TopLevel topLevel)

2
tests/Avalonia.Headless.UnitTests/InputTests.cs

@ -46,7 +46,7 @@ public class InputTests
_window.MouseDown(new Point(50, 50), MouseButton.Left); _window.MouseDown(new Point(50, 50), MouseButton.Left);
_window.MouseUp(new Point(50, 50), MouseButton.Left); _window.MouseUp(new Point(50, 50), MouseButton.Left);
Assert.True(buttonClicked); Assert.True(buttonClicked);
} }

Loading…
Cancel
Save