Example #1
0
        public void TestSetHeadWaiter()
        {
            Square     testSquare1    = new Square(1);
            HeadWaiter headWaiterTest = new HeadWaiter(2);

            testSquare1.headWaiter = (HeadWaiterInterface)headWaiterTest;
            Assert.AreEqual(testSquare1.headWaiter, headWaiterTest);
        }
Example #2
0
        protected override Staff AssignStaff(string type)
        {
            Staff staff = null;
            IStaffDetailsFactory _staffDetailsFactory;

            switch (type)
            {
            case nameof(HeadWaiter):
                _staffDetailsFactory = new HeadWaiterFactory();
                staff = new HeadWaiter(_staffDetailsFactory);
                break;

            case nameof(JuniorWaiter):
                _staffDetailsFactory = new JuniorWaiterFactory();
                staff = new JuniorWaiter(_staffDetailsFactory);
                break;
            }

            return(staff);
        }
Example #3
0
        public void ExecuteScenario(int scenarioId)
        {
            List <ActionsListBusiness> actionsList = actionsListService.GetByScenario(scenarioId);

            string[]       nextAction           = null;
            CustomersGroup customers            = null;
            int            tableNumber          = 0;
            string         actualScenarioAction = null;

            string[] actualScenarioActionParam = null;
            do
            {
                actualScenarioAction      = GetNextScenarioAction(ref actionsList, ref nextAction);
                actualScenarioActionParam = GetNextScenarioActionParam(ref nextAction);
                Console.WriteLine(actualScenarioAction);
                switch (actualScenarioAction)
                {
                case "CreationReservation":
                    customers = new CustomersGroup(
                        CreateCustomersGroup(int.Parse(actualScenarioActionParam[1].Split('=')[1]),
                                             int.Parse(actualScenarioActionParam[2].Split('=')[1]),
                                             int.Parse(actualScenarioActionParam[3].Split('=')[1])), true);
                    DateTime reservationDate = new DateTime(SimulationTimeOfServiceStart.Year, SimulationTimeOfServiceStart.Month, SimulationTimeOfServiceStart.Day, 18 /*int.Parse(actualScenarioActionParam[0].Split('h')[0])*/, 0, 0);
                    lock (model.DiningRoom.Butler.lockObj)
                    {
                        tableNumber = model.DiningRoom.Butler.CreateBooking(customers, reservationDate);
                    }
                    break;

                case "ArriveeClientsReservation":
                    model.DiningRoom.Reception.BookedCustomersArrive(customers);
                    lock (model.DiningRoom.Butler.lockObj)
                    {
                        //tableNumber = model.DiningRoom.Butler.FindTable(customers);
                        ThreadSyncByTableNumber.Add(tableNumber, new AutoResetEvent(false));
                    }
                    break;

                case "ArriveeClientsNonReserve":
                    customers = new CustomersGroup(
                        CreateCustomersGroup(int.Parse(actualScenarioActionParam[0].Split('=')[1]),
                                             int.Parse(actualScenarioActionParam[1].Split('=')[1]),
                                             int.Parse(actualScenarioActionParam[2].Split('=')[1])), true);
                    //model.DiningRoom.Reception.BookedCustomersArrive(customers);
                    lock (model.DiningRoom.Butler.lockObj)
                    {
                        tableNumber = model.DiningRoom.Butler.FindTable(customers);
                        ThreadSyncByTableNumber.Add(tableNumber, new AutoResetEvent(false));
                    }
                    break;

                case "AmenerClientsATable":
                    HeadWaiter headWaiter = null;
                    do
                    {
                        headWaiter = model.DiningRoom.HeadWaiters.FirstOrDefault(x => x.IsBusy == false);
                    } while (headWaiter == null);
                    lock (headWaiter.lockObj)
                    {
                        headWaiter.PlaceCustomersAtTable(customers, tableNumber);
                    }
                    break;

                case "PrendreLesCommandes":
                    headWaiter = null;
                    do
                    {
                        headWaiter = model.DiningRoom.HeadWaiters.FirstOrDefault(x => x.IsBusy == false);
                    } while (headWaiter == null);
                    lock (headWaiter.lockObj)
                    {
                        headWaiter.TakeOrders(tableNumber);
                    }
                    break;

                case "PreparationDesCommandes":
                    lock (model.Kitchen.HeadChef.lockObj)
                    {
                        model.Kitchen.HeadChef.StartCoursesOrderPreparation(model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber));
                    }
                    break;

                case "AmenerPlatsEnSalle":
                    ThreadSyncByTableNumber.First(x => x.Key == tableNumber).Value.WaitOne();
                    break;

                case "ClientsMangent":
                    int      i = 0;
                    Thread[] eatingCustomersThreads = new Thread[model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber).ServedFood.Count];
                    foreach (Customer customer in model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber).SeatedCustomers)
                    {
                        if (i >= model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber).ServedFood.Count)
                        {
                            break;
                        }
                        int j = i;
                        eatingCustomersThreads[i] = new Thread(delegate()
                        {
                            lock (customer.lockObj)
                            {
                                customer.EatFood(model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber).ServedFood[j]);
                            }
                        });
                        eatingCustomersThreads[i].Start();
                        i++;
                    }

                    for (int y = 0; y < eatingCustomersThreads.Length; y++)
                    {
                        if (eatingCustomersThreads[y] != null)
                        {
                            eatingCustomersThreads[y].Join();
                        }
                    }
                    break;

                case "DebarasserTable":
                    Waiter waiter = null;
                    //while (model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber).ServedFood.TrueForAll(x => x.IsFinished)) { }
                    do
                    {
                        waiter = model.DiningRoom.Waiters.FirstOrDefault(x => x.IsBusy == false);
                    } while (waiter == null);
                    lock (waiter.lockObj)
                    {
                        waiter.ClearPlates(tableNumber);
                    }
                    break;

                case "ClientsPartent":
                    waiter = null;
                    do
                    {
                        waiter = model.DiningRoom.Waiters.FirstOrDefault(x => x.IsBusy == false);
                    } while (waiter == null);
                    lock (waiter.lockObj)
                    {
                        model.DiningRoom.Countertop.Orders.Remove(model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber));
                        model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber).SeatedCustomers.Clear();
                        model.DiningRoom.Tables.Find(x => x.TableNumber == tableNumber).NextCourseToServe = CourseType.Starter;
                        model.DiningRoom.Waiters.Find(x => x.IsBusy == false).ClearAndCleanTable(tableNumber);
                    }
                    break;

                default:
                    break;
                }
            } while (actualScenarioAction != "ClientsPartent");
        }