public void CalendarGetGapTest() { // simmulation of some reservations var periods = new TimePeriodCollection { new DayRangeCollection(2011, 3, 7, 2), new DayRangeCollection(2011, 3, 16, 2) }; // the overall search range var limits = new CalendarTimeRange(new DateTime(2011, 3, 4), new DateTime(2011, 3, 21)); var days = new DayRangeCollection(limits.Start, limits.Duration.Days + 1); // limits의 내부이고, 주말인 DayRange를 추가합니다. var excludeDays = days.GetDays().Where(day => limits.HasInside(day) && day.DayOfWeek.IsWeekEnd()); periods.AddAll(excludeDays.Cast <ITimePeriod>()); var gapCalculator = new TimeGapCalculator <TimeRange>(new TimeCalendar()); var gaps = gapCalculator.GetGaps(periods, limits); gaps.Count.Should().Be(4); gaps[0].IsSamePeriod(new TimeRange(new DateTime(2011, 3, 4), DurationUtil.Days(1))).Should().Be.True(); gaps[1].IsSamePeriod(new TimeRange(new DateTime(2011, 3, 9), DurationUtil.Days(3))).Should().Be.True(); gaps[2].IsSamePeriod(new TimeRange(new DateTime(2011, 3, 14), DurationUtil.Days(2))).Should().Be.True(); gaps[3].IsSamePeriod(new TimeRange(new DateTime(2011, 3, 18), DurationUtil.Days(1))).Should().Be.True(); }
protected override bool OnVisitMonth(MonthRange month, CalendarPeriodCollectorContext context) { if (IsDebugEnabled) { log.Debug("Month[{0}]를 탐색합니다...", month); } if (context.Scope != CalendarPeriodCollectorContext.CollectKind.Day) { return(true); // continue } // all month if (Filter.CollectingDays.Count == 0) { var days = month.GetDays().Where(d => IsMatchingDay(d, context) && CheckLimits(d)); _periods.AddAll(days.Cast <ITimePeriod>().AsEnumerable()); } else { var days = Filter.CollectingDays .Select(day => { if (day.IsSingleDay) { var dayRange = new DayRange(month.Year, month.Month, day.Min, month.TimeCalendar); if (IsMatchingDay(dayRange, context) && CheckLimits(dayRange)) { return(dayRange); } } else { var dayRanges = new DayRangeCollection(month.Year, month.Month, day.Min, day.Max - day.Min, month.TimeCalendar); var isMatching = dayRanges.GetDays().All(d => IsMatchingDay(d, context)); if (isMatching && CheckLimits(dayRanges)) { return((ITimePeriod)dayRanges); } } return(null); }) .Where(d => d != null); _periods.AddAll(days.Cast <ITimePeriod>().AsEnumerable()); } return(false); // abort }