RenderResourceTestHelper.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System;
  2. using Avalonia.Rendering;
  3. using Avalonia.Rendering.Composition;
  4. using Avalonia.Rendering.Composition.Drawing;
  5. using Avalonia.Threading;
  6. using Avalonia.UnitTests;
  7. using Xunit;
  8. namespace Avalonia.Base.UnitTests.Media;
  9. internal class RenderResourceTestHelper : IDisposable
  10. {
  11. public CompositorTestServices Services { get; } = new();
  12. public Compositor Compositor => Services.Compositor;
  13. public void AddToCompositor(ICompositionRenderResource resource) => resource.AddRefOnCompositor(Compositor);
  14. public bool IsInvalidated(ICompositorSerializable resource) =>
  15. Compositor.UnitTestIsRegisteredForSerialization(resource);
  16. public void AssertExistsOnCompositor(ICompositorSerializable resource, bool exists = true)
  17. {
  18. var server = resource.TryGetServer(Compositor);
  19. if (exists)
  20. Assert.NotNull(server);
  21. else
  22. Assert.Null(server);
  23. }
  24. public static void AssertResourceInvalidation<T>(T resource, Action cb)
  25. where T : ICompositionRenderResource, ICompositorSerializable
  26. {
  27. using var helper = new RenderResourceTestHelper();
  28. helper.AssertInvalidation(resource, cb);
  29. }
  30. public void AssertInvalidation<T>(T resource, Action cb)
  31. where T : ICompositionRenderResource, ICompositorSerializable
  32. {
  33. resource.AddRefOnCompositor(Compositor);
  34. Assert.NotNull(resource.TryGetServer(Compositor));
  35. Assert.True(Compositor.UnitTestIsRegisteredForSerialization(resource));
  36. Compositor.Commit();
  37. Compositor.Server.Render(false);
  38. Assert.False(Compositor.UnitTestIsRegisteredForSerialization(resource));
  39. cb();
  40. Assert.True(Compositor.UnitTestIsRegisteredForSerialization(resource));
  41. resource.ReleaseOnCompositor(Compositor);
  42. Assert.Null(resource.TryGetServer(Compositor));
  43. }
  44. public void Dispose() => Services.Dispose();
  45. }