summaryrefslogtreecommitdiffstats
path: root/comm/calendar/test/unit/test_recurrence_utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/calendar/test/unit/test_recurrence_utils.js')
-rw-r--r--comm/calendar/test/unit/test_recurrence_utils.js371
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 + "')"
+ );
+ }
+ }
+});