public async Task Send_ObeysMessageDiscriminator()
        {
            var discriminator = Mocks.Create <IMessageDiscriminator>();

            discriminator.Setup(d => d.IsCompatible(typeof(Message1), It.IsAny <Type>())).Returns(true);
            discriminator.Setup(d => d.IsCompatible(typeof(Message2), It.IsAny <Type>())).Returns(false);
            discriminator.Setup(d => d.IsCompatible(typeof(Message3), It.IsAny <Type>())).Returns((Type a, Type b) => a == b);

            var handlers = CreateDummyHandlers(3);
            var executor = new Executor();
            var broker   = new StandardMessageBroker(executor, discriminator.Object);

            await broker.RegisterAsync(typeof(Message1), handlers[0]);

            await broker.RegisterAsync(typeof(Message2), handlers[1]);

            await broker.RegisterAsync(typeof(Message3), handlers[2]);

            await broker.SendAsync(new Message1());

            await broker.SendAsync(new Message2());

            await broker.SendAsync(new Message3());

            Assert.Equal(2, executor.Requests.Count);
            TestHelper.AssertEquivalent(handlers, executor.Requests[0].Handlers);
            Assert.Single(executor.Requests[1].Handlers, handlers[2]);
        }
        public async Task Send_SingleHandler_WrongMessage_DoesntExecuteHandler()
        {
            var handler  = CreateDummyHandler();
            var executor = new Executor();
            var broker   = new StandardMessageBroker(executor);

            var registration = await broker.RegisterAsync(typeof(Message1), handler);

            await broker.SendAsync(new Message2());

            Assert.Empty(executor.Requests);
        }
        public async Task Send_SingleHandler_CorrectMessage_ExecutesHandler()
        {
            var handler  = CreateDummyHandler();
            var executor = new Executor();
            var broker   = new StandardMessageBroker(executor);

            var registration = await broker.RegisterAsync(typeof(Message1), handler);

            await broker.SendAsync(new Message1());

            Assert.Single(executor.Requests);
            Assert.Single(executor.Latest.Handlers, handler);
        }
        public async Task RegistrationGarbageCollected_UnregistersHandler()
        {
            var handler  = CreateDummyHandler();
            var executor = new Executor();
            var broker   = new StandardMessageBroker(executor);

            await broker.RegisterAsync(typeof(Message1), handler);

            await TestHelper.ForceGarbageCollectionAsync();

            await broker.SendAsync(new Message1());

            Assert.Empty(executor.Requests);
        }
        public async Task RegistrationDisposed_UnregistersHandler()
        {
            var handler  = CreateDummyHandler();
            var executor = new Executor();
            var broker   = new StandardMessageBroker(executor);

            var registration = await broker.RegisterAsync(typeof(Message1), handler);

            await registration.DisposeAsync();

            await broker.SendAsync(new Message1());

            Assert.Empty(executor.Requests);
        }
        public async Task Send_MultipleHandlers_CorrectMessage_ExecutesHandlers()
        {
            var handlers = CreateDummyHandlers(3);

            var executor      = new Executor();
            var broker        = new StandardMessageBroker(executor);
            var registrations = new List <IAsyncDisposable>();

            foreach (var handler in handlers)
            {
                registrations.Add(await broker.RegisterAsync(typeof(Message1), handler));
            }

            await broker.SendAsync(new Message1());

            Assert.Single(executor.Requests);
            TestHelper.AssertEquivalent(handlers, executor.Latest.Handlers);
        }