1cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project// Copyright 2007 The Android Open Source Project
2cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectpackage com.android.providers.calendar;
3cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
45cd969369a0e025bad07ad32bda9c8c4f0630457Michael Chanimport com.android.calendarcommon2.ICalendar;
593e0bbb921cce7a5cec355521bc570c03c9d6a1cAndy McFadden
6cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
7cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectimport junit.framework.TestCase;
8cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
9cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectimport java.util.List;
10cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
11cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Projectpublic class ICalendarTest extends TestCase {
12cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
13cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
14cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testAddParameter() throws Exception {
15cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Property prop = new ICalendar.Property("prop1", "value1");
16cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(0, prop.getParameterNames().size());
17cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        prop.addParameter(new ICalendar.Parameter("param1", "foo"));
18cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, prop.getParameterNames().size());
19cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        prop.addParameter(new ICalendar.Parameter("param1", "bar"));
20cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, prop.getParameterNames().size());
21cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        prop.addParameter(new ICalendar.Parameter("param2", "baaz"));
22cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(2, prop.getParameterNames().size());
23cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        prop.addParameter(new ICalendar.Parameter("param1", "quux"));
24cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(2, prop.getParameterNames().size());
25cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        prop.addParameter(new ICalendar.Parameter("param3", "accent"));
26cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(3, prop.getParameterNames().size());
27cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("prop1;param1=foo;param1=bar;param1=quux;"
28cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                + "param2=baaz;param3=accent:value1", prop.toString());
29cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
30cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
31cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
32cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testAddProperty() throws Exception {
33cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:DUMMY\n" +
34cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "prop2:value3\n" +
35cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "prop1:value1\n" +
36cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "prop1:value2\n" +
37cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:DUMMY\n";
38cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
39cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component component = new ICalendar.Component("DUMMY", null);
40cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        // properties should be listed in insertion order, by property name.
41cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        component.addProperty(new ICalendar.Property("prop2", "value3"));
42cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        component.addProperty(new ICalendar.Property("prop1", "value1"));
43cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        component.addProperty(new ICalendar.Property("prop1", "value2"));
44cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(text, component.toString());
45cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
46cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
47cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
48cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testAddComponent() throws Exception {
49cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:DUMMY\n" +
50cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "prop1:value1\n" +
51cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "prop1:value12\n" +
52cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "BEGIN:DUMMY2\n" +
53cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "prop2:value2\n" +
54cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:DUMMY2\n" +
55cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:DUMMY\n";
56cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
57cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component parent = new ICalendar.Component("DUMMY", null);
58cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        // properties should precede components
59cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component child = new ICalendar.Component("DUMMY2", parent);
60cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        child.addProperty(new ICalendar.Property("prop2", "value2"));
61cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        parent.addChild(child);
62cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        parent.addProperty(new ICalendar.Property("prop1", "value1"));
63cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        parent.addProperty(new ICalendar.Property("prop1", "value12"));
64cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(text, parent.toString());
65cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
66cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
67cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
68cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseBasicComponent() throws Exception {
69cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:DUMMY\n" +
70cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "PROP1;PARAM1=foo;PARAM2=bar:VALUE1\n" +
71cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "PROP1;PARAM1=baaz;PARAM1=quux:VALUE2\n" +
72cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "PROP2:VALUE3\n" +
73cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:DUMMY\n";
74cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
75cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component component = ICalendar.parseComponent(text);
76cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
77cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("DUMMY", component.getName());
78cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNull(component.getComponents());
79cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(2, component.getPropertyNames().size());
80cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Property prop1 = component.getFirstProperty("PROP1");
81cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(2, prop1.getParameterNames().size());
82cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("foo", prop1.getFirstParameter("PARAM1").value);
83cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("bar", prop1.getFirstParameter("PARAM2").value);
84cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        List<ICalendar.Property> props = component.getProperties("PROP1");
85cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(2, props.size());
86cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        List<ICalendar.Parameter> params = props.get(1).getParameters("PARAM1");
87cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("baaz", params.get(0).value);
88cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("quux", params.get(1).value);
89cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
90cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
91cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
92a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert    public void testParseQuotedParam() throws Exception {
93a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        ICalendar.Component component
94a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                = new ICalendar.Component("DUMMY", null /* parent */);
95a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        ICalendar.parseComponent(
96a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                component,
97a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                "DTSTART;TZID=\"GMT+03:00\";TEST=test1;TEST=\"test2\":20101221T090000");
98a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        ICalendar.Property property = component.getFirstProperty("DTSTART");
99a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertEquals(2, property.getParameterNames().size());
100a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertEquals("GMT+03:00", property.getFirstParameter("TZID").value);
101a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        final List<ICalendar.Parameter> testParameters = property.getParameters("TEST");
102a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertEquals(2, testParameters.size());
103a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertEquals("test1", testParameters.get(0).value);
104a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertEquals("test2", testParameters.get(1).value);
105a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertEquals("20101221T090000", component.getFirstProperty("DTSTART").getValue());
106a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert    }
107a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert
108a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert    @SmallTest
109a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert    public void testParseBadQuotedParam() throws Exception {
110a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        ICalendar.Component component
111a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                = new ICalendar.Component("DUMMY", null /* parent */);
112a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert
113a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        ICalendar.parseComponent(
114a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                component,
115a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                "FOO;PARAM1=\"param1\"\";PARAM=quote-before-param:value");
116a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertNull("Invalid quote before param value", component.getFirstProperty("FOO"));
117a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert
118a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        ICalendar.parseComponent(
119a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                component,
120a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                "FOO;PARAM\"=expected-equal:value");
121a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertNull("Expected equal in param", component.getFirstProperty("FOO"));
122a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert
123a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        ICalendar.parseComponent(
124a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                component,
125a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                "FOO;PARAM=text-not-allowed\"before-quote:value");
126a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertNull("Invalid quote in param value", component.getFirstProperty("FOO"));
127a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert
128a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        ICalendar.parseComponent(
129a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                component,
130a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert                "FOO;PARAM=\"missing-end-quote:value");
131a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert        assertNull("missing-end-quote", component.getFirstProperty("FOO"));
132a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert    }
133a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert
134a494fe4c195bbdeddb687d5783717a631ee8b5e3Alon Albert    @SmallTest
135cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseChildComponent() throws Exception {
136cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String childText = "BEGIN:CHILD\n" +
137cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "PROP1;PARAM1=foo;PARAM2=bar:VALUE1\n" +
138cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "PROP1;PARAM1=baaz;PARAM1=quux:VALUE2\n" +
139cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "PROP2:VALUE3\n" +
140cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:CHILD\n";
141cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
142cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String completeText = "BEGIN:DUMMY\n" +
143cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                childText +
144cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:DUMMY\n";
145cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
146cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component component = new ICalendar.Component("DUMMY", null);
147cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        component = ICalendar.parseComponent(component, childText);
148cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("DUMMY", component.getName());
149cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, component.getComponents().size());
150cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(completeText, component.toString());
151cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
152cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
153cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
154cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseBareEvent() throws Exception {
155cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:VEVENT\nEND:VEVENT\n";
156cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component event = ICalendar.parseEvent(text);
157cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
158cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("VEVENT", event.getName());
159cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNull(event.getComponents());
160cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(0, event.getPropertyNames().size());
161cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
162cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
163cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
164cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseEvent1() throws Exception {
165cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:VEVENT\n" +
166cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "DTSTART:19970714T170000Z\n" +
167cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "DTEND:19970715T035959Z\n" +
168cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "SUMMARY:Bastille Day Party\n" +
169cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:VEVENT\n";
170cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
171cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component event = ICalendar.parseEvent(text);
172cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
173cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("VEVENT", event.getName());
174cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNull(event.getComponents());
175cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(3, event.getPropertyNames().size());
176cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getProperties("DTSTART").size());
177cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("19970714T170000Z", event.getFirstProperty("DTSTART").getValue());
178cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(0, event.getFirstProperty("DTSTART").getParameterNames().size());
179cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getProperties("DTEND").size());
180cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(0, event.getFirstProperty("DTEND").getParameterNames().size());
181cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("19970715T035959Z", event.getFirstProperty("DTEND").getValue());
182cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getProperties("SUMMARY").size());
183cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(0, event.getFirstProperty("SUMMARY").getParameterNames().size());
184cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("Bastille Day Party", event.getFirstProperty("SUMMARY").getValue());
185cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
186cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
187cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
188cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseEvent2() throws Exception {
189cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:VEVENT\n" +
190cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "DTSTART;TZID=America/Los_Angeles:19970714T170000\n" +
191cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "DURATION:+P3600S\n" +
192cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "SUMMARY;FOO=1;BAR=2:Bastille Day Party\n" +
193cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:VEVENT\n";
194cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
195cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component event = ICalendar.parseEvent(text);
196cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
197cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("VEVENT", event.getName());
198cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNull(event.getComponents());
199cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(3, event.getPropertyNames().size());
200cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getProperties("DTSTART").size());
201cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("19970714T170000", event.getFirstProperty("DTSTART").getValue());
202cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getFirstProperty("DTSTART").getParameterNames().size());
203cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getProperties("SUMMARY").size());
204cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
205cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
206cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
207cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseInvalidProperty() throws Exception {
208cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:VEVENT\n" +
209cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "FOO;BAR\n" + // invalid line
210cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:VEVENT\n";
211cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
212cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component event = ICalendar.parseEvent(text);
213cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
214cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("VEVENT", event.getName());
215cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNull(event.getComponents());
216cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(0, event.getPropertyNames().size());
217cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
218cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
219cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
220cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseEventDoesNotStartWithBegin() throws Exception {
221cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "NOTBEGIN:DUMMY\n" +
222cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:DUMMY\n";
223cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
224cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        try {
225cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            ICalendar.parseEvent(text);
226cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            fail("expected exception not thrown");
227cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        } catch (ICalendar.FormatException e) {
228cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            assertEquals("Expected " + ICalendar.Component.VEVENT, e.getMessage());
229cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        }
230cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
231cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
232cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
233cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseCalendarDoesNotStartWithBegin() throws Exception {
234cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "NOTBEGIN:DUMMY\n" +
235cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:DUMMY\n";
236cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
237cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        try {
238cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            ICalendar.parseCalendar(text);
239cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            fail("expected exception not thrown");
240cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        } catch (ICalendar.FormatException e) {
241cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project            assertEquals("Expected " + ICalendar.Component.VCALENDAR, e.getMessage());
242cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        }
243cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
244cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
245cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
246cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseComponentDoesNotStartWithBegin() throws Exception {
247cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "NOTBEGIN:DUMMY\n" +
248cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:DUMMY\n";
249cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
250cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component component = ICalendar.parseComponent(text);
251cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNull(component);
252cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
253cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
254cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
255cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseUnexpectedEndComponent() throws Exception {
256cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:PARENT\n" +
257cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:BADPARENT\n";
258cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
259cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component component = ICalendar.parseComponent(text);
260cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNotNull(component);
261cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
262cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
263cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
264cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testParseNoEndComponent() throws Exception {
265cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:DUMMY\n" +
266cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:\n";
267cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
268cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component component = ICalendar.parseComponent(text);
269cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNotNull(component);
270cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
271cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
272cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
273cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testNormalize() throws Exception {
274cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:VEVENT\n" +
275cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "RRULE:FREQ=SECONDLY;BYSECOND=0,1,2,\r\n 3,4,5\r\n ,6,7,8\r\n" +
276cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:VEVENT\n";
277cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
278cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component event = ICalendar.parseEvent(text);
279cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
280cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("VEVENT", event.getName());
281cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNull(event.getComponents());
282cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getPropertyNames().size());
283cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getProperties("RRULE").size());
284cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("FREQ=SECONDLY;BYSECOND=0,1,2,3,4,5,6,7,8", event.getFirstProperty("RRULE").getValue());
285cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
286cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
287cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
288cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
289cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testNormalizeBadSep() throws Exception {
290cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:VEVENT\n" +
291cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "RRULE:FREQ=SECONDLY;BYSECOND=0,1,2,\n 3,4,5\n ,6,7,8\n" +
292cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:VEVENT\n";
293cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
294cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component event = ICalendar.parseEvent(text);
295cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
296cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("VEVENT", event.getName());
297cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertNull(event.getComponents());
298cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getPropertyNames().size());
299cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals(1, event.getProperties("RRULE").size());
300cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        assertEquals("FREQ=SECONDLY;BYSECOND=0,1,2,3,4,5,6,7,8", event.getFirstProperty("RRULE").getValue());
301cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
302cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
303cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
304cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    @SmallTest
305cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    public void testBad() throws Exception {
306cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        String text = "BEGIN:VEVENT\n" +
307cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "RRULE=foo\n" +
308cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project                "END:VEVENT\n";
309cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
310cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        ICalendar.Component event = ICalendar.parseEvent(text);
311cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project
312cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        // Note that parseEvent doesn't throw the FormatException you might expect because
313cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        // ICalendar.parseComponentImpl catches the exception due to misformatted GData.
314cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project        // TODO: update this test after cleaning up the ICalendar behavior
315cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project    }
316cf013ece751816a07396845858f1c7037ead464fThe Android Open Source Project}
317