1852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio/* 2852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * Copyright (C) 2010 The Android Open Source Project 3852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * 4852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License"); 5852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * you may not use this file except in compliance with the License. 6852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * You may obtain a copy of the License at 7852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * 8852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * http://www.apache.org/licenses/LICENSE-2.0 9852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * 10852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * Unless required by applicable law or agreed to in writing, software 11852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS, 12852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * See the License for the specific language governing permissions and 14852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio * limitations under the License. 15852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio */ 16852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 17852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Megliopackage com.android.providers.calendar; 18852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 1993e0bbb921cce7a5cec355521bc570c03c9d6a1cAndy McFaddenimport com.android.calendarcommon.ICalendar; 2093e0bbb921cce7a5cec355521bc570c03c9d6a1cAndy McFaddenimport com.android.calendarcommon.RecurrenceSet; 2193e0bbb921cce7a5cec355521bc570c03c9d6a1cAndy McFadden 22852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglioimport android.content.ContentValues; 23b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErikimport android.provider.CalendarContract; 24852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglioimport android.test.suitebuilder.annotation.SmallTest; 25852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglioimport junit.framework.TestCase; 26852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 27852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglioimport java.util.List; 28852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 29852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Megliopublic class RecurrenceSetTest extends TestCase { 30852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 31852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio private static String MOCK_COMPONENT_NAME = "mockComponent"; 32852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 33852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio private static final String RRULE_LESS_THAN_75_CHARS = 34852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio "FREQ=WEEKLY;BYDAY=SU,FR,SA;UNTIL=20100326T190000Z;WKST=MO"; 35852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 36852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio private static final String RRULE_MORE_THAN_75_CHARS = 37852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio "FREQ=WEEKLY;WKST=MO;UNTIL=20100129T130000Z;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR, SA,SU"; 38852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 39852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio private static final String RRULE_MORE_THAN_75_CHARS_FOLDED = 40852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio "FREQ=WEEKLY;WKST=MO;UNTIL=20100129T130000Z;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR,\r\n SA,SU"; 41852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 42852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio private static final String STRING_WITH_160_CHARS = "0123456789" 43852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 44852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 45852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 46852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 47852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 48852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 49852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 50852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 51852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 52852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 53852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 54852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 55852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 56852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 57852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789"; 58852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 59852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio private static final String STRING_WITH_160_CHARS_FOLDED = "0123456789" 60852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 61852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 62852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 63852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 64852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 65852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 66852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "01234" 67852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "\r\n " 68852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "56789" 69852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 70852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 71852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 72852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 73852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 74852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 75852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789" 76852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "\r\n " 77852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio + "0123456789"; 78852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 79852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio @SmallTest 80852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio public void testFoldPerRFC2445() { 81852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(RRULE_LESS_THAN_75_CHARS, 82852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio RecurrenceSet.fold(RRULE_LESS_THAN_75_CHARS)); 83852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 84852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(RRULE_MORE_THAN_75_CHARS_FOLDED, 85852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio RecurrenceSet.fold(RRULE_MORE_THAN_75_CHARS)); 86852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 87852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(STRING_WITH_160_CHARS_FOLDED, 88852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio RecurrenceSet.fold(STRING_WITH_160_CHARS)); 89852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio } 90852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 91852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio @SmallTest 92852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio public void testUnFoldPerRFC2445() { 93852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(RRULE_LESS_THAN_75_CHARS, 94852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio RecurrenceSet.unfold(RRULE_LESS_THAN_75_CHARS)); 95852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 96852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(RRULE_MORE_THAN_75_CHARS, 97852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio RecurrenceSet.unfold(RRULE_MORE_THAN_75_CHARS_FOLDED)); 98852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 99852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(STRING_WITH_160_CHARS, 100852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio RecurrenceSet.unfold(STRING_WITH_160_CHARS_FOLDED)); 101852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio } 102852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 103852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio @SmallTest 104852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio public void testRRULEfolding() { 105852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio ICalendar.Component component = new ICalendar.Component(MOCK_COMPONENT_NAME, null); 106852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 107852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio ContentValues values = new ContentValues(); 108b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.DTSTART, 0); 109b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.DURATION, "P3600S"); 110b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.RRULE, RRULE_LESS_THAN_75_CHARS); 111852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 112852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertTrue(RecurrenceSet.populateComponent(values, component)); 113852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio List<ICalendar.Property> list = component.getProperties("DTSTART"); 114852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertTrue(list.size() == 1); 115852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals("19700101T000000Z", list.get(0).getValue()); 116852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 117852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio list = component.getProperties("RRULE"); 118852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertTrue(list.size() == 1); 119852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(RRULE_LESS_THAN_75_CHARS,list.get(0).getValue()); 120852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 121852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio component = new ICalendar.Component(MOCK_COMPONENT_NAME, null); 122852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 123852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio values = new ContentValues(); 124b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.DTSTART, 0); 125b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.DURATION, "P3600S"); 126b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.RRULE, RRULE_MORE_THAN_75_CHARS); 127852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 128852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertTrue(RecurrenceSet.populateComponent(values, component)); 129852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 130852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio list = component.getProperties("RRULE"); 131852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertTrue(list.size() == 1); 132852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(RRULE_MORE_THAN_75_CHARS_FOLDED, list.get(0).getValue()); 133852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 134852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio component = new ICalendar.Component(MOCK_COMPONENT_NAME, null); 135852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 136852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio values = new ContentValues(); 137b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.DTSTART, 0); 138b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.DURATION, "P3600S"); 139b9644fe24edf9e25f0b21c1394e88d25070e0238RoboErik values.put(CalendarContract.Events.RRULE, STRING_WITH_160_CHARS); 140852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 141852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertTrue(RecurrenceSet.populateComponent(values, component)); 142852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio 143852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio list = component.getProperties("RRULE"); 144852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertTrue(list.size() == 1); 145852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio assertEquals(STRING_WITH_160_CHARS_FOLDED, list.get(0).getValue()); 146852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio } 147852d89fc583863cc083b38d1ae29e715b956d511Fabrice Di Meglio} 148