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