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