public void TwoWaitersTest()
        {
            var dispatcher = new Dispatcher();
            var reportingStore = new ReportingStore();
            var notifyDispatcher = new NotifyDispatcher(dispatcher);

            IScheduler theScheduler = new NeverTimesOut();

            var cashier = new Cashier(notifyDispatcher, new FakeOrdersStore());
            var midgetHouse = new MidgetHouse(dispatcher, theScheduler);

            var waiter1 = new Waiter(midgetHouse);
            var waiter2 = new SecondWaiter(midgetHouse);

            dispatcher.Subscribe("cook", new QueuedHandleOrders(new Cook(notifyDispatcher, new FakeIngredientsStore()), "cook"));
            dispatcher.Subscribe("cashier", cashier);
            dispatcher.Subscribe("assistant", new QueuedHandleOrders(new AssistantManager(notifyDispatcher, new FakePriceTable()), "assistant"));
            dispatcher.Subscribe("manger", new QueuedHandleOrders(new Manger(reportingStore), "manager"));
            dispatcher.SubscribeMidgetInfo("midgetObserver", new MidgetObserver());

            waiter1.CreateOrderWithTable(123);
            waiter2.CreateOrderWithTable(666);

            Thread.Sleep(2000);
            cashier.PayFor(123);
            Thread.Sleep(2000);

            Assert.That(reportingStore.StoredOrders.Count, Is.EqualTo(1));
        }
        public void PerformanceTestReportWithMultipleCooks()
        {
            var reportingStore = new ReportingStore();
            var manager = new QueuedHandleOrders(new Manger(reportingStore), "manager");
            var cashier = new Cashier(manager, new FakeOrdersStore());
            var queuedCashier = new QueuedHandleOrders(cashier, "cashier");
            var cook = new QueuedHandleOrders(new RoundRobinHandleOrder(new List<IHandleOrders>()
                                                                            {
                                                                                new Cook(queuedCashier, new FakeIngredientsStore()),
                                                                                new Cook(queuedCashier, new FakeIngredientsStore()),
                                                                                new Cook(queuedCashier, new FakeIngredientsStore())
                                                                            }, "multiple cooks"), "cook");
            var waiter = new Waiter(cook);
            var monitor = new StatsMonitor(new List<IStatisticTrigger>()
                                               {
                                                   cook, queuedCashier, manager
                                               });

            for (int i = 0; i < 10000; ++i)
            {
                waiter.CreateOrderWithTable(i);

            }
            Thread.Sleep(10000);

            int paidClients = 0;
            while (paidClients != 10000)
            {
                for (int i = 0; i < 10000; ++i)
                {
                    bool result = cashier.PayFor(i);
                    if (result)
                    {
                        paidClients++;
                    }
                }
            }
            Thread.Sleep(100000);
        }