/// <summary>
        /// Street cleaning occurs from April to October on the first and third Monday of the
        /// month, excluding holidays. In this test there are two holidays: July 4 and Labor
        /// Day (first Monday in Sep). The street cleaning example is taken directly from
        /// Martin Fowler's white paper "Recurring Events for Calendars".
        /// </summary>
        private static TemporalExpression BuildStreetCleaningTemporalExpression()
        {
            var maHolidays      = new UnionTE();
            var independenceDay = new FixedHolidayTE(7, 4);
            var laborDay        = new FloatingHolidayTE(9, 1, 1);

            maHolidays.Add(independenceDay);
            maHolidays.Add(laborDay);

            var firstMondayFirstWeek = new DayInMonthTE(1, 1);
            var firstMondayThirdWeek = new DayInMonthTE(1, 3);

            var firstAndThirdMonday = new UnionTE();

            firstAndThirdMonday.Add(firstMondayThirdWeek);
            firstAndThirdMonday.Add(firstMondayFirstWeek);

            var streetCleaningMonths = new IntersectionTE();

            streetCleaningMonths.Add(firstAndThirdMonday);
            streetCleaningMonths.Add(new RangeEachYearTE(3, 9));
            var diff = new DifferenceTE(streetCleaningMonths, maHolidays);

            return(diff);
        }
예제 #2
0
        public void LastFridayOfMonthTest()
        {
            var lastFriday = new DayInMonthTE(DayOfWeekEnum.Fri, MonthlyIntervalEnum.Last);

            Assert.IsTrue(lastFriday.Includes(new DateTime(2010, 1, 29)));
            Assert.IsTrue(lastFriday.Includes(new DateTime(2011, 6, 24)));
            Assert.IsTrue(lastFriday.Includes(new DateTime(2012, 9, 28)));

            Assert.IsFalse(lastFriday.Includes(new DateTime(2010, 1, 28)));
            Assert.IsFalse(lastFriday.Includes(new DateTime(2010, 1, 22)));
            Assert.IsFalse(lastFriday.Includes(new DateTime(2012, 7, 31)));
        }
예제 #3
0
        public void SecondTuesdayOfMonthTest()
        {
            var secondTuesday = new DayInMonthTE(DayOfWeekEnum.Tue, MonthlyIntervalEnum.Second);

            Assert.IsTrue(secondTuesday.Includes(new DateTime(2010, 6, 8)));
            Assert.IsTrue(secondTuesday.Includes(new DateTime(2011, 1, 11)));
            Assert.IsTrue(secondTuesday.Includes(new DateTime(2012, 11, 13)));

            Assert.IsFalse(secondTuesday.Includes(new DateTime(2012, 11, 19)));
            Assert.IsFalse(secondTuesday.Includes(new DateTime(2012, 1, 2)));
            Assert.IsFalse(secondTuesday.Includes(new DateTime(2012, 10, 29)));
        }
예제 #4
0
        public void SaturdayTest()
        {
            var saturday = new DayInMonthTE(DayOfWeekEnum.Sat);

            Assert.IsTrue(saturday.Includes(new DateTime(2010, 6, 26)));
            Assert.IsTrue(saturday.Includes(new DateTime(2011, 1, 1)));
            Assert.IsTrue(saturday.Includes(new DateTime(2012, 9, 29)));

            Assert.IsFalse(saturday.Includes(new DateTime(2010, 4, 29)));
            Assert.IsFalse(saturday.Includes(new DateTime(2011, 9, 1)));
            Assert.IsFalse(saturday.Includes(new DateTime(2012, 2, 10)));
        }
예제 #5
0
        public void SundayTest()
        {
            var sunday = new DayInMonthTE(DayOfWeekEnum.Sun);

            Assert.IsTrue(sunday.Includes(new DateTime(2010, 6, 27)));
            Assert.IsTrue(sunday.Includes(new DateTime(2011, 1, 2)));
            Assert.IsTrue(sunday.Includes(new DateTime(2012, 9, 30)));

            Assert.IsFalse(sunday.Includes(new DateTime(2010, 8, 14)));
            Assert.IsFalse(sunday.Includes(new DateTime(2011, 3, 15)));
            Assert.IsFalse(sunday.Includes(new DateTime(2012, 8, 1)));
        }
        public UnionTE Create()
        {
            var union            = new UnionTE();
            var monthlyIntervals = EnumExtensions.GetFlags(_event.MonthlyIntervalOptions);

            foreach (MonthlyIntervalEnum monthlyInterval in monthlyIntervals)
            {
                var daysOfWeek = EnumExtensions.GetFlags(_event.DaysOfWeekOptions);
                foreach (DayOfWeekEnum dayOfWeek in daysOfWeek)
                {
                    var dayInMonth = new DayInMonthTE(dayOfWeek, monthlyInterval);
                    union.Add(dayInMonth);
                }
            }
            return(union);
        }
예제 #7
0
        public void ThirdWeekendEveryMonthTest()
        {
            var weekend = new DayInMonthTE(DayOfWeekEnum.Sat | DayOfWeekEnum.Sun, MonthlyIntervalEnum.Third);

            Assert.IsTrue(weekend.GetHashCode().Equals(3));

            var thirdWeekendAug2012 = new DayInMonthTE(DayOfWeekEnum.Sat | DayOfWeekEnum.Sun, MonthlyIntervalEnum.Third);

            Assert.IsTrue(weekend.Equals(thirdWeekendAug2012));

            var firstWeekendAug2012 = new DayInMonthTE(DayOfWeekEnum.Sat | DayOfWeekEnum.Sun, MonthlyIntervalEnum.First);

            Assert.IsFalse(weekend.Equals(firstWeekendAug2012));

            Assert.IsFalse(weekend.Equals(null));
        }
예제 #8
0
        public void LastWeekendEveryMonthTest()
        {
            var weekend = new DayInMonthTE(DayOfWeekEnum.Sat | DayOfWeekEnum.Sun, MonthlyIntervalEnum.Last);

            Assert.LessOrEqual(weekend.GetHashCode(), 0);

            var lastWeekendAug2012 = new DayInMonthTE(DayOfWeekEnum.Sat | DayOfWeekEnum.Sun, MonthlyIntervalEnum.Last);

            Assert.IsTrue(weekend.Equals(lastWeekendAug2012));

            var firstWeekendAug2012 = new DayInMonthTE(DayOfWeekEnum.Sat | DayOfWeekEnum.Sun, MonthlyIntervalEnum.First);

            Assert.IsFalse(weekend.Equals(firstWeekendAug2012));

            Assert.IsFalse(weekend.Equals(null));

            Assert.IsFalse(weekend.Equals(1)); // unknown object
        }