@@ -267,6 +267,52 @@ static int t_ical_dt()
267267 return EXIT_SUCCESS;
268268}
269269
270+ static int t_rrule ()
271+ {
272+ std::string head =
273+ " BEGIN:VCALENDAR\n "
274+ " VERSION:2.0\n "
275+ " BEGIN:VEVENT\n "
276+ " CREATED:20170427T181700Z\n "
277+ " LAST-MODIFIED:20250609T051307Z\n "
278+ " DTSTAMP:20250609T051307Z\n "
279+ " UID:74d6b21d-d73c-4cac-af61-6925d1882b30\n "
280+ " SUMMARY:x\n " ;
281+ static constexpr char foot[] =
282+ " DTSTART;TZID=Europe/Berlin:20150830T110000\n "
283+ " DTEND;TZID=Europe/Berlin:20150830T180000\n "
284+ " CLASS:PUBLIC\n "
285+ " TRANSP:OPAQUE\n "
286+ " X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY\n "
287+ " LOCATION:Irgendwo\n "
288+ " SEQUENCE:0\n "
289+ " X-MICROSOFT-CDO-OWNER-CRITICAL-CHANGE:20160104T085628Z\n "
290+ " X-MICROSOFT-CDO-ATTENDEE-CRITICAL-CHANGE:20160104T085628Z\n "
291+ " X-MICROSOFT-CDO-APPT-SEQUENCE:0\n "
292+ " X-MICROSOFT-CDO-OWNERAPPTID:-1\n "
293+ " X-MICROSOFT-CDO-ALLDAYEVENT:FALSE\n "
294+ " END:VEVENT\n "
295+ " END:VCALENDAR\n " ;
296+
297+ ical icalin;
298+ auto input = head + " RRULE:FREQ=MONTHLY;BYDAY=2MO\n " + foot;
299+ bool succ = icalin.load_from_str_move (input.data ());
300+ if (!succ)
301+ return EXIT_FAILURE;
302+ auto msg = oxcical_import_single (" UTC" , icalin, zalloc, ee_get_propids,
303+ oxcmail_username_to_entryid);
304+ assert (msg != nullptr );
305+
306+ input = head + " RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=8\n " + foot;
307+ succ = icalin.load_from_str_move (input.data ());
308+ if (!succ)
309+ return EXIT_FAILURE;
310+ msg = oxcical_import_single (" UTC" , icalin, zalloc, ee_get_propids,
311+ oxcmail_username_to_entryid);
312+ assert (msg != nullptr );
313+ return EXIT_SUCCESS;
314+ }
315+
270316int main ()
271317{
272318 auto ret = t_ical_api ();
@@ -277,6 +323,9 @@ int main()
277323 t_card ();
278324 t_ical ();
279325 ret = t_ical_dt ();
326+ if (ret != EXIT_SUCCESS)
327+ return ret;
328+ ret = t_rrule ();
280329 if (ret != EXIT_SUCCESS)
281330 return ret;
282331 return EXIT_SUCCESS;
0 commit comments