public void TestEqualsMethodLargeSwapped()
        {
            IRRuleTokenContainer firstPart  = tokenizer.Tokenize("BYSETPOS=1;FREQ=DAILY;INTERVAL=1;BYMONTHDAY=1");
            IRRuleTokenContainer secondPart = tokenizer.Tokenize("INTERVAL=1;BYMONTHDAY=1;FREQ=DAILY;BYSETPOS=1");

            Assert.AreEqual(firstPart, secondPart);
        }
        public void TestEqualsMethodDifferentValues()
        {
            IRRuleTokenContainer firstPart  = tokenizer.Tokenize("BYSETPOS=1;FREQ=WEEKLY;INTERVAL=1;BYMONTHDAY=1");
            IRRuleTokenContainer secondPart = tokenizer.Tokenize("INTERVAL=1;BYMONTHDAY=1;FREQ=YEARLY;BYSETPOS=1");

            Assert.AreNotEqual(firstPart, secondPart);
        }
        public void TestEqualsMethodComplex()
        {
            IRRuleTokenContainer firstPart  = tokenizer.Tokenize("FREQ=DAILY;INTERVAL=1");
            IRRuleTokenContainer secondPart = tokenizer.Tokenize("INTERVAL=1;FREQ=DAILY;BYSETPOS=1");

            Assert.AreNotEqual(firstPart, secondPart);
        }
        public void TestEqualsMethodSwapped()
        {
            IRRuleTokenContainer firstPart  = tokenizer.Tokenize("FREQ=DAILY;INTERVAL=1");
            IRRuleTokenContainer secondPart = tokenizer.Tokenize("INTERVAL=1;FREQ=DAILY");

            Assert.AreEqual(firstPart, secondPart);
        }
 private void EnsureSingleExistenceUntilCount(IRRuleTokenContainer tokenContainer)
 {
     if (tokenContainer.GetUntil() != null && tokenContainer.GetCount() != null)
     {
         throw new RRuleValidationException("RRule part 'UNTIL' and 'COUNT' are present at the same time");
     }
 }
 private void EnsureFreqExistence(IRRuleTokenContainer tokenContainer)
 {
     if (tokenContainer.GetFreq() == null)
     {
         throw new RRuleValidationException("Required rrule part 'FREQ' is not present");
     }
 }
示例#7
0
        public string BuildText(IRRuleTokenContainer tokenContainer)
        {
            var resultString = BuildFrequency(tokenContainer);


            var freqValue = (FreqToken.FreqValue)tokenContainer.GetFreq().GetValue();

            if (freqValue == FreqToken.FreqValue.WEEKLY)
            {
                resultString += " " + BuildWeeklyDays(tokenContainer);
            }
            else if (freqValue == FreqToken.FreqValue.MONTHLY && tokenContainer.GetByMontDay() != null)
            {
                resultString += " " + BuildMonthlyOnDay(tokenContainer);
            }
            else if (freqValue == FreqToken.FreqValue.MONTHLY && tokenContainer.GetBySetPos() != null &&
                     tokenContainer.GetByDay() != null)
            {
                resultString += " " + BuildMonthlyOnNumberedDay(tokenContainer);
            }
            else if (freqValue == FreqToken.FreqValue.YEARLY && tokenContainer.GetByMonth() != null &&
                     tokenContainer.GetByMontDay() != null)
            {
                resultString += " " + BuildYearlyOnDay(tokenContainer);
            }
            else if (freqValue == FreqToken.FreqValue.YEARLY && tokenContainer.GetByDay() != null &&
                     tokenContainer.GetBySetPos() != null &&
                     tokenContainer.GetByMonth() != null)
            {
                resultString += " " + BuildYearlyOnNumbered(tokenContainer);
            }
            if (tokenContainer.GetStart() != null)
            {
                var ending = _buildStartDate(tokenContainer);
                if (ending != null)
                {
                    resultString += ", " + ending;
                }
            }

            // Endings
            if (tokenContainer.GetUntil() != null)
            {
                var ending = _buildUntilDateEnding(tokenContainer);
                if (ending != null)
                {
                    resultString += ", " + ending;
                }
            }
            else if (tokenContainer.GetCount() != null)
            {
                var ending = BuildCountEnding(tokenContainer);
                if (ending != null)
                {
                    resultString += ", " + ending;
                }
            }

            return(CapitalizeFirstLetter(resultString.Trim()));
        }
        public void TestByDay()
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize("FREQ=DAILY;BYDAY=MO,TU,WE,SA");

            Assert.AreEqual(2, tokenContainer.RuleCount());
            Assert.NotNull(tokenContainer.GetByDay());
            Assert.AreEqual(4, ((ByDayToken.DayList)tokenContainer.GetByDay().GetValue()).GetDayList().Count);
        }
        public void TestBySetPos()
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize("FREQ=DAILY;BYSETPOS=10");

            Assert.AreEqual(2, tokenContainer.RuleCount());
            Assert.NotNull(tokenContainer.GetBySetPos());
            Assert.AreEqual(10, (int)tokenContainer.GetBySetPos().GetValue());
        }
        public void TestByMonth()
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize("FREQ=DAILY;BYMONTH=12");

            Assert.AreEqual(2, tokenContainer.RuleCount());
            Assert.NotNull(tokenContainer.GetByMonth());
            Assert.AreEqual(12, tokenContainer.GetByMonth().GetValue());
        }
        public void TestInterval()
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize("FREQ=DAILY;INTERVAL=1");

            Assert.AreEqual(2, tokenContainer.RuleCount());
            Assert.NotNull(tokenContainer.GetInterval());
            Assert.AreEqual(1, (int)tokenContainer.GetInterval().GetValue());
        }
        public void TestFreq()
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize("FREQ=DAILY");

            Assert.AreEqual(1, tokenContainer.RuleCount());
            Assert.NotNull(tokenContainer.GetFreq());
            Assert.AreEqual(FreqToken.FreqValue.DAILY, tokenContainer.GetFreq().GetValue());
        }
        public void testByMonthDay()
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize("FREQ=DAILY;BYMONTHDAY=2");

            Assert.AreEqual(2, tokenContainer.RuleCount());
            Assert.NotNull(tokenContainer.GetByMontDay());
            Assert.AreEqual(2, (int)tokenContainer.GetByMontDay().GetValue());
        }
        public void TestUntil()
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize("FREQ=DAILY;UNTIL=20181023T220000Z");

            Assert.AreEqual(2, tokenContainer.RuleCount());
            Assert.NotNull(tokenContainer.GetUntil());
            Assert.AreEqual(new DateTime(2018, 10, 23, 22, 0, 0),
                            ((ValueWrapper)tokenContainer.GetUntil().GetValue()).getLocalDateTime());
        }
