Exemplo n.º 1
0
        public void SelectTodaysBauShift_Given_16Engineers_Returns_TwoEngineers()
        {
            //arrange
            var engineer1WhoDidnHadShiftYesterday = new SupportEngineerBuilder()
                                                    .WithShiftLoggedOnDate(DateTime.Today.AddDays(-2))
                                                    .Build();

            var engineer2WhoDidnHadShiftYesterday = new SupportEngineerBuilder()
                                                    .WithShiftLoggedOnDate(DateTime.Today.AddDays(-2))
                                                    .Build();

            var engineerWhoHadShiftYesterday = new SupportEngineerBuilder()
                                               .WithShiftLoggedOnDate(DateTime.Today.AddDays(-1))
                                               .Build();

            var engineerWhoHadTwoShiftsInLastTwoWeeks = new SupportEngineerBuilder()
                                                        .WithShiftLoggedOnDate(DateTime.Today.AddDays(-3))
                                                        .WithShiftLoggedOnDate(DateTime.Today.AddDays(-12))
                                                        .Build();

            var engineer2WhoHadTwoShiftsInLastTwoWeeks = new SupportEngineerBuilder()
                                                         .WithShiftLoggedOnDate(DateTime.Today.AddDays(-5))
                                                         .WithShiftLoggedOnDate(DateTime.Today.AddDays(-11))
                                                         .Build();

            var engineers = new List <ISupportEngineer>()
            {
                engineer2WhoHadTwoShiftsInLastTwoWeeks, engineerWhoHadShiftYesterday,
                engineerWhoHadTwoShiftsInLastTwoWeeks, engineer1WhoDidnHadShiftYesterday,
                engineer2WhoDidnHadShiftYesterday
            };

            var supportEngineerRepository = A.Fake <ISupportEngineersRepository>();
            var supportEngineersFactory   = A.Fake <ISupportEngineersFactory>();

            A.CallTo(() => supportEngineersFactory.GetSupportEngineers())
            .Returns(engineers);

            //var supportEngineersFactory = new SupportEngineers
            var filterChainFactory = new DefaultSupportEngineerFilterChainFactory();

            var sut = new WheelOfFate(supportEngineerRepository, supportEngineersFactory, filterChainFactory);

            //act
            var bauShift = sut.SelectTodaysBauShift();

            //assert
            bauShift.ShouldNotBeNull();
            bauShift.Shift.ShouldNotBeEmpty();
        }
        public void SelectTodaysBauShift_Given_10EngineersWith0Shifts_After10DaysOfShifts_EachEngineerDidntHadShiftInTwoCosequentDays()
        {
            //arrange
            int       numberOfEngineers = 10;
            int       numberOfDays      = 12;
            ICalendar calendar          = A.Fake <ICalendar>();
            IList <ISupportEngineer> tenSupportEngineersWithouthShifts = new List <ISupportEngineer>();

            for (int i = 0; i < numberOfEngineers; i++)
            {
                tenSupportEngineersWithouthShifts.Add(new SupportEngineerBuilder()
                                                      .WihtDateProvider(calendar)
                                                      .Build());
            }

            var defaultSupportEngineerFilterChainFactory = new DefaultSupportEngineerFilterChainFactory();
            var sut = defaultSupportEngineerFilterChainFactory.Create();

            //act
            //at the beggining all engineers have 0 shifts
            foreach (var supportEngineer in tenSupportEngineersWithouthShifts)
            {
                supportEngineer.ShiftCount.ShouldBe(0);
            }
            ;
            //simulate ten days of shifts
            for (int daysToAdd = 0; daysToAdd < numberOfDays; daysToAdd++)
            {
                //simulate weekend
                if (daysToAdd == 5)
                {
                    daysToAdd = daysToAdd + 2;
                }

                A.CallTo(() => calendar.Today).Returns(DateTime.Today.AddDays(daysToAdd));

                sut.Filter(tenSupportEngineersWithouthShifts);
            }

            //assert
            foreach (var supportEngineer in tenSupportEngineersWithouthShifts)
            {
                var lastTwoShifts     = supportEngineer.LastTwoShifts;
                var lastShift         = lastTwoShifts.First();
                var secondToLastShift = lastTwoShifts.Last();
                ((lastShift.Date - secondToLastShift.Date).TotalDays > 1).ShouldBeTrue();
            }
        }
        public void Create_Returns_ChainedFilters()
        {
            //arrange
            var sut = new DefaultSupportEngineerFilterChainFactory();

            //act
            var filterChain = sut.Create();

            //assert
            filterChain.ShouldBeOfType <ShiftSelectedTodayFilter>();
            filterChain.Successor.ShouldBeOfType <PreferEngineersWhoDidintHadShiftInLastWeekFilter>();
            filterChain.Successor.Successor.ShouldBeOfType <EngineersWhoDidntHadTwoShiftsInLastTwoWeeksFilter>();
            filterChain.Successor.Successor.Successor.ShouldBeOfType <EngineersWhoDidntHadShiftYesterdayFilter>();
            filterChain.Successor.Successor.Successor.Successor.ShouldBeOfType <ChooseTwoRandomEngineersFilter>();
            filterChain.Successor.Successor.Successor.Successor.Successor
            .ShouldBeOfType <LogShiftForSelectedEngineersFilter>();
            filterChain.Successor.Successor.Successor.Successor.Successor.Successor.ShouldBeNull();
        }