public void TestEventQueue_GetEventsCalled() { /* PRECONDITIONS */ Debug.Assert(mockStrategy != null); Debug.Assert(queue != null); /* GIVEN */ using var autoResetEvent = new AutoResetEvent(false); var outputEvent = Enumerable.Repeat(new TestEvent(), 50).ToArray(); var num = 0; #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously async IAsyncEnumerable <TestEvent> CallEvent() #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously { foreach (var innerEvent in outputEvent) { yield return(innerEvent); } } mockStrategy .Setup(mock => mock.GetEvents(It.IsAny <CancellationToken>()))? .Returns(CallEvent); /* WHEN */ async void AwaitEach() { await foreach (var @event in queue.GetEvents()) { Assert.AreSame(outputEvent[num], @event); num++; } autoResetEvent.Set(); } AwaitEach(); /* THEN */ Assert.IsTrue(autoResetEvent.WaitOne(maxWaitTime)); mockStrategy.Verify(mock => mock.GetEvents(It.IsAny <CancellationToken>()), Times.Once); }
private static void ExpectOutput <T>(EventQueue <T> queue, Func <T, bool> predicate, Action completeAction = null) where T : Event { using var awaitThreadStartEvent = new ManualResetEvent(false); var thread = new Thread(async() => { await foreach (var @event in Awaitable.Await(queue.GetEvents(), awaitThreadStartEvent)) { if (predicate.Invoke(@event)) { break; } } completeAction?.Invoke(); }); thread.Start(); Assert.IsTrue(awaitThreadStartEvent.WaitOne(maxWaitTime), "Thread did not start in time!"); }