示例#15
0
        /* ---- MONTHLY ---- */

        private string BuildMonthlyOnDay(IRRuleTokenContainer tokenContainer)
        {
            var byMonthDay = tokenContainer.GetByMontDay();

            if (byMonthDay == null)
            {
                return("");
            }

            return(_fragmentTranslator.GetTranslatedFragment(ETranslationFragment.ON)
                   + " " + _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.DAY) + " " + byMonthDay.GetValue());
        }
        public void TestMergeDoNotOverride()
        {
            IRRuleTokenContainer firstPart  = tokenizer.Tokenize("FREQ=WEEKLY;INTERVAL=1");
            IRRuleTokenContainer secondPart = tokenizer.Tokenize("FREQ=YEARLY;INTERVAL=1;BYMONTHDAY=1;BYSETPOS=1");

            // Merge secondPart into firstPart
            firstPart.Merge(secondPart);

            Assert.NotNull(firstPart.GetFreq());
            Assert.AreNotEqual(secondPart.GetFreq(), firstPart.GetFreq());
            Assert.AreNotEqual(secondPart.GetInterval(), firstPart.GetInterval());
        }
        public void TestComplex()
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize("FREQ=YEARLY;BYDAY=TU;BYSETPOS=1;BYMONTH=4;UNTIL=20181023T220000Z");

            Assert.AreEqual(5, tokenContainer.RuleCount());
            Assert.NotNull(tokenContainer.GetFreq());
            Assert.NotNull(tokenContainer.GetByDay());
            Assert.NotNull(tokenContainer.GetBySetPos());
            Assert.NotNull(tokenContainer.GetByMonth());
            Assert.NotNull(tokenContainer.GetUntil());
            Assert.AreEqual(FreqToken.FreqValue.YEARLY, tokenContainer.GetFreq().GetValue());
        }
示例#18
0
        private string _buildStartDate(IRRuleTokenContainer pTokenContainer)
        {
            var startToken = pTokenContainer.GetStart();

            if (startToken == null)
            {
                return(null);
            }
            string result = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.DTSTART);

            result += $" {_dateFormatting.FormatFullDate(((ValueWrapper)startToken.GetValue()).getLocalDateTime())}";
            return(result);
        }
        public void TestToStringMethod(
            [Values(
                 "FREQ=WEEKLY;BYDAY=MO,TU",
                 "FREQ=YEARLY;BYMONTHDAY=1",
                 "FREQ=YEARLY;BYSETPOS=1",
                 "FREQ=YEARLY;COUNT=1",
                 "FREQ=YEARLY;INTERVAL=1",
                 "FREQ=YEARLY;UNTIL=20181023T220000Z")]
            string input)
        {
            IRRuleTokenContainer container = tokenizer.Tokenize(input);

            Assert.AreEqual(input, container.ToString());
        }
