public void Invokes_until_appropriate_subdispatcher_found()
        {
            var denyDispatcher = new SimpleDispatcher(new Rule((message, handler) => false));
            var successDispatcher = new SimpleDispatcher(new Rule((message, handler) => true));

            var dispatcher = new CompositeDispatcher(new IDispatcher[] {denyDispatcher, successDispatcher});

            var testHandler = new TestHandler<TestMessage>();
            dispatcher.Invoke(new TestMessage(), testHandler);

            Assert.That(testHandler.WasCalledOnce, Is.True);
        }
        public void Invokation_should_not_be_perfomed_twice()
        {
            var successDispatcher1 = new SimpleDispatcher(new Rule((message, handler) => true));
            var successDispatcher2 = new SimpleDispatcher(new Rule((message, handler) => true));

            var dispatcher = new CompositeDispatcher(new IDispatcher[] { successDispatcher1, successDispatcher2 });

            var testHandler = new TestHandler<TestMessage>();
            dispatcher.Invoke(new TestMessage(), testHandler);

            Assert.That(testHandler.WasCalled, Is.EqualTo(1));
        }
        /// <summary>
        /// Combines exising dispatcher for <paramref name="pathTemplate"/> with <paramref name="dispatcher"/>.
        /// If there's no dispatcher for the specified path, adds a new one.
        /// </summary>
        /// <param name="routes">Route collection</param>
        /// <param name="pathTemplate">Path template</param>
        /// <param name="dispatcher">Dispatcher to add or append for specified path</param>
        public static void Append(this RouteCollection routes, string pathTemplate, IDashboardDispatcher dispatcher)
        {
            if (routes == null)
            {
                throw new ArgumentNullException(nameof(routes));
            }
            if (pathTemplate == null)
            {
                throw new ArgumentNullException(nameof(pathTemplate));
            }
            if (dispatcher == null)
            {
                throw new ArgumentNullException(nameof(dispatcher));
            }

            var list = routes.GetDispatchers();

            for (int i = 0; i < list.Count; i++)
            {
                var pair = list[i];
                if (pair.Item1 == pathTemplate)
                {
                    var composite = pair.Item2 as CompositeDispatcher;
                    if (composite == null)
                    {
                        // replace original dispatcher with a composite one
                        composite = new CompositeDispatcher(pair.Item2);
                        list[i]   = new Tuple <string, IDashboardDispatcher>(pathTemplate, composite);
                    }

                    composite.AddDispatcher(dispatcher);
                    return;
                }
            }

            routes.Add(pathTemplate, dispatcher);
        }
        public void Should_throw_if_cannot_dispatch_message()
        {
            var dispatcher = new CompositeDispatcher(new[] {new SimpleDispatcher(new Rule((message, handler) => false))});

            Assert.Throws<InvalidOperationException>(delegate { dispatcher.Invoke(new TestMessage(), new TestHandler<TestMessage>()); });
        }