diff options
3 files changed, 54 insertions, 24 deletions
diff --git a/src/com/android/calendarcommon/EventRecurrence.java b/src/com/android/calendarcommon/EventRecurrence.java index 57a8c20..b179071 100644 --- a/src/com/android/calendarcommon/EventRecurrence.java +++ b/src/com/android/calendarcommon/EventRecurrence.java @@ -581,6 +581,10 @@ public class EventRecurrence { * - allows (but ignores) X-* parts * - improved validation on various values (e.g. UNTIL timestamps) * - error messages are more specific + * + * TODO: enforce additional constraints listed in RFC 5545, notably the "N/A" entries + * in section 3.3.10. For example, if FREQ=WEEKLY, we should reject a rule that + * includes a BYMONTHDAY part. */ /* TODO: replace with "if (freq != 0) throw" if nothing requires this */ diff --git a/src/com/android/calendarcommon/RecurrenceProcessor.java b/src/com/android/calendarcommon/RecurrenceProcessor.java index 577ac49..82b699b 100644 --- a/src/com/android/calendarcommon/RecurrenceProcessor.java +++ b/src/com/android/calendarcommon/RecurrenceProcessor.java @@ -904,8 +904,26 @@ bysetpos: // to be before dtstart or after the end, because that will be // filtered in the inner loop if (freq == EventRecurrence.WEEKLY) { - int dow = iterator.weekDay; - dayIndex = iterator.monthDay - dow; + /* + * iterator.weekDay indicates the day of the week (0-6, SU-SA). + * Because dayIndex might start in the middle of a week, and we're + * interested in treating a week as a unit, we want to move + * backward to the start of the week. (This could make the + * dayIndex negative, which will be corrected by normalization + * later on.) + * + * The day that starts the week is determined by WKST, which + * defaults to MO. + * + * Example: dayIndex is Tuesday the 8th, and weeks start on + * Thursdays. Tuesday is day 2, Thursday is day 4, so we + * want to move back (2 - 4 + 7) % 7 = 5 days to the previous + * Thursday. If weeks started on Mondays, we would only + * need to move back (2 - 1 + 7) % 7 = 1 day. + */ + int weekStartAdj = (iterator.weekDay - + EventRecurrence.day2TimeDay(r.wkst) + 7) % 7; + dayIndex = iterator.monthDay - weekStartAdj; lastDayToExamine = dayIndex + 6; } else { lastDayToExamine = generated diff --git a/tests/src/com/android/calendarcommon/RecurrenceProcessorTest.java b/tests/src/com/android/calendarcommon/RecurrenceProcessorTest.java index 21d2d52..ba5ec0c 100644 --- a/tests/src/com/android/calendarcommon/RecurrenceProcessorTest.java +++ b/tests/src/com/android/calendarcommon/RecurrenceProcessorTest.java @@ -547,18 +547,10 @@ public class RecurrenceProcessorTest extends TestCase { }); } - /** - * This test fails because of a bug in RecurrenceProcessor.expand(). We - * don't have time to fix the bug yet but we don't want to lose track of - * this test either. The "failing" prefix on the method name prevents this - * test from being run. Remove the "failing" prefix when the bug is fixed. - * - * @throws Exception - */ @SmallTest - public void failingTestWeekly9() throws Exception { + public void testWeekly9() throws Exception { verifyRecurrence("19970805T100000", - "FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO", + "FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU", // uses default WKST=MO null /* rdate */, null /* exrule */, null /* exdate */, "19970101T000000", "19980101T000000", new String[]{ @@ -611,6 +603,34 @@ public class RecurrenceProcessorTest extends TestCase { } } + /** + * Test repeating weekly event with dtstart and dtend (only one occurrence) + * See bug #3267616 + * @throws Exception + */ + @SmallTest + public void testWeekly13() throws Exception { + verifyRecurrence("20101117T150000", + "FREQ=WEEKLY;BYDAY=WE", + null /* rdate */, null /* exrule */, null /* exdate */, + "20101117T150000", "20101117T160000", + new String[]{ "20101117T150000" }); + } + + @SmallTest + public void testWeekly14() throws Exception { + verifyRecurrence("19970805T100000", + "FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=TH", + null /* rdate */, null /* exrule */, null /* exdate */, + "19970101T000000", "19980101T000000", + new String[]{ + "19970805T100000", + "19970817T100000", + "19970819T100000", + "19970831T100000", + }); + } + @SmallTest public void testDaily0() throws Exception { verifyRecurrence("20060215T100000", "FREQ=DAILY;COUNT=3", @@ -2397,18 +2417,6 @@ public class RecurrenceProcessorTest extends TestCase { null /* last */); } - /** - * Test repeating weekly event with dtstart and dtend (only one occurrence) - * See bug #3267616 - * @throws Exception - */ - public void testWeekly13() throws Exception { - verifyRecurrence("20101117T150000", - "FREQ=WEEKLY;BYDAY=WE", - null /* rdate */, null /* exrule */, null /* exdate */, - "20101117T150000", "20101117T160000", - new String[]{ "20101117T150000" }); - } // These recurrence rules are used in the loop that measures the performance // of recurrence expansion. |