10d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden/*
20d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * Copyright (C) 2009 The Android Open Source Project
30d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *
40d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
50d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * you may not use this file except in compliance with the License.
60d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * You may obtain a copy of the License at
70d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *
80d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
90d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden *
100d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * Unless required by applicable law or agreed to in writing, software
110d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
120d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * See the License for the specific language governing permissions and
140d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * limitations under the License.
150d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden */
160d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
1706b3293d5af3454a39681cfd659271551354b8a0Michael Chanpackage com.android.calendarcommon2;
180d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
1906b3293d5af3454a39681cfd659271551354b8a0Michael Chanimport com.android.calendarcommon2.ICalendar;
2006b3293d5af3454a39681cfd659271551354b8a0Michael Chanimport com.android.calendarcommon2.RecurrenceSet;
210d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
220d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport android.content.ContentValues;
230d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport android.test.suitebuilder.annotation.SmallTest;
240d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport android.util.Log;
250d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport android.provider.CalendarContract;
260d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenimport junit.framework.TestCase;
270d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden/**
290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden * Test some pim.RecurrenceSet functionality.
300d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden */
310d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFaddenpublic class RecurrenceSetTest extends TestCase {
320d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // Test a recurrence
340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void testRecurrenceSet0() throws Exception {
360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        String recurrence = "DTSTART;TZID=America/New_York:20080221T070000\n"
370d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + "DTEND;TZID=America/New_York:20080221T190000\n"
380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + "RRULE:FREQ=DAILY;UNTIL=20080222T000000Z\n"
390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + "EXDATE:20080222T120000Z";
400d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyPopulateContentValues(recurrence, "FREQ=DAILY;UNTIL=20080222T000000Z", null,
41bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, "20080222T120000Z", 1203595200000L, "America/New_York", "P43200S", 0, false);
420d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
430d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
440d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // Test 1 day all-day event
450d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
460d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void testRecurrenceSet1() throws Exception {
470d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        String recurrence = "DTSTART;VALUE=DATE:20090821\nDTEND;VALUE=DATE:20090822\n"
480d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + "RRULE:FREQ=YEARLY;WKST=SU";
490d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyPopulateContentValues(recurrence, "FREQ=YEARLY;WKST=SU", null,
50bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, null, 1250812800000L, "UTC", "P1D", 1, false);
510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // Test 2 day all-day event
540d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    @SmallTest
550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    public void testRecurrenceSet2() throws Exception {
560d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        String recurrence = "DTSTART;VALUE=DATE:20090821\nDTEND;VALUE=DATE:20090823\n"
570d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                + "RRULE:FREQ=YEARLY;WKST=SU";
580d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        verifyPopulateContentValues(recurrence, "FREQ=YEARLY;WKST=SU", null,
59bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, null, 1250812800000L, "UTC",  "P2D", 1, false);
600d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
610d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
62e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    // Test multi-rule RRULE.
63e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    @SmallTest
64e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    public void testRecurrenceSet3() throws Exception {
65e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        String recurrence = "DTSTART;VALUE=DATE:20090821\n"
66e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                + "RRULE:FREQ=YEARLY;WKST=SU\n"
67e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                + "RRULE:FREQ=MONTHLY;COUNT=3\n"
68e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                + "DURATION:P2H";
69e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        verifyPopulateContentValues(recurrence, "FREQ=YEARLY;WKST=SU\nFREQ=MONTHLY;COUNT=3", null,
70bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, null, 1250812800000L, "UTC", "P2H", 1 /*allDay*/, false);
71e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        // allDay=1 just means the start time is 00:00:00 UTC.
72e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    }
73e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden
74e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    // Test RDATE with VALUE=DATE.
75e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    @SmallTest
76e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    public void testRecurrenceSet4() throws Exception {
77e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        String recurrence = "DTSTART;TZID=America/Los_Angeles:20090821T010203\n"
78e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                + "RDATE;TZID=America/Los_Angeles;VALUE=DATE:20110601,20110602,20110603\n"
79e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                + "DURATION:P2H";
80e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        verifyPopulateContentValues(recurrence, null,
81e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                //"TZID=America/Los_Angeles;VALUE=DATE:20110601,20110602,20110603",
82e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                "America/Los_Angeles;20110601,20110602,20110603", // incorrect
83bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, null, 1250841723000L, "America/Los_Angeles", "P2H", 0 /*allDay*/, false);
84e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        // allDay=1 just means the start time is 00:00:00 UTC.
85e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    }
86e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden
87e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    // Check generation of duration from events in different time zones.
88e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    @SmallTest
89e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    public void testRecurrenceSet5() throws Exception {
90e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        String recurrence = "DTSTART;TZID=America/Los_Angeles:20090821T070000\n"
91e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                + "DTEND;TZID=America/New_York:20090821T110000\n"
92e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden                + "RRULE:FREQ=YEARLY\n";
93e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        verifyPopulateContentValues(recurrence, "FREQ=YEARLY", null,
94bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, null, 1250863200000L, "America/Los_Angeles", "P3600S" /*P1H*/, 0 /*allDay*/,
95bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                false);
96e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        // TODO: would like to use P1H for duration
97e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden
98e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        String recurrence2 = "DTSTART;TZID=America/New_York:20090821T100000\n"
99e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden            + "DTEND;TZID=America/Los_Angeles:20090821T080000\n"
100e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden            + "RRULE:FREQ=YEARLY\n";
101e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        verifyPopulateContentValues(recurrence, "FREQ=YEARLY", null,
102bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, null, 1250863200000L, "America/Los_Angeles", "P3600S" /*P1H*/, 0 /*allDay*/,
103bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                false);
104e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden        // TODO: should we rigorously define which tzid becomes the "event timezone"?
105e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden    }
106e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden
107bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson    // Test a failure to parse the recurrence data
108bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson    @SmallTest
109bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson    public void testRecurrenceSetBadDstart() throws Exception {
110bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson        String recurrence = "DTSTART;TZID=GMT+05:30:20080221T070000\n"
111bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                + "DTEND;TZID=GMT+05:30:20080221T190000\n"
112bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                + "RRULE:FREQ=DAILY;UNTIL=20080222T000000Z\n"
113bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                + "EXDATE:20080222T120000Z";
114bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson        verifyPopulateContentValues(recurrence, "FREQ=DAILY;UNTIL=20080222T000000Z", null,
115bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, "20080222T120000Z", 1203595200000L, "America/New_York", "P43200S", 0, true);
116bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson    }
117bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson
118bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson    @SmallTest
119bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson    public void testRecurrenceSetBadRrule() throws Exception {
120bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson        String recurrence = "DTSTART;TZID=America/New_York:20080221T070000\n"
121bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                + "DTEND;TZID=GMT+05:30:20080221T190000\n"
122bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                + "RRULE:FREQ=NEVER;UNTIL=20080222T000000Z\n"
123bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                + "EXDATE:20080222T120000Z";
124bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson        verifyPopulateContentValues(recurrence, "FREQ=DAILY;UNTIL=20080222T000000Z", null,
125bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson                null, "20080222T120000Z", 1203595200000L, "America/New_York", "P43200S", 0, true);
126bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson    }
127e29edf9b71fbec8a7c7f0b523ca105a377632989Andy McFadden
1280d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    // run populateContentValues and verify the results
1290d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    private void verifyPopulateContentValues(String recurrence, String rrule, String rdate,
130bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson            String exrule, String exdate, long dtstart, String tzid, String duration, int allDay,
131bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson            boolean badFormat)
1320d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden            throws ICalendar.FormatException {
1330d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        ICalendar.Component recurrenceComponent =
1340d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                new ICalendar.Component("DUMMY", null /* parent */);
1350d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        ICalendar.parseComponent(recurrenceComponent, recurrence);
1360d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        ContentValues values = new ContentValues();
137bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson        boolean result = RecurrenceSet.populateContentValues(recurrenceComponent, values);
1380d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        Log.d("KS", "values " + values);
1390d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden
140bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson        if (badFormat) {
141bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson            assertEquals(result, !badFormat);
142bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson            return;
143bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson        }
1440d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        assertEquals(rrule, values.get(android.provider.CalendarContract.Events.RRULE));
1450d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        assertEquals(rdate, values.get(android.provider.CalendarContract.Events.RDATE));
1460d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        assertEquals(exrule, values.get(android.provider.CalendarContract.Events.EXRULE));
1470d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        assertEquals(exdate, values.get(android.provider.CalendarContract.Events.EXDATE));
1480d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        assertEquals(dtstart, (long) values.getAsLong(CalendarContract.Events.DTSTART));
1490d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        assertEquals(tzid, values.get(android.provider.CalendarContract.Events.EVENT_TIMEZONE));
1500d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        assertEquals(duration, values.get(android.provider.CalendarContract.Events.DURATION));
1510d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden        assertEquals(allDay,
1520d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden                (int) values.getAsInteger(android.provider.CalendarContract.Events.ALL_DAY));
1530d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden    }
154bbcfb96060e9b518b810015984081a25c8ae2c26Isaac Katzenelson
1550d3524562e330e74f150a17c4dc4dd66a0faae46Andy McFadden}
156