1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.calendarcommon2;
18
19import com.android.calendarcommon2.ICalendar;
20import com.android.calendarcommon2.RecurrenceSet;
21
22import android.content.ContentValues;
23import android.test.suitebuilder.annotation.SmallTest;
24import android.util.Log;
25import android.provider.CalendarContract;
26import junit.framework.TestCase;
27
28/**
29 * Test some pim.RecurrenceSet functionality.
30 */
31public class RecurrenceSetTest extends TestCase {
32
33    // Test a recurrence
34    @SmallTest
35    public void testRecurrenceSet0() throws Exception {
36        String recurrence = "DTSTART;TZID=America/New_York:20080221T070000\n"
37                + "DTEND;TZID=America/New_York:20080221T190000\n"
38                + "RRULE:FREQ=DAILY;UNTIL=20080222T000000Z\n"
39                + "EXDATE:20080222T120000Z";
40        verifyPopulateContentValues(recurrence, "FREQ=DAILY;UNTIL=20080222T000000Z", null,
41                null, "20080222T120000Z", 1203595200000L, "America/New_York", "P43200S", 0, false);
42    }
43
44    // Test 1 day all-day event
45    @SmallTest
46    public void testRecurrenceSet1() throws Exception {
47        String recurrence = "DTSTART;VALUE=DATE:20090821\nDTEND;VALUE=DATE:20090822\n"
48                + "RRULE:FREQ=YEARLY;WKST=SU";
49        verifyPopulateContentValues(recurrence, "FREQ=YEARLY;WKST=SU", null,
50                null, null, 1250812800000L, "UTC", "P1D", 1, false);
51    }
52
53    // Test 2 day all-day event
54    @SmallTest
55    public void testRecurrenceSet2() throws Exception {
56        String recurrence = "DTSTART;VALUE=DATE:20090821\nDTEND;VALUE=DATE:20090823\n"
57                + "RRULE:FREQ=YEARLY;WKST=SU";
58        verifyPopulateContentValues(recurrence, "FREQ=YEARLY;WKST=SU", null,
59                null, null, 1250812800000L, "UTC",  "P2D", 1, false);
60    }
61
62    // Test multi-rule RRULE.
63    @SmallTest
64    public void testRecurrenceSet3() throws Exception {
65        String recurrence = "DTSTART;VALUE=DATE:20090821\n"
66                + "RRULE:FREQ=YEARLY;WKST=SU\n"
67                + "RRULE:FREQ=MONTHLY;COUNT=3\n"
68                + "DURATION:P2H";
69        verifyPopulateContentValues(recurrence, "FREQ=YEARLY;WKST=SU\nFREQ=MONTHLY;COUNT=3", null,
70                null, null, 1250812800000L, "UTC", "P2H", 1 /*allDay*/, false);
71        // allDay=1 just means the start time is 00:00:00 UTC.
72    }
73
74    // Test RDATE with VALUE=DATE.
75    @SmallTest
76    public void testRecurrenceSet4() throws Exception {
77        String recurrence = "DTSTART;TZID=America/Los_Angeles:20090821T010203\n"
78                + "RDATE;TZID=America/Los_Angeles;VALUE=DATE:20110601,20110602,20110603\n"
79                + "DURATION:P2H";
80        verifyPopulateContentValues(recurrence, null,
81                //"TZID=America/Los_Angeles;VALUE=DATE:20110601,20110602,20110603",
82                "America/Los_Angeles;20110601,20110602,20110603", // incorrect
83                null, null, 1250841723000L, "America/Los_Angeles", "P2H", 0 /*allDay*/, false);
84        // allDay=1 just means the start time is 00:00:00 UTC.
85    }
86
87    // Check generation of duration from events in different time zones.
88    @SmallTest
89    public void testRecurrenceSet5() throws Exception {
90        String recurrence = "DTSTART;TZID=America/Los_Angeles:20090821T070000\n"
91                + "DTEND;TZID=America/New_York:20090821T110000\n"
92                + "RRULE:FREQ=YEARLY\n";
93        verifyPopulateContentValues(recurrence, "FREQ=YEARLY", null,
94                null, null, 1250863200000L, "America/Los_Angeles", "P3600S" /*P1H*/, 0 /*allDay*/,
95                false);
96        // TODO: would like to use P1H for duration
97
98        String recurrence2 = "DTSTART;TZID=America/New_York:20090821T100000\n"
99            + "DTEND;TZID=America/Los_Angeles:20090821T080000\n"
100            + "RRULE:FREQ=YEARLY\n";
101        verifyPopulateContentValues(recurrence, "FREQ=YEARLY", null,
102                null, null, 1250863200000L, "America/Los_Angeles", "P3600S" /*P1H*/, 0 /*allDay*/,
103                false);
104        // TODO: should we rigorously define which tzid becomes the "event timezone"?
105    }
106
107    // Test a failure to parse the recurrence data
108    @SmallTest
109    public void testRecurrenceSetBadDstart() throws Exception {
110        String recurrence = "DTSTART;TZID=GMT+05:30:20080221T070000\n"
111                + "DTEND;TZID=GMT+05:30:20080221T190000\n"
112                + "RRULE:FREQ=DAILY;UNTIL=20080222T000000Z\n"
113                + "EXDATE:20080222T120000Z";
114        verifyPopulateContentValues(recurrence, "FREQ=DAILY;UNTIL=20080222T000000Z", null,
115                null, "20080222T120000Z", 1203595200000L, "America/New_York", "P43200S", 0, true);
116    }
117
118    @SmallTest
119    public void testRecurrenceSetBadRrule() throws Exception {
120        String recurrence = "DTSTART;TZID=America/New_York:20080221T070000\n"
121                + "DTEND;TZID=GMT+05:30:20080221T190000\n"
122                + "RRULE:FREQ=NEVER;UNTIL=20080222T000000Z\n"
123                + "EXDATE:20080222T120000Z";
124        verifyPopulateContentValues(recurrence, "FREQ=DAILY;UNTIL=20080222T000000Z", null,
125                null, "20080222T120000Z", 1203595200000L, "America/New_York", "P43200S", 0, true);
126    }
127
128    // run populateContentValues and verify the results
129    private void verifyPopulateContentValues(String recurrence, String rrule, String rdate,
130            String exrule, String exdate, long dtstart, String tzid, String duration, int allDay,
131            boolean badFormat)
132            throws ICalendar.FormatException {
133        ICalendar.Component recurrenceComponent =
134                new ICalendar.Component("DUMMY", null /* parent */);
135        ICalendar.parseComponent(recurrenceComponent, recurrence);
136        ContentValues values = new ContentValues();
137        boolean result = RecurrenceSet.populateContentValues(recurrenceComponent, values);
138        Log.d("KS", "values " + values);
139
140        if (badFormat) {
141            assertEquals(result, !badFormat);
142            return;
143        }
144        assertEquals(rrule, values.get(android.provider.CalendarContract.Events.RRULE));
145        assertEquals(rdate, values.get(android.provider.CalendarContract.Events.RDATE));
146        assertEquals(exrule, values.get(android.provider.CalendarContract.Events.EXRULE));
147        assertEquals(exdate, values.get(android.provider.CalendarContract.Events.EXDATE));
148        assertEquals(dtstart, (long) values.getAsLong(CalendarContract.Events.DTSTART));
149        assertEquals(tzid, values.get(android.provider.CalendarContract.Events.EVENT_TIMEZONE));
150        assertEquals(duration, values.get(android.provider.CalendarContract.Events.DURATION));
151        assertEquals(allDay,
152                (int) values.getAsInteger(android.provider.CalendarContract.Events.ALL_DAY));
153    }
154
155}
156