Inheritance: WeekTimeRange
Esempio n. 1
0
        public void DefaultCalendarTest()
        {
            const int startWeek   = 1;
            var       currentTime = ClockProxy.Clock.Now;
            var       currentYear = ClockProxy.Clock.Now.Year;

            Action <CultureInfo> @weekRangeTestAction =
                (culture) => {
                foreach (WeekOfYearRuleKind yearWeekType in WeekOfYearRules)
                {
                    var yearWeek = WeekTool.GetYearAndWeek(currentTime, culture, yearWeekType);

                    for (int weekOfYear = startWeek; weekOfYear < yearWeek.Week; weekOfYear++)
                    {
                        var week = new WeekRange(currentYear, weekOfYear, TimeCalendar.New(culture, 1, yearWeekType));
                        week.Year.Should().Be(currentYear);

                        var weekStart = WeekTool.GetWeekRange(new YearAndWeek(currentYear, weekOfYear), culture, yearWeekType).Start;
                        var weekEnd   = weekStart.AddDays(TimeSpec.DaysPerWeek);

                        week.UnmappedStart.Should().Be(weekStart);
                        week.UnmappedEnd.Should().Be(weekEnd);
                    }
                }
            };

            Parallel.For(0, CultureTestData.Default.Count(), i => @weekRangeTestAction(CultureTestData.Default[i]));

            //!++ BUG:Silverlight 용 Paralell.ForEach 에 버그가 있습니다.
            // Parallel.ForEach(CultureTestData.Default.Cultures, @weekRangeTestAction);
        }
Esempio n. 2
0
 public void EnAuCultureTest() {
     var cultureInfo = new CultureInfo("en-AU");
     //	cultureInfo.DateTimeFormat.CalendarWeekRule = CalendarWeekRule.FirstFourDayWeek;
     var timeCalendar = new TimeCalendar(new TimeCalendarConfig { Culture = cultureInfo });
     var week = new WeekRange(new DateTime(2011, 4, 1, 9, 0, 0), timeCalendar);
     week.Start.Should().Be(new DateTime(2011, 3, 28));
 }
Esempio n. 3
0
        public void DefaultCalendarTest() {
            const int startWeek = 1;
            var currentTime = ClockProxy.Clock.Now;
            var currentYear = ClockProxy.Clock.Now.Year;

            Action<CultureInfo> @weekRangeTestAction =
                (culture) => {
                    foreach(WeekOfYearRuleKind yearWeekType in WeekOfYearRules) {
                        var yearWeek = WeekTool.GetYearAndWeek(currentTime, culture, yearWeekType);

                        for(int weekOfYear = startWeek; weekOfYear < yearWeek.Week; weekOfYear++) {
                            var week = new WeekRange(currentYear, weekOfYear, TimeCalendar.New(culture, 1, yearWeekType));
                            week.Year.Should().Be(currentYear);

                            var weekStart = WeekTool.GetWeekRange(new YearAndWeek(currentYear, weekOfYear), culture, yearWeekType).Start;
                            var weekEnd = weekStart.AddDays(TimeSpec.DaysPerWeek);

                            week.UnmappedStart.Should().Be(weekStart);
                            week.UnmappedEnd.Should().Be(weekEnd);
                        }
                    }
                };

            Parallel.For(0, CultureTestData.Default.Count(), i => @weekRangeTestAction(CultureTestData.Default[i]));

            //!++ BUG:Silverlight 용 Paralell.ForEach 에 버그가 있습니다.
            // Parallel.ForEach(CultureTestData.Default.Cultures, @weekRangeTestAction);
        }
Esempio n. 4
0
        public void EnAuCultureTest()
        {
            var cultureInfo = new CultureInfo("en-AU");
            //	cultureInfo.DateTimeFormat.CalendarWeekRule = CalendarWeekRule.FirstFourDayWeek;
            var timeCalendar = new TimeCalendar(new TimeCalendarConfig {
                Culture = cultureInfo
            });
            var week = new WeekRange(new DateTime(2011, 4, 1, 9, 0, 0), timeCalendar);

            week.Start.Should().Be(new DateTime(2011, 3, 28));
        }
