using DocxWorkbench.WordInterop; namespace DocxWorkbench.Tests; public sealed class StaWordQueueTests { [Fact] public async Task Dispose_DrainsActiveJobAndIsIdempotent() { using var queue = new StaWordQueue(); using var started = new ManualResetEventSlim(false); using var release = new ManualResetEventSlim(false); var job = queue.Enqueue(() => { started.Set(); Assert.Equal(ApartmentState.STA, Thread.CurrentThread.GetApartmentState()); release.Wait(); return 42; }, CancellationToken.None); Assert.True(started.Wait(TimeSpan.FromSeconds(2))); var dispose = Task.Run(queue.Dispose); var completed = await Task.WhenAny(dispose, Task.Delay(100)); Assert.NotSame(dispose, completed); release.Set(); await dispose; Assert.Equal(42, await job); queue.Dispose(); Assert.Throws(() => EnqueueAfterDispose(queue)); } [Fact] public async Task Enqueue_CancellationCompletesCanceledTask() { using var queue = new StaWordQueue(); using var cancellation = new CancellationTokenSource(); cancellation.Cancel(); await Assert.ThrowsAnyAsync(() => queue.Enqueue(() => 1, cancellation.Token)); } private static void EnqueueAfterDispose(StaWordQueue queue) => queue.Enqueue(() => 1, CancellationToken.None); }