public void ShouldThrowWhenCancelled()
            {
                // Given
                IMessageHandlerResolver resolver = CreateSingleMessageHandlerResolver(registration =>
                {
                    registration.Register <TestMessage>((message, cancellationToken) =>
                    {
                        return(Task.Delay(TimeSpan.FromSeconds(5), cancellationToken));
                    });
                });

                MessageDelegator messageDelegator = CreateMessageDelegator(resolver);

                Func <Task> action = async() =>
                {
                    // Cancels after 1 second.
                    using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1)))
                    {
                        // When
                        await messageDelegator.SendAsync <TestMessage>(new TestMessage(), cts.Token);
                    }
                };

                // Then
                action.ShouldThrow <OperationCanceledException>();
            }
            public void ShouldThrowWhenNullIsProvided()
            {
                // Given
                IMessageHandlerResolver resolver         = CreateSingleMessageHandlerResolver();
                MessageDelegator        messageDelegator = CreateMessageDelegator(resolver);

                Func <Task> action = () =>
                {
                    // When
                    return(messageDelegator.SendAsync <TestMessage>(null));
                };

                // Then
                action.ShouldThrow <ArgumentNullException>();
            }
            public void ShouldPropagateExceptionFromHandler()
            {
                // Given
                IMessageHandlerResolver resolver = CreateSingleMessageHandlerResolver(registration =>
                {
                    registration.Register <TestMessage>((message, cancellationToken) =>
                    {
                        return(Task.FromException(new Exception("This exception is expected.")));
                    });
                });

                MessageDelegator messageDelegator = CreateMessageDelegator(resolver);

                Func <Task> action = () =>
                {
                    // When
                    return(messageDelegator.SendAsync <TestMessage>(new TestMessage()));
                };

                // Then
                action.ShouldThrow <Exception>();
            }
            public async Task ShouldSendMessageToASingleMessageHandler()
            {
                // Given
                bool messageHandlerWasInvoked = false;

                IMessageHandlerResolver resolver = CreateSingleMessageHandlerResolver(registration =>
                {
                    registration.Register <TestMessage>((message, ct) =>
                    {
                        messageHandlerWasInvoked = true;
                        return(Task.CompletedTask);
                    });
                });

                MessageDelegator messageDelegator = CreateMessageDelegator(resolver);

                // When
                await messageDelegator.SendAsync(new TestMessage());

                // Then
                messageHandlerWasInvoked.Should().BeTrue();
            }
            public async Task ShouldSendMessageToMultipleMessageHandlers()
            {
                // Given
                int expectedNumberOfHandlers            = 10;
                int actualMessageHandlerInvocationCount = 0;

                IMessageHandlerResolver resolver = CreateMultiMessageHandlerResolver(registration =>
                {
                    // Register 10 handlers.
                    for (int i = 0; i < expectedNumberOfHandlers; i++)
                    {
                        registration.Register <TestMessage>((message, ct) => { actualMessageHandlerInvocationCount++; return(Task.CompletedTask); });
                    }
                });

                MessageDelegator messageDelegator = CreateMessageDelegator(resolver);

                // When
                await messageDelegator.SendAsync(new TestMessage());

                // Then
                actualMessageHandlerInvocationCount.Should().Be(expectedNumberOfHandlers);
            }