public void PeriodLimitsAddTest() { var test = new DateTime(2011, 4, 12); var timeRange1 = new TimeRange(new DateTime(2011, 4, 20), new DateTime(2011, 4, 25)); // 4월 20일~4월25일 var timeRange2 = new TimeRange(new DateTime(2011, 4, 30), null); // 4월 30일 이후 var calendarDateAdd = new CalendarDateAdd(); // 예외 기간을 설정합니다. 4월20일 ~ 4월25일, 4월30일 이후 // calendarDateAdd.ExcludePeriods.Add(timeRange1); calendarDateAdd.ExcludePeriods.Add(timeRange2); calendarDateAdd.Add(test, DurationUtil.Day).Should().Be(test.Add(DurationUtil.Day)); //! 4월 12일에 8일을 더하면 4월 20일이지만, 20~25일까지 제외되므로, 4월 25일이 된다. // calendarDateAdd.Add(test, DurationUtil.Days(8)).Should().Be(timeRange1.End); //! 4월 20일에 20일을 더하면, 4월 20~25일 제외 후를 계산하면 4월 30일 이후가 된다. 하지만 4월 30일 이후는 제외가 되므로, 결과값은 null이 된다. // calendarDateAdd.Add(test, DurationUtil.Days(20)).HasValue.Should().Be.False(); calendarDateAdd.Subtract(test, DurationUtil.Days(3)).Should().Be(test.Subtract(DurationUtil.Days(3))); }
public void PeriodLimitsSubtractTest() { var test = new DateTime(2011, 4, 30); var timeRange1 = new TimeRange(new DateTime(2011, 4, 20), new DateTime(2011, 4, 25)); var timeRange2 = new TimeRange(DateTime.MinValue, new DateTime(2011, 4, 6)); var calendarDateAdd = new CalendarDateAdd(); // 예외 기간을 설정합니다. 4월 10일 이전, 4월20일 ~ 4월25일 // calendarDateAdd.ExcludePeriods.Add(timeRange1); calendarDateAdd.ExcludePeriods.Add(timeRange2); calendarDateAdd.Subtract(test, DurationUtil.Days(1)).Should().Be(test.Subtract(DurationUtil.Days(1))); //! 4월 30일로부터 5일전이면 4월25일이지만, 예외기간이 4월20일~4월25일이므로, 4월20일을 반환합니다. // calendarDateAdd.Subtract(test, DurationUtil.Days(5)).Should().Be(timeRange1.Start); //! 4월 30일로부터 20일전이면, 4월10일 이지만 예외기간이 4월20일~4월25일이 있어 4월 5일이 되지만 4월 6일 이전은 예외기간이라 null을 반환합니다. // calendarDateAdd.Subtract(test, DurationUtil.Days(20)).HasValue.Should().Be.False(); calendarDateAdd.Add(test, DurationUtil.Days(3)).Should().Be(test.Add(DurationUtil.Days(3))); }
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(); }
public void IncludeExclude6Test() { var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(new TimeRange(new DateTime(2011, 3, 10), new DateTime(2011, 3, 20))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 5), new DateTime(2011, 3, 12))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 18), new DateTime(2011, 3, 30))); var test = new DateTime(2011, 3, 10); dateAdd.Add(test, TimeSpan.Zero).Should().Be(new DateTime(2011, 3, 12)); dateAdd.Add(test, DurationUtil.Days(1)).Should().Be(new DateTime(2011, 3, 13)); }
public void IncludeTest() { var test = new DateTime(2011, 4, 12); var timeRange = new TimeRange(new DateTime(2011, 4, 1), DateTime.MaxValue); var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(timeRange); dateAdd.Add(test, TimeSpan.Zero).Should().Be(test); dateAdd.Add(test, DurationUtil.Days(1)).Should().Be(test.AddDays(1)); dateAdd.Add(test, DurationUtil.Days(365)).Should().Be(test.AddDays(365)); }
public void NoPeriodsTest() { var test = new DateTime(2011, 4, 12); var dateAdd = new DateAdd(); dateAdd.Add(test, DurationUtil.Zero).Should().Be(test); dateAdd.Add(test, DurationUtil.Days(1)).Should().Be(test.AddDays(1)); dateAdd.Add(test, DurationUtil.Days(-1)).Should().Be(test.AddDays(-1)); dateAdd.Subtract(test, DurationUtil.Days(1)).Should().Be(test.AddDays(-1)); dateAdd.Subtract(test, DurationUtil.Days(-1)).Should().Be(test.AddDays(1)); }
public void IncludeExclude4Test() { var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(new TimeRange(new DateTime(2011, 3, 10), new DateTime(2011, 3, 20))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 10), new DateTime(2011, 3, 15))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 15), new DateTime(2011, 3, 20))); var test = new DateTime(2011, 3, 10); Assert.IsNull(dateAdd.Add(test, TimeSpan.Zero)); Assert.IsNull(dateAdd.Add(test, DurationUtil.Days(1))); Assert.IsNull(dateAdd.Add(test, DurationUtil.Days(5))); }
public void DayTest() { DurationUtil.Day.Should().Be(TimeSpan.FromDays(1)); DurationUtil.Days(0).Should().Be(TimeSpan.Zero); DurationUtil.Days(1).Should().Be(TimeSpan.FromDays(1)); DurationUtil.Days(2).Should().Be(TimeSpan.FromDays(2)); DurationUtil.Days(-1).Should().Be(TimeSpan.FromDays(-1)); DurationUtil.Days(-2).Should().Be(TimeSpan.FromDays(-2)); DurationUtil.Days(1, 23).Should().Be(new TimeSpan(1, 23, 0, 0)); DurationUtil.Days(1, 23, 22).Should().Be(new TimeSpan(1, 23, 22, 0)); DurationUtil.Days(1, 23, 22, 55).Should().Be(new TimeSpan(1, 23, 22, 55)); DurationUtil.Days(1, 23, 22, 55, 496).Should().Be(new TimeSpan(1, 23, 22, 55, 496)); }
public void ExcludeTest() { DateTime test = new DateTime(2011, 4, 12); var timeRange = new TimeRange(new DateTime(2011, 4, 15), new DateTime(2011, 4, 20)); var calendarDateAdd = new CalendarDateAdd(); calendarDateAdd.ExcludePeriods.Add(timeRange); calendarDateAdd.Add(test, TimeSpan.Zero).Should().Be(test); calendarDateAdd.Add(test, DurationUtil.Days(2)).Should().Be(test.AddDays(2)); calendarDateAdd.Add(test, DurationUtil.Days(3)).Should().Be(timeRange.End); calendarDateAdd.Add(test, DurationUtil.Days(3, 0, 0, 0, 1)).Should().Be(timeRange.End.Add(DurationUtil.Millisecond)); calendarDateAdd.Add(test, DurationUtil.Days(5)).Should().Be(timeRange.End.AddDays(2)); }
public void IncludeExclude3Test() { var dateAdd = new DateAdd(); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 5), new DateTime(2011, 3, 10))); dateAdd.IncludePeriods.Add(new TimeRange(new DateTime(2011, 3, 10), new DateTime(2011, 3, 15))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 15), new DateTime(2011, 3, 20))); var test = new DateTime(2011, 3, 10); dateAdd.Subtract(test, TimeSpan.Zero).Should().Be(test); dateAdd.Add(test, DurationUtil.Days(1)).Should().Be(new DateTime(2011, 3, 11)); dateAdd.Add(test, DurationUtil.Days(5), SeekBoundaryMode.Fill).Should().Be(test.AddDays(5)); dateAdd.Add(test, DurationUtil.Days(5)).Should().Not.Have.Value(); }
public void IncludeOutsideMinTest() { var test = new DateTime(2011, 4, 12); var timeRange = new TimeRange(DateTime.MinValue, new DateTime(2011, 4, 10)); var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(timeRange); dateAdd.Add(test, DurationUtil.Zero).Should().Not.Have.Value(); dateAdd.Add(test, DurationUtil.Days(1)).Should().Not.Have.Value(); dateAdd.Subtract(test, DurationUtil.Zero).Should().Be(timeRange.End); dateAdd.Subtract(test, DurationUtil.Days(1)).Should().Be(timeRange.End.AddDays(-1)); }
public void IncludeOutsideMaxTest() { var test = new DateTime(2011, 4, 12); var timeRange = new TimeRange(new DateTime(2011, 4, 20), DateTime.MaxValue); var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(timeRange); dateAdd.Add(test, DurationUtil.Zero).Should().Be(timeRange.Start); dateAdd.Add(test, DurationUtil.Days(1)).Should().Be(timeRange.Start.AddDays(1)); dateAdd.Subtract(test, DurationUtil.Zero).Should().Not.Have.Value(); dateAdd.Subtract(test, DurationUtil.Days(1)).Should().Not.Have.Value(); }
public void AllExcluded3Test() { var test = new DateTime(2011, 4, 12); var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(new TimeRange(new DateTime(2011, 4, 10), new DateTime(2011, 4, 20))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 4, 15), new DateTime(2011, 4, 20))); dateAdd.Add(test, TimeSpan.Zero).Should().Be(test); dateAdd.Add(test, DurationUtil.Days(1)).Should().Be(test.AddDays(1)); dateAdd.Add(test, DurationUtil.Days(2)).Should().Be(test.AddDays(2)); dateAdd.Add(test, DurationUtil.Days(3)).Should().Not.Have.Value(); }
public void NoPeriodTest() { var calendarDateAdd = new CalendarDateAdd(); var now = ClockProxy.Clock.Now; Enumerable .Range(-10, 20) .RunEach(index => { var offset = index * 5; calendarDateAdd.Add(now, DurationUtil.Days(offset)).Should().Be(now.Add(DurationUtil.Days(offset))); calendarDateAdd.Add(now, DurationUtil.Days(-offset)).Should().Be(now.Add(DurationUtil.Days(-offset))); calendarDateAdd.Subtract(now, DurationUtil.Days(offset)).Should().Be(now.Subtract(DurationUtil.Days(offset))); calendarDateAdd.Subtract(now, DurationUtil.Days(-offset)).Should().Be( now.Subtract(DurationUtil.Days(-offset))); }); }
public void ExcludeSplitTest() { var test = new DateTime(2011, 4, 12); var calendarDateAdd = new CalendarDateAdd(); var timeRange1 = new TimeRange(new DateTime(2011, 4, 15), new DateTime(2011, 4, 20)); var timeRange2 = new TimeRange(new DateTime(2011, 4, 22), new DateTime(2011, 4, 25)); calendarDateAdd.ExcludePeriods.Add(timeRange1); calendarDateAdd.ExcludePeriods.Add(timeRange2); calendarDateAdd.Add(test, TimeSpan.Zero).Should().Be(test); calendarDateAdd.Add(test, DurationUtil.Days(2)).Should().Be(test.AddDays(2)); // 4월 14일 calendarDateAdd.Add(test, DurationUtil.Days(3)).Should().Be(timeRange1.End); // 4월 15일인데 예외 기간이라서 4월 20일 calendarDateAdd.Add(test, DurationUtil.Days(4)).Should().Be(timeRange1.End.AddDays(1)); // 4월 21일 calendarDateAdd.Add(test, DurationUtil.Days(5)).Should().Be(timeRange2.End); // 4월 22일인데 예외 기간이라서 4월 25일 calendarDateAdd.Add(test, DurationUtil.Days(7)).Should().Be(timeRange2.End.AddDays(2)); // 4월 27일 }
public void EmptyStartWeekTest() { var calendarDateAdd = new CalendarDateAdd(); //! 주중(월~금)만 Working Time으로 넣었습니다. calendarDateAdd.AddWorkingWeekDays(); var start = new DateTime(2011, 4, 2, 13, 0, 0); var offset = DurationUtil.Hours(20); // 20 hours // 4월 2일(토), 4월 3일(일) 제외하면... 4월 4일 0시부터 20시간 calendarDateAdd.Add(start, DurationUtil.Hours(20)).Should().Be(new DateTime(2011, 4, 4, 20, 0, 0)); // 4월 2일(토), 4월 3일(일) 제외하면... 4월 4일 0시부터 24시간 calendarDateAdd.Add(start, DurationUtil.Hours(24)).Should().Be(new DateTime(2011, 4, 5, 0, 0, 0)); // 4월 2일(토), 4월 3일(일) 제외하면... 4월 4일 0시부터 5일이후 이므로 4월9일 (토), 4월 10일(일) 제외하면 4월 11일이 된다. calendarDateAdd.Add(start, DurationUtil.Days(5)).Should().Be(new DateTime(2011, 4, 11, 0, 0, 0)); }
public void ExcludeSplitTest() { var test = new DateTime(2011, 4, 12); var timeRange1 = new TimeRange(new DateTime(2011, 4, 15), new DateTime(2011, 4, 20)); var timeRange2 = new TimeRange(new DateTime(2011, 4, 22), new DateTime(2011, 4, 25)); var dateAdd = new DateAdd(); dateAdd.ExcludePeriods.Add(timeRange1); dateAdd.ExcludePeriods.Add(timeRange2); dateAdd.Add(test, TimeSpan.Zero).Should().Be(test); dateAdd.Add(test, DurationUtil.Days(1)).Should().Be(test.AddDays(1)); dateAdd.Add(test, DurationUtil.Days(2)).Should().Be(test.AddDays(2)); dateAdd.Add(test, DurationUtil.Days(3)).Should().Be(timeRange1.End); dateAdd.Add(test, DurationUtil.Days(4)).Should().Be(timeRange1.End.AddDays(1)); dateAdd.Add(test, DurationUtil.Days(5)).Should().Be(timeRange2.End); dateAdd.Add(test, DurationUtil.Days(6)).Should().Be(timeRange2.End.AddDays(1)); dateAdd.Add(test, DurationUtil.Days(7)).Should().Be(timeRange2.End.AddDays(2)); }
public void IncludeSplitTest() { DateTime test = new DateTime(2011, 4, 12); var timeRange1 = new TimeRange(new DateTime(2011, 4, 1), new DateTime(2011, 4, 15)); var timeRange2 = new TimeRange(new DateTime(2011, 4, 20), new DateTime(2011, 4, 24)); var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(timeRange1); dateAdd.IncludePeriods.Add(timeRange2); dateAdd.Add(test, TimeSpan.Zero).Should().Be(test); dateAdd.Add(test, DurationUtil.Days(1)).Should().Be(test.AddDays(1)); dateAdd.Add(test, DurationUtil.Days(3)).Should().Be(timeRange2.Start); dateAdd.Add(test, DurationUtil.Days(5)).Should().Be(timeRange2.Start.AddDays(2)); dateAdd.Add(test, DurationUtil.Days(6)).Should().Be(timeRange2.Start.AddDays(3)); // NOTE: SeekBoundaryMode 에 따라 결과가 달라짐을 인식하세요!!! // dateAdd.Add(test, DurationUtil.Days(7), SeekBoundaryMode.Fill).Should().Be(timeRange2.End); dateAdd.Add(test, DurationUtil.Days(7), SeekBoundaryMode.Next).Should().Not.Have.Value(); }
public void IncludeExcludeTest() { var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(new TimeRange(new DateTime(2011, 3, 17), new DateTime(2011, 4, 20))); // setup some periods to exclude dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 22), new DateTime(2011, 3, 25))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 4, 1), new DateTime(2011, 4, 7))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 4, 15), new DateTime(2011, 4, 16))); // positive var periodStart = new DateTime(2011, 3, 19); dateAdd.Add(periodStart, DurationUtil.Hours(1)).Should().Be(periodStart.AddHours(1)); dateAdd.Add(periodStart, DurationUtil.Days(4)).Should().Be(new DateTime(2011, 3, 26)); dateAdd.Add(periodStart, DurationUtil.Days(17)).Should().Be(new DateTime(2011, 4, 14)); dateAdd.Add(periodStart, DurationUtil.Days(20)).Should().Be(new DateTime(2011, 4, 18)); dateAdd.Add(periodStart, DurationUtil.Days(20)).Should().Be(new DateTime(2011, 4, 18)); dateAdd.Add(periodStart, DurationUtil.Days(22), SeekBoundaryMode.Fill).Should().Be(new DateTime(2011, 4, 20)); dateAdd.Add(periodStart, DurationUtil.Days(22), SeekBoundaryMode.Next).Should().Not.Have.Value(); dateAdd.Add(periodStart, DurationUtil.Days(22)).Should().Not.Have.Value(); // negative var periodEnd = new DateTime(2011, 4, 18); dateAdd.Add(periodEnd, DurationUtil.Hours(-1)).Should().Be(periodEnd.AddHours(-1)); dateAdd.Add(periodEnd, DurationUtil.Days(-4)).Should().Be(new DateTime(2011, 4, 13)); dateAdd.Add(periodEnd, DurationUtil.Days(-17)).Should().Be(new DateTime(2011, 3, 22)); dateAdd.Add(periodEnd, DurationUtil.Days(-20)).Should().Be(new DateTime(2011, 3, 19)); dateAdd.Add(periodEnd, DurationUtil.Days(-22), SeekBoundaryMode.Fill).Should().Be(new DateTime(2011, 3, 17)); dateAdd.Add(periodEnd, DurationUtil.Days(-22), SeekBoundaryMode.Next).Should().Not.Have.Value(); dateAdd.Add(periodEnd, DurationUtil.Days(-22)).Should().Not.Have.Value(); }
public void IncludeExclude2Test() { var dateAdd = new DateAdd(); dateAdd.IncludePeriods.Add(new TimeRange(new DateTime(2011, 3, 1), new DateTime(2011, 3, 5))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 5), new DateTime(2011, 3, 10))); dateAdd.IncludePeriods.Add(new TimeRange(new DateTime(2011, 3, 10), new DateTime(2011, 3, 15))); dateAdd.ExcludePeriods.Add(new TimeRange(new DateTime(2011, 3, 15), new DateTime(2011, 3, 20))); dateAdd.IncludePeriods.Add(new TimeRange(new DateTime(2011, 3, 20), new DateTime(2011, 3, 25))); var periodStart = new DateTime(2011, 3, 1); var periodEnd = new DateTime(2011, 3, 25); // add from start dateAdd.Add(periodStart, TimeSpan.Zero).Should().Be(periodStart); dateAdd.Add(periodStart, DurationUtil.Days(1)).Should().Be(new DateTime(2011, 3, 2)); dateAdd.Add(periodStart, DurationUtil.Days(3)).Should().Be(new DateTime(2011, 3, 4)); dateAdd.Add(periodStart, DurationUtil.Days(4)).Should().Be(new DateTime(2011, 3, 10)); dateAdd.Add(periodStart, DurationUtil.Days(5)).Should().Be(new DateTime(2011, 3, 11)); dateAdd.Add(periodStart, DurationUtil.Days(8)).Should().Be(new DateTime(2011, 3, 14)); dateAdd.Add(periodStart, DurationUtil.Days(9)).Should().Be(new DateTime(2011, 3, 20)); dateAdd.Add(periodStart, DurationUtil.Days(10)).Should().Be(new DateTime(2011, 3, 21)); dateAdd.Add(periodStart, DurationUtil.Days(14), SeekBoundaryMode.Fill).Should().Be(new DateTime(2011, 3, 25)); dateAdd.Add(periodStart, DurationUtil.Days(14), SeekBoundaryMode.Next).Should().Not.Have.Value(); dateAdd.Add(periodStart, DurationUtil.Days(14)).Should().Not.Have.Value(); // add from end dateAdd.Add(periodEnd, TimeSpan.Zero).Should().Be(periodEnd); dateAdd.Add(periodEnd, DurationUtil.Days(-1)).Should().Be(periodEnd.AddDays(-1)); dateAdd.Add(periodEnd, DurationUtil.Days(-5)).Should().Be(new DateTime(2011, 3, 15)); dateAdd.Add(periodEnd, DurationUtil.Days(-6)).Should().Be(new DateTime(2011, 3, 14)); dateAdd.Add(periodEnd, DurationUtil.Days(-10)).Should().Be(new DateTime(2011, 3, 5)); dateAdd.Add(periodEnd, DurationUtil.Days(-11)).Should().Be(new DateTime(2011, 3, 4)); dateAdd.Add(periodEnd, DurationUtil.Days(-14), SeekBoundaryMode.Fill).Should().Be(new DateTime(2011, 3, 1)); dateAdd.Add(periodEnd, DurationUtil.Days(-14), SeekBoundaryMode.Next).Should().Not.Have.Value(); dateAdd.Add(periodEnd, DurationUtil.Days(-14)).Should().Not.Have.Value(); // subtract form end dateAdd.Subtract(periodEnd, TimeSpan.Zero).Should().Be(periodEnd); dateAdd.Subtract(periodEnd, DurationUtil.Days(1)).Should().Be(periodEnd.AddDays(-1)); dateAdd.Subtract(periodEnd, DurationUtil.Days(5)).Should().Be(new DateTime(2011, 3, 15)); dateAdd.Subtract(periodEnd, DurationUtil.Days(6)).Should().Be(new DateTime(2011, 3, 14)); dateAdd.Subtract(periodEnd, DurationUtil.Days(10)).Should().Be(new DateTime(2011, 3, 5)); dateAdd.Subtract(periodEnd, DurationUtil.Days(11)).Should().Be(new DateTime(2011, 3, 4)); dateAdd.Subtract(periodEnd, DurationUtil.Days(14), SeekBoundaryMode.Fill).Should().Be(new DateTime(2011, 3, 1)); dateAdd.Subtract(periodEnd, DurationUtil.Days(14), SeekBoundaryMode.Next).Should().Not.Have.Value(); dateAdd.Subtract(periodEnd, DurationUtil.Days(14)).Should().Not.Have.Value(); // subtract form start dateAdd.Subtract(periodStart, TimeSpan.Zero).Should().Be(periodStart); dateAdd.Subtract(periodStart, DurationUtil.Days(-1)).Should().Be(new DateTime(2011, 3, 2)); dateAdd.Subtract(periodStart, DurationUtil.Days(-3)).Should().Be(new DateTime(2011, 3, 4)); dateAdd.Subtract(periodStart, DurationUtil.Days(-4)).Should().Be(new DateTime(2011, 3, 10)); dateAdd.Subtract(periodStart, DurationUtil.Days(-5)).Should().Be(new DateTime(2011, 3, 11)); dateAdd.Subtract(periodStart, DurationUtil.Days(-8)).Should().Be(new DateTime(2011, 3, 14)); dateAdd.Subtract(periodStart, DurationUtil.Days(-9)).Should().Be(new DateTime(2011, 3, 20)); dateAdd.Subtract(periodStart, DurationUtil.Days(-10)).Should().Be(new DateTime(2011, 3, 21)); dateAdd.Subtract(periodStart, DurationUtil.Days(-14), SeekBoundaryMode.Fill).Should().Be(new DateTime(2011, 3, 25)); dateAdd.Subtract(periodStart, DurationUtil.Days(-14), SeekBoundaryMode.Next).Should().Not.Have.Value(); dateAdd.Subtract(periodStart, DurationUtil.Days(-14)).Should().Not.Have.Value(); }