public void DispatcherHandlerTest()
        {
            var dispatcher = new Dispatcher();
            var reportingStore = new ReportingStore();

            var assistantManagerDispatcher = new DispatcherHandleOrder(dispatcher, "assistant");

            var cashierDispatcher = new DispatcherHandleOrder(dispatcher, "cashier");

            var cashier = new Cashier(cashierDispatcher, new FakeOrdersStore());

            var cookDispatcher = new DispatcherHandleOrder(dispatcher, "cook");

            var waiterDispatcher = new DispatcherHandleOrder(dispatcher, "waiter");
            var waiter = new Waiter(waiterDispatcher);

            dispatcher.Subscribe("waiter", new QueuedHandleOrders(new Cook(cookDispatcher, new FakeIngredientsStore()), "cook"));
            dispatcher.Subscribe("cook", cashier);
            dispatcher.Subscribe("cashier", new QueuedHandleOrders(new AssistantManager(assistantManagerDispatcher, new FakePriceTable()), "assistant"));
            dispatcher.Subscribe("assistant", new QueuedHandleOrders(new Manger(reportingStore), "manager"));

            waiter.CreateOrder();
            Thread.Sleep(100);
            cashier.PayFor(123);
            Thread.Sleep(1000);

            Assert.That(reportingStore.StoredOrders.Count, Is.EqualTo(1));
        }
        public void ObserverNotifyTest()
        {
            var dispatcher = new Dispatcher();
            var reportingStore = new ReportingStore();

            var assistantManagerDispatcher = new DispatcherHandleOrder(dispatcher, "assistant");
            var cashierDispatcher = new DispatcherHandleOrder(dispatcher, "cashier");
            var cashier = new Cashier(cashierDispatcher, new FakeOrdersStore());
            var cookDispatcher = new DispatcherHandleOrder(dispatcher, "cook");
            var waiterDispatcher = new DispatcherHandleOrder(dispatcher, "waiter");

            var waiter = new Waiter(waiterDispatcher);

            dispatcher.Subscribe("waiter", new QueuedHandleOrders(new Cook(cookDispatcher, new FakeIngredientsStore()), "cook"));
            dispatcher.Subscribe("cook", cashier);
            dispatcher.Subscribe("cashier", new QueuedHandleOrders(new AssistantManager(assistantManagerDispatcher, new FakePriceTable()), "assistant"));
            dispatcher.Subscribe("assistant", new QueuedHandleOrders(new Manger(reportingStore), "manager"));

            dispatcher.SubscribeByCorrelationId("#1", new DelegateObserver((order) => Console.WriteLine("Document changed: {0}", order.TotalTax)));

            waiter.CreateOrder();
            Thread.Sleep(300);
            cashier.PayFor(123);
            Thread.Sleep(2000);

            Assert.That(reportingStore.StoredOrders.Count, Is.EqualTo(1));
        }