public async Task ShouldSendAllMessagesToASingleMessageHandler()
            {
                // Given
                int expectedMessageHandlerInvocationCount = 5;
                int actualMessageHandlerInvocationCount   = 0;

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

                MessageDelegator messageDelegator = CreateMessageDelegator(resolver);

                // Instance messages.
                IEnumerable <TestMessage> messages = Enumerable.Range(0, expectedMessageHandlerInvocationCount).Select(i => new TestMessage());

                // When
                await messageDelegator.SendAllAsync(messages);

                // Then
                actualMessageHandlerInvocationCount.Should().Be(expectedMessageHandlerInvocationCount);
            }
            public void ShouldThrowWhenNullIsProvidedAsConstructorParameter()
            {
                // Given
                Action action = () =>
                {
                    // When
                    MessageDelegator messageDelegator = new MessageDelegator(null);
                };

                // Then
                action.ShouldThrow <ArgumentNullException>("because MessageDelegator requires an instance if IMessageHandlerResolver.");
            }
            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);
            }