Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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
        }