Esempio n. 5
0
        public void WeekByCultures() {
            var now = ClockProxy.Clock.Now;

            CultureTestData.Default
                .RunEach(culture => {
                             if(IsDebugEnabled)
                                 log.Debug("culture = " + culture);

                             var timeCalendar = new TimeCalendar(new TimeCalendarConfig() { Culture = culture });
                             var week = new WeekRange(now, timeCalendar);

                             week.StartDayStart.Should().Be(now.StartTimeOfWeek(culture).Date);
                             week.EndDayStart.Should().Be(now.EndTimeOfWeek(culture).Date);
                         });
        }
        public void CalendarWeeksTest() {
            const int startYear = 2004;
            const int startWeek = 22;
            const int weekCount = 5;
            var weekRanges = new WeekRangeCollection(startYear, startWeek, weekCount);

            weekRanges.Year.Should().Be(startYear);
            weekRanges.WeekCount.Should().Be(weekCount);
            weekRanges.StartWeek.Should().Be(startWeek);
            weekRanges.EndWeek.Should().Be(startWeek + weekCount - 1);

            var weeks = weekRanges.GetWeeks().ToTimePeriodCollection();
            weeks.Count.Should().Be(weekCount);

            var week = new WeekRange(startYear, startWeek);

            for(var i = 0; i < weekCount; i++)
                weeks[i].IsSamePeriod(week.AddWeeks(i)).Should().Be.True();
        }
Esempio n. 7
0
        public void WeekByCultures()
        {
            var now = ClockProxy.Clock.Now;

            CultureTestData.Default
            .RunEach(culture => {
                if (IsDebugEnabled)
                {
                    log.Debug("culture = " + culture);
                }

                var timeCalendar = new TimeCalendar(new TimeCalendarConfig()
                {
                    Culture = culture
                });
                var week = new WeekRange(now, timeCalendar);

                week.StartDayStart.Should().Be(now.StartTimeOfWeek(culture).Date);
                week.EndDayStart.Should().Be(now.EndTimeOfWeek(culture).Date);
            });
        }
        public void CalendarWeeksTest()
        {
            const int startYear  = 2004;
            const int startWeek  = 22;
            const int weekCount  = 5;
            var       weekRanges = new WeekRangeCollection(startYear, startWeek, weekCount);

            weekRanges.Year.Should().Be(startYear);
            weekRanges.WeekCount.Should().Be(weekCount);
            weekRanges.StartWeek.Should().Be(startWeek);
            weekRanges.EndWeek.Should().Be(startWeek + weekCount - 1);

            var weeks = weekRanges.GetWeeks().ToTimePeriodCollection();

            weeks.Count.Should().Be(weekCount);

            var week = new WeekRange(startYear, startWeek);

            for (var i = 0; i < weekCount; i++)
            {
                weeks[i].IsSamePeriod(week.AddWeeks(i)).Should().Be.True();
            }
        }
Esempio n. 9
0
        /// <summary>
        /// <paramref name="current"/> 기준으로 예외기간 등을 고려한 선행의 WeekRange를 구합니다.
        /// </summary>
        /// <param name="current"></param>
        /// <returns></returns>
        private WeekRange FindPreviousWeek(WeekRange current) {
            if(IsDebugEnabled)
                log.Debug("현 Week [{0}]의 이전 Week 기간을 구합니다...", current);

            WeekRange result;

            if(ExcludePeriods.Count == 0) {
                result = current.GetPreviousWeek();
            }
            else {
                var limits = new TimeRange(DateTime.MinValue, current.Start.AddTicks(-1));
                var gapCalculator = new TimeGapCalculator<TimeRange>(TimeCalendar);
                var remainingPeriods = gapCalculator.GetGaps(ExcludePeriods, limits);

                result = (remainingPeriods.Count > 0)
                             ? new WeekRange(remainingPeriods[remainingPeriods.Count - 1].End, TimeCalendar)
                             : null;
            }

            if(IsDebugEnabled)
                log.Debug("현 Week의 이전 Week 기간을 구했습니다. current=[{0}], next=[{1}]", current, result);

            return result;
        }
