AvaloniaTestRunner.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System.Reflection;
  2. using Avalonia.Headless;
  3. using Avalonia.Platform;
  4. using Avalonia.Threading;
  5. using PixiEditor.Avalonia.Desktop;
  6. using Xunit.Abstractions;
  7. using Xunit.Sdk;
  8. [assembly:TestFramework("PixiEditor.Tests.AvaloniaTestRunner", "PixiEditor.Tests")]
  9. [assembly:CollectionBehavior(CollectionBehavior.CollectionPerAssembly, DisableTestParallelization = false, MaxParallelThreads = 1)]
  10. namespace PixiEditor.Tests
  11. {
  12. public class AvaloniaTestRunner : XunitTestFramework
  13. {
  14. public AvaloniaTestRunner(IMessageSink messageSink) : base(messageSink)
  15. {
  16. }
  17. protected override ITestFrameworkExecutor CreateExecutor(AssemblyName assemblyName)
  18. => new Executor(assemblyName, SourceInformationProvider, DiagnosticMessageSink);
  19. class Executor : XunitTestFrameworkExecutor
  20. {
  21. public Executor(AssemblyName assemblyName, ISourceInformationProvider sourceInformationProvider,
  22. IMessageSink diagnosticMessageSink) : base(assemblyName, sourceInformationProvider,
  23. diagnosticMessageSink)
  24. {
  25. }
  26. protected override async void RunTestCases(IEnumerable<IXunitTestCase> testCases,
  27. IMessageSink executionMessageSink,
  28. ITestFrameworkExecutionOptions executionOptions)
  29. {
  30. executionOptions.SetValue("xunit.execution.DisableParallelization", false);
  31. using (var assemblyRunner = new Runner(
  32. TestAssembly, testCases, DiagnosticMessageSink, executionMessageSink,
  33. executionOptions)) await assemblyRunner.RunAsync();
  34. }
  35. }
  36. class Runner : XunitTestAssemblyRunner
  37. {
  38. public Runner(ITestAssembly testAssembly, IEnumerable<IXunitTestCase> testCases,
  39. IMessageSink diagnosticMessageSink, IMessageSink executionMessageSink,
  40. ITestFrameworkExecutionOptions executionOptions) : base(testAssembly, testCases, diagnosticMessageSink,
  41. executionMessageSink, executionOptions)
  42. {
  43. }
  44. protected override void SetupSyncContext(int maxParallelThreads)
  45. {
  46. var tcs = new TaskCompletionSource<SynchronizationContext>();
  47. new Thread(() =>
  48. {
  49. try
  50. {
  51. Program.BuildAvaloniaApp()
  52. .UseHeadless(new AvaloniaHeadlessPlatformOptions { FrameBufferFormat = PixelFormat.Bgra8888, UseHeadlessDrawing = false })
  53. .SetupWithoutStarting();
  54. tcs.SetResult(SynchronizationContext.Current);
  55. }
  56. catch (Exception e)
  57. {
  58. tcs.SetException(e);
  59. }
  60. Dispatcher.UIThread.MainLoop(CancellationToken.None);
  61. })
  62. {
  63. IsBackground = true
  64. }.Start();
  65. SynchronizationContext.SetSynchronizationContext(tcs.Task.Result);
  66. }
  67. }
  68. }
  69. }