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); }