示例#20
0
        /* ---- ENDINGS ---- */

        private string _buildUntilDateEnding(IRRuleTokenContainer pTokenContainer)
        {
            var untilToken = pTokenContainer.GetUntil();

            if (untilToken == null)
            {
                return(null);
            }

            string result = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.UNTIL);

            result += $" {_dateFormatting.FormatFullDate(((ValueWrapper)untilToken.GetValue()).getLocalDateTime())}";

            return(result);
        }
示例#21
0
        /* ---- WEEKLY ---- */

        private string BuildWeeklyDays(IRRuleTokenContainer tokenContainer)
        {
            var byDay = tokenContainer.GetByDay();

            if (byDay == null)
            {
                return("");
            }

            var result = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.ON) + " ";

            result += _dayListingFormatting.FormatDayListing(((ByDayToken.DayList)byDay.GetValue()).GetDayList().ToList());

            return(result);
        }
示例#22
0
        private string BuildCountEnding(IRRuleTokenContainer pTokenContainer)
        {
            var countToken = pTokenContainer.GetCount();

            if (countToken == null)
            {
                return(null);
            }

            if (((int)countToken.GetValue()) == 1)
            {
                return(null);
            }

            return($"{countToken.GetValue()} {_fragmentTranslator.GetTranslatedFragment(ETranslationFragment.TIMES)}");
        }
示例#23
0
        /* ---- YEARLY ---- */
        private string BuildYearlyOnDay(IRRuleTokenContainer tokenContainer)
        {
            var byMonthToken    = tokenContainer.GetByMonth();
            var byMonthDayToken = tokenContainer.GetByMontDay();

            if (byMonthDayToken == null || byMonthToken == null)
            {
                return("");
            }

            var result = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.ON);

            result += " " + _dateFormatting.FormatMonthDay(new DateTime(DateTime.Now.Year, (int)byMonthToken.GetValue(), (int)byMonthDayToken.GetValue()));

            return(result);
        }
        public void TestMergeSimple()
        {
            IRRuleTokenContainer firstPart  = tokenizer.Tokenize("FREQ=WEEKLY;INTERVAL=1");
            IRRuleTokenContainer secondPart = tokenizer.Tokenize("FREQ=YEARLY;INTERVAL=1;BYMONTHDAY=1;BYSETPOS=1");

            // Merge secondPart into firstPart
            firstPart.Merge(secondPart);

            Assert.NotNull(firstPart.GetFreq());
            Assert.NotNull(firstPart.GetByMontDay());
            Assert.NotNull(firstPart.GetBySetPos());
            Assert.NotNull(firstPart.GetByMontDay());

            Assert.AreEqual(secondPart.GetByMontDay(), firstPart.GetByMontDay());
            Assert.AreEqual(secondPart.GetBySetPos(), firstPart.GetBySetPos());
        }
示例#25
0
        private string BuildMonthlyOnNumberedDay(IRRuleTokenContainer tokenContainer)
        {
            var byDayToken    = tokenContainer.GetByDay();
            var bySetPosToken = tokenContainer.GetBySetPos();

            if (byDayToken == null || bySetPosToken == null)
            {
                return("");
            }

            var result = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.ON);

            result += " " + TranslateSetPosNumber((int)bySetPosToken.GetValue());
            result += " " + _dateFormatting.FormatDay(((ByDayToken.DayList)byDayToken.GetValue()).GetDayList()[0]);

            return(result);
        }
示例#26
0
        public void Merge(IRRuleTokenContainer tokenContainer)
        {
            if (tokenContainer.GetFreq() != null && GetFreq() == null)
            {
                AddOrUpdateToken(tokenContainer.GetFreq());
            }

            if (tokenContainer.GetUntil() != null && GetUntil() == null)
            {
                AddOrUpdateToken(tokenContainer.GetUntil());
            }

            if (tokenContainer.GetCount() != null && GetCount() == null)
            {
                AddOrUpdateToken(tokenContainer.GetCount());
            }

            if (tokenContainer.GetInterval() != null && GetInterval() == null)
            {
                AddOrUpdateToken(tokenContainer.GetInterval());
            }

            if (tokenContainer.GetByDay() != null && GetByDay() == null)
            {
                AddOrUpdateToken(tokenContainer.GetByDay());
            }

            if (tokenContainer.GetByMontDay() != null && GetByMontDay() == null)
            {
                AddOrUpdateToken(tokenContainer.GetByMontDay());
            }

            if (tokenContainer.GetByMonth() != null && GetByMonth() == null)
            {
                AddOrUpdateToken(tokenContainer.GetByMonth());
            }

            if (tokenContainer.GetBySetPos() != null && GetBySetPos() == null)
            {
                AddOrUpdateToken(tokenContainer.GetBySetPos());
            }
        }
