Esempio n. 1
0
        public void DayBetweenForMondayAndMondayShallReturn0()
        {
            //Exercise
            var differential = DayHelper.DaysBetween(DayOfWeek.Monday, DayOfWeek.Monday);

            //Verify
            Assert.AreEqual(0, differential);
        }
        public static List <T> BuildTimePeriodWeeks <T>(this ITimePeriod timePeriod,
                                                        DateTime?forDateTime = null, DayOfWeek?firstDayOfWeek = DayOfWeek.Monday,
                                                        bool includeOutOfRangeTimePeriods = false,
                                                        List <DayOfWeek> openDays         = null, List <DateTime> exclusionDates = null) where T : ITimePeriodWeek, new()
        {
            //Sanitise the arguments
            if (!forDateTime.HasValue)
            {
                forDateTime = Clock.Now().ToDateOnly();
            }

            if (timePeriod.LastDay < timePeriod.FirstDay)
            {
                throw new ArgumentException();
            }

            if (!includeOutOfRangeTimePeriods && timePeriod.LastDay < forDateTime)
            {
                return(null); //Not in the date range
            }
            if (!includeOutOfRangeTimePeriods && timePeriod.FirstDay > forDateTime)
            {
                return(null); //Not in the date range
            }
            var workingFirstDay = timePeriod.FirstDay;

            var timePeriodWeeks = new List <T>();

            while (workingFirstDay <= timePeriod.LastDay)
            {
                int lengthOfWeek;

                if (firstDayOfWeek.HasValue && workingFirstDay.DayOfWeek != firstDayOfWeek)
                {
                    var endOfWeekDay = firstDayOfWeek.Value.PreviousDayOfWeek();
                    //Add the number of days to end this partial week
                    lengthOfWeek = DayHelper.DaysBetween(workingFirstDay.DayOfWeek, endOfWeekDay);
                }
                else
                {
                    lengthOfWeek = 6;
                }

                var workingLastDayOfWeek = workingFirstDay.AddDays(lengthOfWeek);

                //Use the last day of the time period if needed
                if (workingLastDayOfWeek > timePeriod.LastDay)
                {
                    workingLastDayOfWeek = timePeriod.LastDay;
                }

                var timePeriodWeek = new T
                {
                    FirstDay   = workingFirstDay.ToStartOfDay(),
                    LastDay    = workingLastDayOfWeek.ToStartOfDay(),
                    WeekNumber = timePeriodWeeks.Count + 1
                };

                //Is the week empty? Do not add to the list
                if (!timePeriodWeek.IsEmpty(openDays, exclusionDates))
                {
                    timePeriodWeek.IsCurrent = timePeriodWeek.Contains(forDateTime.Value);
                    timePeriodWeeks.Add(timePeriodWeek);
                }

                //workingFirstDay = workingFirstDay.AddDays(7);
                workingFirstDay = workingFirstDay.AddDays(lengthOfWeek + 1);
            }

            return(timePeriodWeeks);
        }