public void ShouldBeEqualIfMessageTypeIsTheSame()
            {
                MessageHandlerDelegate handler1 = NullMessageHandlerDelegate.Instance;
                MessageHandlerDelegate handler2 = NullMessageHandlerDelegate.Instance;

                handler1.Should().BeSameAs(handler2);
            }
            public void ShouldNotBeEqualToANewEmptyInstance()
            {
                MessageHandlerDelegate handler1 = NullMessageHandlerDelegate.Instance;
                MessageHandlerDelegate handler2 = (m, ct) => Task.CompletedTask;
                MessageHandlerDelegate handler3 = (m, ct) => Task.CompletedTask;

                handler1.Should().NotBeSameAs(handler2);
                handler2.Should().NotBeSameAs(handler3);
            }
            public void ShouldResolveTheRegisteredMessageHandler()
            {
                // Given
                IMessageHandlerResolver resolver = CreateSingleMessageHandlerResolver(registration =>
                {
                    registration.Register <TestMessage>((message, ct) => Task.CompletedTask);
                });

                // When
                MessageHandlerDelegate handler = resolver.ResolveMessageHandler(typeof(TestMessage));

                // Then
                handler.Should().NotBe(NullMessageHandlerDelegate.Instance, "registered message handler delegate should be resolved.");
            }
            public void ShouldRegisterCommandAsyncHandler()
            {
                var commandHandler = new TestCommandHandler(_outputHelper);

                var registration = new SingleMessageHandlerRegistration();

                registration.RegisterCommandHandler(() => commandHandler.AsCommandAsyncHandler <TestCommand>());

                IMessageHandlerResolver resolver = registration.BuildMessageHandlerResolver();

                MessageHandlerDelegate commandHandlerDelegate = resolver.ResolveMessageHandler(typeof(TestCommand));

                commandHandlerDelegate.Should().NotBeNull();

                // Delegate should invoke the actual command handler - TestCommandHandler.
                commandHandlerDelegate.Invoke(new TestCommand());

                commandHandler.HandledCommands.Should().HaveCount(1);
                commandHandler.HasHandledCommand <TestCommand>().Should().BeTrue();
            }
            public async Task ShouldRegisterAllMethodsOfTypeThatIsMarkedWithCommandHandlerAttribute()
            {
                var commandHandler = new TestAttributedCommandHandler(_outputHelper);

                var registration = new SingleMessageHandlerRegistration();

                registration.RegisterCommandHandlersByAttribute(() => commandHandler);

                IMessageHandlerResolver resolver = registration.BuildMessageHandlerResolver();

                MessageHandlerDelegate commandHandlerDelegate = resolver.ResolveMessageHandler(typeof(TestCommand));

                commandHandlerDelegate.Should().NotBeNull();

                // Delegate should invoke the actual command handler - TestAttributedCommandHandler.
                await commandHandlerDelegate.Invoke(new TestCommand());

                commandHandler.HandledCommands.Should().HaveCount(1);
                commandHandler.HasHandledCommand <TestCommand>().Should().BeTrue();
            }
            public async Task ShouldRegisterAllCommandHandlerAttributeMethods()
            {
                var commandHandler = new TestAttributedCommandHandler(_outputHelper);

                // Get methods marked with [CommandHandler] attribute.
                IEnumerable <CommandHandlerAttributeMethod> methods = CommandHandlerAttributeMethod.FromType(() => commandHandler);

                var registration = new SingleMessageHandlerRegistration();

                registration.RegisterCommandHandlersByAttribute(methods);

                IMessageHandlerResolver resolver = registration.BuildMessageHandlerResolver();

                MessageHandlerDelegate commandHandlerDelegate = resolver.ResolveMessageHandler(typeof(TestCommand));

                commandHandlerDelegate.Should().NotBeNull();

                // Delegate should invoke the actual command handler - TestAttributedCommandHandler.
                await commandHandlerDelegate.Invoke(new TestCommand());

                commandHandler.HandledCommands.Should().HaveCount(1);
                commandHandler.HasHandledCommand <TestCommand>().Should().BeTrue();
            }