Esempio n. 10
0
        /// <summary>
        /// <paramref name="current"/> 기준으로 예외 기간 등을 고려한 후행의 가장 근접한 WeekRange를 구합니다.
        /// </summary>
        /// <param name="current"></param>
        /// <returns></returns>
        private WeekRange FindNextWeek(WeekRange current) {
            if(IsDebugEnabled)
                log.Debug("현 Week [{0}]의 다음 Week 기간을  구합니다...", current);

            WeekRange result;
            if(ExcludePeriods.Count == 0) {
                result = current.GetNextWeek();
            }
            else {
                var limits = new TimeRange(current.End.AddTicks(1), DateTime.MaxValue);
                var gapCalculator = new TimeGapCalculator<TimeRange>(TimeCalendar);
                var remainingPeriods = gapCalculator.GetGaps(ExcludePeriods, limits);

                result = (remainingPeriods.Count > 0) ? new WeekRange(remainingPeriods[0].Start, TimeCalendar) : null;
            }

            if(IsDebugEnabled)
                log.Debug("현 Week의 다음 Week 기간을 구했습니다. current=[{0}], next=[{1}]", current, result);

            return result;
        }
Esempio n. 11
0
        /// <summary>
        /// <paramref name="start"/>시각으로부터 <paramref name="offset"/> 만큼 떨어진 시각을 구합니다.
        /// </summary>
        /// <param name="start">기준 시각</param>
        /// <param name="offset">기간</param>
        /// <param name="seekDirection">검색 방향 (이전|이후)</param>
        /// <param name="seekBoundaryMode">검색 값 포함 여부</param>
        /// <returns>기준 시각으로터 오프셋만큼 떨어진 시각</returns>
        protected DateTime? CalculateEnd(DateTime start, TimeSpan offset, SeekDirection seekDirection, SeekBoundaryMode seekBoundaryMode) {
            if(IsDebugEnabled)
                log.Debug("기준시각으로부터 오프셋만큼 떨어진 시각을 구합니다... " +
                          @"start=[{0}], offset=[{1}], seekDirection=[{2}], seekBoundaryMode=[{3}], Calendar=[{4}]",
                          start, offset, seekDirection, seekBoundaryMode, TimeCalendar);

            Guard.Assert(offset >= TimeSpan.Zero, "offset 값은 TimeSpan.Zero 이상이어야 합니다. offset=[{0}]", offset);

            DateTime? end = null;
            DateTime moment = start;
            TimeSpan? remaining = offset;

            var week = new WeekRange(start, TimeCalendar);

            while(week != null) {
                base.IncludePeriods.Clear();
                base.IncludePeriods.AddAll(GetAvailableWeekPeriods(week));

                if(IsDebugEnabled)
                    log.Debug("가능한 기간은=[{0}]", base.IncludePeriods.CollectionToString());

                end = CalculateEnd(moment, remaining.Value, seekDirection, seekBoundaryMode, out remaining);

                if(end != null || remaining.HasValue == false)
                    break;

                if(seekDirection == SeekDirection.Forward) {
                    week = FindNextWeek(week);
                    if(week != null)
                        moment = week.Start;
                }
                else {
                    week = FindPreviousWeek(week);
                    if(week != null)
                        moment = week.End;
                }
            }

            if(IsDebugEnabled)
                log.Debug("기준시각으로부터 오프셋만큼 떨어진 시각을 구했습니다!!! " +
                          @"start=[{0}], offset=[{1}], seekDirection=[{2}], seekBoundaryMode=[{3}], Calendar=[{4}], end=[{5}], remaining=[{6}]",
                          start, offset, seekDirection, seekBoundaryMode, TimeCalendar, end, remaining);

            return end;
        }