diff options
Diffstat (limited to 'comm/calendar/test/unit/test_recurrence_utils.js')
-rw-r--r-- | comm/calendar/test/unit/test_recurrence_utils.js | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/comm/calendar/test/unit/test_recurrence_utils.js b/comm/calendar/test/unit/test_recurrence_utils.js new file mode 100644 index 0000000000..53f1aaf99f --- /dev/null +++ b/comm/calendar/test/unit/test_recurrence_utils.js @@ -0,0 +1,371 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { countOccurrences } = ChromeUtils.import( + "resource:///modules/calendar/calRecurrenceUtils.jsm" +); + +function run_test() { + do_calendar_startup(run_next_test); +} + +// tests for calRecurrenceUtils.jsm +/* Incomplete - still missing test coverage for: + * recurrenceRule2String + * splitRecurrenceRules + * checkRecurrenceRule + */ + +function getIcs(aProperties) { + let calendar = [ + "BEGIN:VCALENDAR", + "PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN", + "VERSION:2.0", + "BEGIN:VTIMEZONE", + "TZID:Europe/Berlin", + "BEGIN:DAYLIGHT", + "TZOFFSETFROM:+0100", + "TZOFFSETTO:+0200", + "TZNAME:CEST", + "DTSTART:19700329T020000", + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3", + "END:DAYLIGHT", + "BEGIN:STANDARD", + "TZOFFSETFROM:+0200", + "TZOFFSETTO:+0100", + "TZNAME:CET", + "DTSTART:19701025T030000", + "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10", + "END:STANDARD", + "END:VTIMEZONE", + ]; + calendar = calendar.concat(aProperties); + calendar = calendar.concat(["END:VCALENDAR"]); + + return calendar.join("\r\n"); +} + +add_task(async function countOccurrences_test() { + let data = [ + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98000", + "SUMMARY:Occurring 3 times until a date", + "RRULE:FREQ=DAILY;UNTIL=20180922T100000Z", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 3, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98001", + "SUMMARY:Occurring 3 times until a date with one exception in the middle", + "RRULE:FREQ=DAILY;UNTIL=20180922T100000Z", + "EXDATE;TZID=Europe/Berlin:20180921T120000", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 2, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98002", + "SUMMARY:Occurring 3 times until a date with one exception at the end", + "RRULE:FREQ=DAILY;UNTIL=20180922T100000Z", + "EXDATE;TZID=Europe/Berlin:20180922T120000", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 2, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98003", + "SUMMARY:Occurring 3 times until a date with one exception at the beginning", + "RRULE:FREQ=DAILY;UNTIL=20180922T100000Z", + "EXDATE;TZID=Europe/Berlin:20180920T120000", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 2, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98004", + "SUMMARY:Occurring 3 times until a date with the middle occurrence moved after the end", + "RRULE:FREQ=DAILY;UNTIL=20180922T100000Z", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98004", + "SUMMARY:The moved occurrence", + "RECURRENCE-ID:20180921T100000Z", + "DTSTART;TZID=Europe/Berlin:20180924T120000", + "DTEND;TZID=Europe/Berlin:20180924T130000", + "END:VEVENT", + ], + expected: 3, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98005", + "SUMMARY:Occurring 3 times until a date with the middle occurrence moved before the beginning", + "RRULE:FREQ=DAILY;UNTIL=20180922T100000Z", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98005", + "SUMMARY:The moved occurrence", + "RECURRENCE-ID:20180921T100000Z", + "DTSTART;TZID=Europe/Berlin:20180918T120000", + "DTEND;TZID=Europe/Berlin:20180918T130000", + "END:VEVENT", + ], + expected: 3, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98006", + "SUMMARY:Occurring 1 times until a date", + "RRULE:FREQ=DAILY;UNTIL=20180920T100000Z", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 1, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98007", + "SUMMARY:Occurring 1 times until a date with occernce removed", + "RRULE:FREQ=DAILY;UNTIL=20180920T100000Z", + "EXDATE;TZID=Europe/Berlin:20180920T120000", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 0, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98008", + "SUMMARY:Occurring for 3 times", + "RRULE:FREQ=DAILY;COUNT=3", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 3, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98009", + "SUMMARY:Occurring for 3 times with an exception in the middle", + "EXDATE;TZID=Europe/Berlin:20180921T120000", + "RRULE:FREQ=DAILY;COUNT=3", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 2, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98010", + "SUMMARY:Occurring for 3 times with an exception at the end", + "EXDATE;TZID=Europe/Berlin:20180922T120000", + "RRULE:FREQ=DAILY;COUNT=3", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 2, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98011", + "SUMMARY:Occurring for 3 times with an exception at the beginning", + "EXDATE;TZID=Europe/Berlin:20180920T120000", + "RRULE:FREQ=DAILY;COUNT=3", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 2, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98012", + "SUMMARY:Occurring for 1 time", + "RRULE:FREQ=DAILY;COUNT=1", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 1, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98013", + "SUMMARY:Occurring for 0 times", + "RRULE:FREQ=DAILY;COUNT=1", + "EXDATE;TZID=Europe/Berlin:20180920T120000", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 0, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98014", + "SUMMARY:Occurring infinitely", + "RRULE:FREQ=DAILY", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: null, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98015", + "SUMMARY:Non-occurring item", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: null, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98016", + "SUMMARY:Occurring for 3 time and 1 rdate", + "RRULE:FREQ=DAILY;COUNT=3", + "RDATE;TZID=Europe/Berlin:20180923T100000", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 4, + }, + { + input: [ + "BEGIN:VEVENT", + "CREATED:20180912T090539Z", + "LAST-MODIFIED:20180912T090539Z", + "DTSTAMP:20180912T090539Z", + "UID:5b47fa17-f2fe-4d96-8cc2-19ce5be98017", + "SUMMARY:Occurring for 3 rdates", + "RDATE;TZID=Europe/Berlin:20180920T120000", + "RDATE;TZID=Europe/Berlin:20180921T100000", + "RDATE;TZID=Europe/Berlin:20180922T140000", + "DTSTART;TZID=Europe/Berlin:20180920T120000", + "DTEND;TZID=Europe/Berlin:20180920T130000", + "END:VEVENT", + ], + expected: 3, + }, + ]; + + let i = 0; + for (let test of data) { + i++; + + let ics = getIcs(test.input); + let parser = Cc["@mozilla.org/calendar/ics-parser;1"].createInstance(Ci.calIIcsParser); + parser.parseString(ics); + let items = parser.getItems(); + + ok(items.length > 0, "parsing input succeeded (test #" + i + ")"); + for (let item of items) { + equal( + countOccurrences(item), + test.expected, + "expected number of occurrences (test #" + i + " - '" + item.title + "')" + ); + } + } +}); |