示例#27
0
 private string BuildText(IRRuleTokenContainer tokenContainer)
 {
     return(_textBuilder.BuildText(tokenContainer));
 }
        public void TestCases(
            [Values(
                 "FREQ=DAILY;INTERVAL=5",
                 "FREQ=WEEKLY;INTERVAL=5",
                 "FREQ=MONTHLY;INTERVAL=5",
                 "FREQ=YEARLY;INTERVAL=5",
                 "FREQ=DAILY;INTERVAL=1",
                 "FREQ=WEEKLY;INTERVAL=1",
                 "FREQ=MONTHLY;INTERVAL=1",
                 "FREQ=YEARLY;INTERVAL=1",
                 "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU",
                 "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,TU",
                 "FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,TU,WE,SA",
                 "FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=5",
                 "FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=15",
                 "FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=15",
                 "FREQ=MONTHLY;INTERVAL=2;BYDAY=MO;BYSETPOS=-1",
                 "FREQ=MONTHLY;INTERVAL=2;BYDAY=MO;BYSETPOS=1",
                 "FREQ=MONTHLY;INTERVAL=2;BYDAY=SA;BYSETPOS=3",
                 "FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=1",
                 "FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=5",
                 "FREQ=YEARLY;BYDAY=SU;BYSETPOS=1;BYMONTH=1",
                 "FREQ=YEARLY;BYDAY=WE;BYSETPOS=-1;BYMONTH=4",
                 "FREQ=DAILY;INTERVAL=1;COUNT=2",
                 "FREQ=WEEKLY;INTERVAL=1;COUNT=1",
                 "FREQ=MONTHLY;INTERVAL=1;UNTIL=20181023T220000Z"

                 )]
            string rrule,

            [Values(
                 "Every 5 days",
                 "Every 5 weeks",
                 "Every 5 months",
                 "Every 5 years",
                 "Daily",
                 "Weekly",
                 "Monthly",
                 "Annually",
                 "Weekly on Monday, Tuesday",
                 "Every 2 weeks on Monday, Tuesday",
                 "Every 2 weeks on Mon, Tue, Wed, Sat",
                 "Monthly on day 5",
                 "Monthly on day 15",
                 "Every 2 months on day 15",
                 "Every 2 months on last Monday",
                 "Every 2 months on first Monday",
                 "Every 2 months on third Saturday",
                 "Annually on January 1",
                 "Annually on April 5",
                 "Annually on first Sunday of January",
                 "Annually on last Wednesday of April",
                 "Daily, 2 times",
                 "Weekly",
                 "Monthly, until Tuesday, October 23, 2018"

                 )]
            string expectedResult)
        {
            IRRuleTokenContainer tokenContainer = tokenizer.Tokenize(rrule);

            Assert.AreEqual(expectedResult, textBuilder.BuildText(tokenContainer));
        }
 public void ValidateRRuleParts(IRRuleTokenContainer tokenContainer)
 {
     EnsureFreqExistence(tokenContainer);
     EnsureSingleExistenceUntilCount(tokenContainer);
 }
示例#30
0
        /* ---- FREQUENCY ---- */

        private string  BuildFrequency(IRRuleTokenContainer tokenContainer)
        {
            var freqValue = (FreqToken.FreqValue)tokenContainer.GetFreq().GetValue();

            int interval = 1;

            if (tokenContainer.GetInterval() != null)
            {
                interval = (int)tokenContainer.GetInterval().GetValue();
            }

            string value = null;

            if (interval == 1)
            {
                switch (freqValue)
                {
                case FreqToken.FreqValue.DAILY:
                    value = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.DAILY);
                    break;

                case FreqToken.FreqValue.WEEKLY:
                    value = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.WEEKLY);
                    break;

                case FreqToken.FreqValue.MONTHLY:
                    value = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.MONTHLY);
                    break;

                case FreqToken.FreqValue.YEARLY:
                    value = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.YEARLY);
                    break;
                }
            }
            else
            {
                value = _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.EVERY) + " " + interval + " ";
                switch (freqValue)
                {
                case FreqToken.FreqValue.DAILY:
                    value += _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.DAYS);
                    break;

                case FreqToken.FreqValue.WEEKLY:
                    value += _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.WEEKS);
                    break;

                case FreqToken.FreqValue.MONTHLY:
                    value += _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.MONTHS);
                    break;

                case FreqToken.FreqValue.YEARLY:
                    value += _fragmentTranslator.GetTranslatedFragment(ETranslationFragment.YEARS);
                    break;
                }
            }

            if (value == null)
            {
                return("");
            }

            return(value);
        }