public void UnitTest2() { var xmlStr = @"<C:filter xmlns:C=""urn:ietf:params:xml:ns:caldav""> <C:comp-filter name=""VCALENDAR""> <C:comp-filter name=""VFREEBUSY""> <C:time-range start=""20060102T000000Z"" end=""20060103T000000Z""/> </C:comp-filter> </C:comp-filter> </C:filter>"; var calStr = @"BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example Corp.//CalDAV Client//EN BEGIN:VFREEBUSY ORGANIZER;CN=""Bernard Desruisseaux"":mailto:[email protected] UID:[email protected] DTSTAMP:20050530T123421Z DTSTART:20060101T100000Z DTEND:20060108T100000Z FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060102T100000Z/20060102T120000Z END:VFREEBUSY END:VCALENDAR"; var calendar = VCalendar.Parse(calStr); var xmlTree = XmlTreeStructure.Parse(xmlStr); var result = calendar.FilterResource(xmlTree); Assert.True(result); }
/// <summary> /// The CALDAV:calendar-query REPORT performs a search for all calendar object resources that match a /// specified filter. The response of this report will contain all the WebDAV properties and calendar object /// resource data specified in the request. In the case of the CALDAV:calendar-data XML element, one can /// explicitly specify the calendar components and properties that should be returned in the calendar object /// resource data that matches the filter. /// </summary> /// <param name="xmlDoc">The body of the request.</param> /// <param name="collectionURl"></param> /// <param name="httpContext"></param> /// <returns></returns> public async Task CalendarQuery(IXMLTreeStructure xmlDoc, string collectionURl, HttpContext httpContext) { IFileSystemManagement fs = new FileSystemManagement(); // take the first prop node to know the data that // should ne returned IXMLTreeStructure propNode; xmlDoc.GetChildAtAnyLevel("prop", out propNode); //get the filters to be applied IXMLTreeStructure componentFilter; xmlDoc.GetChildAtAnyLevel("filter", out componentFilter); var userResources = new Dictionary <string, string>(); await fs.GetAllCalendarObjectResource(collectionURl, userResources); var userCalendars = userResources.ToDictionary(userResource => userResource.Key, userResource => VCalendar.Parse(userResource.Value)); //apply the filters to the calendars var filteredCalendars = userCalendars.Where(x => x.Value.FilterResource(componentFilter)); await ReportResponseBuilder(filteredCalendars, propNode, httpContext); }
public void CalendarFromSolCalendar() { using (var reader = File.OpenText("sol.ics")) { var calString = reader.ReadToEnd(); var cal = VCalendar.Parse(calString); Assert.NotNull(cal); } }
public void UnitTest2() { var calStr = @"BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example Corp.//CalDAV Client//EN BEGIN:VFREEBUSY ORGANIZER;CN=""Bernard Desruisseaux"":mailto:[email protected] UID:[email protected] DTSTAMP:20050530T123421Z DTSTART:20060101T100000Z DTEND:20060108T100000Z FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060102T100000Z/20060102T120000Z END:VFREEBUSY END:VCALENDAR"; var result = VCalendar.Parse(calStr); }
public void UnitTest1() { var calString = @"BEGIN:VCALENDAR BEGIN:VFREEBUSY FREEBUSY:19980314T233000Z/19980315T003000Z FREEBUSY:19980316T153000Z/19980316T163000Z FREEBUSY:19980318T030000Z/19980318T040000Z URL:http://www.example.com/calendar/busytime/jsmith.ifb END:VFREEBUSY END:VCALENDAR "; VCalendar calendar = VCalendar.Parse(calString); var calendarString = calendar.ToString(); UnicodeEncoding uniencoding = new UnicodeEncoding(); UTF8Encoding utf8Encoding = new UTF8Encoding(); var toWrite = utf8Encoding.GetBytes(calendarString); File.Delete("output1.ics"); using (var writer = File.OpenWrite("output1.ics")) { writer.Seek(0, SeekOrigin.End); writer.Write(toWrite, 0, toWrite.Length); } using (var reader = File.OpenText("output1.ics")) { var writedCal = reader.ReadToEnd(); var writedCalLines = Parser.CalendarReader(writedCal); var expectedLines = Parser.CalendarReader(calString); Assert.Equal(expectedLines.Length, writedCalLines.Length); for (int i = 0; i < writedCalLines.Length; i++) { Assert.Contains(expectedLines[i], writedCalLines); } } Assert.NotNull(calendarString); }
public void BuildVCalendar() { var calString = @"BEGIN:VCALENDAR PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 CALSCALE:GREGORIAN X-WR-CALNAME:[email protected] X-WR-TIMEZONE:America/Los_Angeles BEGIN:VTIMEZONE TZID:America/Los_Angeles X-LIC-LOCATION:America/Los_Angeles BEGIN:DAYLIGHT TZOFFSETFROM:-0800 TZOFFSETTO:-0700 TZNAME:PDT DTSTART:19700308T020000 RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0700 TZOFFSETTO:-0800 TZNAME:PST DTSTART:19701101T020000 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=America/Los_Angeles:20120629T130000 DTEND;TZID=America/Los_Angeles:20120629T140000 DTSTAMP:20120629T112428Z UID:[email protected] RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU; BYMONTHDAY=2,3,4,5,6,7,8 RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU; BYMONTHDAY=2,3,4,5,6,7,8 CREATED:20120629T111935Z DESCRIPTION:foo LAST-MODIFIED:20120629T112428Z LOCATION:Barcelona SEQUENCE:0 STATUS:CONFIRMED SUMMARY:Demo B2G Calendar TRANSP:OPAQUE BEGIN:VALARM ACTION:EMAIL DESCRIPTION:This is an event reminder SUMMARY:Alarm notification ATTENDEE:mailto:[email protected] ATTENDEE:mailto:[email protected] TRIGGER:-P0DT0H30M0S END:VALARM BEGIN:VALARM ACTION:DISPLAY DESCRIPTION:This is an event reminder TRIGGER:-P0DT0H30M0S END:VALARM END:VEVENT END:VCALENDAR "; VCalendar calendar = VCalendar.Parse(calString); var calendarString = calendar.ToString(); UnicodeEncoding uniencoding = new UnicodeEncoding(); UTF8Encoding utf8Encoding = new UTF8Encoding(); var toWrite = utf8Encoding.GetBytes(calendarString); File.Delete("output1.ics"); using (var writer = File.OpenWrite("output1.ics")) { writer.Seek(0, SeekOrigin.End); writer.Write(toWrite, 0, toWrite.Length); } using (var reader = File.OpenText("output1.ics")) { var writedCal = reader.ReadToEnd(); var writedCalLines = Parser.CalendarReader(writedCal); var expectedLines = Parser.CalendarReader(calString); Assert.Equal(expectedLines.Length, writedCalLines.Length); for (int i = 0; i < writedCalLines.Length; i++) { Assert.Contains(expectedLines[i], writedCalLines); } } Assert.NotNull(calendarString); }
public void ToStringTest() { var calString = @"BEGIN:VCALENDAR PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 CALSCALE:GREGORIAN X-WR-CALNAME:[email protected] X-WR-TIMEZONE:America/Los_Angeles BEGIN:VTIMEZONE TZID:America/Los_Angeles X-LIC-LOCATION:America/Los_Angeles BEGIN:DAYLIGHT TZOFFSETFROM:-0800 TZOFFSETTO:-0700 TZNAME:PDT DTSTART:19700308T020000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0700 TZOFFSETTO:-0800 TZNAME:PST DTSTART:19701101T020000 RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU RDATE:19450603T010000 END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=America/Los_Angeles:20120629T130000 DTEND;TZID=America/Los_Angeles:20120629T140000 DTSTAMP:20120629T112428Z UID:[email protected] RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU CREATED:20120629T111935Z DESCRIPTION:foo LAST-MODIFIED:20120629T112428Z LOCATION:Barcelona SEQUENCE:0 STATUS:CONFIRMED SUMMARY:Demo B2G Calendar TRANSP:OPAQUE BEGIN:VALARM ACTION:EMAIL DESCRIPTION:This is an event reminder SUMMARY:Alarm notification ATTENDEE:mailto:[email protected] TRIGGER:-P0DT0H30M0S END:VALARM BEGIN:VALARM ACTION:DISPLAY DESCRIPTION:This is an event reminder TRIGGER:-P0DT0H30M0S END:VALARM END:VEVENT END:VCALENDAR "; VCalendar calendar = VCalendar.Parse(calString); var xmlDoc = @"<?xml version=""1.0"" encoding=""utf-8"" ?> <C:calendar-query xmlns:D=""DAV:"" xmlns:C=""urn:ietf:params:xml:ns:caldav""> <D:prop> <D:getetag/> <C:calendar-data> <C:comp name=""VCALENDAR""> <C:prop name=""VERSION""/> <C:comp name=""VEVENT""> <C:prop name=""SUMMARY""/> <C:prop name=""UID""/> <C:prop name=""DTSTART""/> <C:prop name=""DTEND""/> </C:comp> <C:comp name=""VTIMEZONE""/> </C:comp> </C:calendar-data> </D:prop> <C:filter> <C:comp-filter name=""VCALENDAR""> <C:comp-filter name=""VEVENT""> <C:time-range start=""20060104T000000Z"" end=""20060105T000000Z""/> </C:comp-filter> </C:comp-filter> </C:filter> </C:calendar-query>"; var xmlTree = XmlTreeStructure.Parse(xmlDoc); var node = xmlTree.GetChildAtAnyLevel("calendar-data"); var newCalString = calendar.ToString(node); var newCal = new VCalendar(newCalString); Assert.Equal(2, newCal.CalendarComponents.Count); Assert.Contains("VEVENT", newCal.CalendarComponents.Keys); Assert.Contains("VTIMEZONE", newCal.CalendarComponents.Keys); Assert.Equal(4, newCal.CalendarComponents["VEVENT"].First().Properties.Count); }
public void CheckProperties() { var calString = @"BEGIN:VCALENDAR PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 CALSCALE:GREGORIAN X-WR-CALNAME:[email protected] X-WR-TIMEZONE:America/Los_Angeles BEGIN:VTIMEZONE TZID:America/Los_Angeles X-LIC-LOCATION:America/Los_Angeles BEGIN:DAYLIGHT TZOFFSETFROM:-0800 TZOFFSETTO:-0700 TZNAME:PDT DTSTART:19700308T020000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0700 TZOFFSETTO:-0800 TZNAME:PST DTSTART:19701101T020000 RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=America/Los_Angeles:20120629T130000 DTEND;TZID=America/Los_Angeles:20120629T140000 DTSTAMP:20120629T112428Z UID:[email protected] CREATED:20120629T111935Z DESCRIPTION:foo LAST-MODIFIED:20120629T112428Z LOCATION:Barcelona SEQUENCE:0 STATUS:CONFIRMED SUMMARY:Demo B2G Calendar TRANSP:OPAQUE BEGIN:VALARM ACTION:EMAIL DESCRIPTION:This is an event reminder SUMMARY:Alarm notification ATTENDEE:mailto:[email protected] TRIGGER:-P0DT0H30M0S END:VALARM BEGIN:VALARM ACTION:DISPLAY DESCRIPTION:This is an event reminder TRIGGER:-P0DT0H30M0S END:VALARM END:VEVENT END:VCALENDAR "; VCalendar calendar = VCalendar.Parse(calString); var calEvent = calendar.GetCalendarComponents("VEVENT").First() as VEvent; var eventAlarms = calEvent.CalendarComponents["VALARM"]; Assert.Equal((calEvent.GetComponentProperty("UID") as IValue <string>).Value, "*****@*****.**"); Assert.Equal((calEvent.GetComponentProperty("DESCRIPTION") as IValue <string>).Value, "foo"); Assert.Equal(2, eventAlarms.Count); }
/// <summary> /// The CALDAV:calendar-multiget REPORT is used to retrieve specific calendar object resources from within a /// collection, if the Request-URI is a collection, or to retrieve a specific calendar object resource, if the /// Request-URI is a calendar object resource. This report is similar to the CALDAV:calendar-query REPORT /// (see Section 7.8), except that it takes a list of DAV:href elements, instead of a CALDAV:filter element, to /// determine which calendar object resources to return /// </summary> /// <returns></returns> private async Task CalendarMultiget(IXMLTreeStructure xmlBody, HttpContext httpContext) { // take the first prop node to know the data that // should ne returned IXMLTreeStructure propNode; xmlBody.GetChildAtAnyLevel("prop", out propNode); //take the href nodes. Contain the direction of the resources files that //are requested var hrefs = xmlBody.Children.Where(node => node.NodeName == "href").Select(href => href.Value); var result = new Dictionary <string, string>(); // process the requested resources foreach (var href in hrefs) { var fs = new FileSystemManagement(); var resourceContent = await fs.GetCalendarObjectResource(href); result.Add(href, resourceContent); } await ReportResponseBuilder(result .Select( x => new KeyValuePair <string, VCalendar>(x.Key, string.IsNullOrEmpty(x.Value) ? null : VCalendar.Parse(x.Value))), propNode, httpContext); }
public void UnitTest3() { var calStr = @"BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example Corp.//CalDAV Client//EN BEGIN:VTIMEZONE LAST-MODIFIED:20040110T032845Z TZID:US/Eastern BEGIN:DAYLIGHT DTSTART:20000404T020000 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4 TZNAME:EDT TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD DTSTART:20001026T020000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZNAME:EST TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD END:VTIMEZONE BEGIN:VEVENT ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:[email protected] ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:[email protected] DTSTAMP:20060206T001220Z DTSTART;TZID=US/Eastern:20060104T100000 DURATION:PT1H RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 LAST-MODIFIED:20060206T001330Z ORGANIZER:mailto:[email protected] SEQUENCE:1 STATUS:TENTATIVE SUMMARY:Event #3 UID:[email protected] X-ABC-GUID:[email protected] END:VEVENT END:VCALENDAR"; var result = VCalendar.Parse(calStr); var xmlStr = @" <C:calendar-data xmlns:C=""urn:ietf:params:xml:ns:caldav""> <C:comp name=""VCALENDAR""> <C:prop name=""VERSION""/> <C:comp name=""VEVENT""> <C:prop name=""SUMMARY""/> <C:prop name=""UID""/> <C:prop name=""DTSTART""/> <C:prop name=""DTEND""/> <C:prop name=""DURATION""/> <C:prop name=""RRULE""/> <C:prop name=""ATTENDEE""/> <C:prop name=""EXRULE""/> <C:prop name=""EXDATE""/> <C:prop name=""RECURRENCE-ID""/> </C:comp> <C:comp name=""VTIMEZONE""/> </C:comp> </C:calendar-data>"; var calString = result.ToString(XmlTreeStructure.Parse(xmlStr)); }
public void TestTheToStringMethod() { var vCalString = @"BEGIN:VCALENDAR VERSION:2.0 PRODID:+//IDN bitfire.at//DAVdroid/1.0.8 ical4android ical4j/2.x BEGIN:VEVENT DTSTAMP:20160907T213117Z UID:1d2a9f2f-40d0-4733-b81b-1ea15d79ee21 DTSTART;TZID=America/Havana:20160905T080000 DURATION:PT5700S RRULE:FREQ=WEEKLY;WKST=SU;COUNT=16;BYDAY=MO SUMMARY:Programación y algoritmos CF LOCATION:Aula 8 STATUS:CONFIRMED END:VEVENT BEGIN:VTIMEZONE TZID:America/Havana TZURL:http://tzurl.org/zoneinfo/America/Havana X-LIC-LOCATION:America/Havana BEGIN:DAYLIGHT TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:CDT DTSTART:19280610T010000 RDATE:19280610T010000 RDATE:19400602T010000 RDATE:19410601T010000 RDATE:19420607T010000 RDATE:19450603T010000 RDATE:19460602T010000 RDATE:19650601T010000 RDATE:19660529T010000 RDATE:19670408T010000 RDATE:19680414T010000 RDATE:19690427T010000 RDATE:19700426T000000 RDATE:19710425T000000 RDATE:19720430T000000 RDATE:19730429T000000 RDATE:19740428T000000 RDATE:19750427T000000 RDATE:19760425T000000 RDATE:19770424T000000 RDATE:19780507T000000 RDATE:19790318T000000 RDATE:19800316T000000 RDATE:19810510T000000 RDATE:19820509T000000 RDATE:19830508T000000 RDATE:19840506T000000 RDATE:19850505T000000 RDATE:19860316T000000 RDATE:19870315T000000 RDATE:19880320T000000 RDATE:19890319T000000 RDATE:19900401T000000 RDATE:19910407T000000 RDATE:19920405T000000 RDATE:19930404T000000 RDATE:19940403T000000 RDATE:19950402T000000 RDATE:19960407T000000 RDATE:19970406T000000 RDATE:19980329T000000 RDATE:19990328T000000 RDATE:20000402T000000 RDATE:20010401T000000 RDATE:20020407T000000 RDATE:20030406T000000 RDATE:20040328T000000 RDATE:20070311T000000 RDATE:20080316T000000 RDATE:20090308T000000 RDATE:20100314T000000 RDATE:20110320T000000 RDATE:20120401T000000 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:CST DTSTART:19281010T000000 RDATE:19281010T000000 RDATE:19400901T000000 RDATE:19410907T000000 RDATE:19420906T000000 RDATE:19450902T000000 RDATE:19460901T000000 RDATE:19650930T000000 RDATE:19661002T000000 RDATE:19670910T000000 RDATE:19680908T000000 RDATE:19691026T000000 RDATE:19701025T000000 RDATE:19711031T000000 RDATE:19721008T000000 RDATE:19731008T000000 RDATE:19741008T000000 RDATE:19751026T000000 RDATE:19761031T000000 RDATE:19771030T000000 RDATE:19781008T000000 RDATE:19791014T000000 RDATE:19801012T000000 RDATE:19811011T000000 RDATE:19821010T000000 RDATE:19831009T000000 RDATE:19841014T000000 RDATE:19851013T000000 RDATE:19861012T000000 RDATE:19871011T000000 RDATE:19881009T000000 RDATE:19891008T000000 RDATE:19901014T000000 RDATE:19911013T010000 RDATE:19921011T010000 RDATE:19931010T010000 RDATE:19941009T010000 RDATE:19951008T010000 RDATE:19961006T010000 RDATE:19971012T010000 RDATE:19981025T010000 RDATE:19991031T010000 RDATE:20001029T010000 RDATE:20011028T010000 RDATE:20021027T010000 RDATE:20031026T010000 RDATE:20061029T010000 RDATE:20071028T010000 RDATE:20081026T010000 RDATE:20091025T010000 RDATE:20101031T010000 RDATE:20111113T010000 END:STANDARD END:VTIMEZONE END:VCALENDAR "; var vCal = VCalendar.Parse(vCalString); var stringFromVCal = vCal.ToString(); var vCalFromString = VCalendar.Parse(stringFromVCal); //check the vCalendar's properties Assert.True(checkProperties(vCal.Properties, vCalFromString.Properties)); //check the calendar components foreach (var calComp in vCal.CalendarComponents) { Assert.Contains(calComp.Key, vCalFromString.CalendarComponents.Keys); Assert.Equal(calComp.Value.Count, vCalFromString.CalendarComponents[calComp.Key].Count); Assert.True(checkProperties(calComp.Value.First().Properties, vCalFromString.CalendarComponents[calComp.Key].First().Properties)); } }
public void TestNullReferenceOnDurationProp() { var vCalString = @"BEGIN:VCALENDAR VERSION:2.0 PRODID:+//IDN bitfire.at//DAVdroid/1.0.8 ical4android ical4j/2.x BEGIN:VEVENT DTSTAMP:20160907T213117Z UID:1d2a9f2f-40d0-4733-b81b-1ea15d79ee21 DTSTART;TZID=America/Havana:20160905T080000 DURATION:PT5700S RRULE:FREQ=WEEKLY;WKST=SU;COUNT=16;BYDAY=MO SUMMARY:Programación y algoritmos CF LOCATION:Aula 8 STATUS:CONFIRMED END:VEVENT BEGIN:VTIMEZONE TZID:America/Havana TZURL:http://tzurl.org/zoneinfo/America/Havana X-LIC-LOCATION:America/Havana BEGIN:STANDARD TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:CST DTSTART:20121104T010000 RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:CDT DTSTART:20130310T000000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-052928 TZOFFSETTO:-052936 TZNAME:HMT DTSTART:18900101T000000 RDATE:18900101T000000 END:STANDARD BEGIN:STANDARD TZOFFSETFROM:-052936 TZOFFSETTO:-0500 TZNAME:CST DTSTART:19250719T120000 RDATE:19250719T120000 END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:CDT DTSTART:19280610T010000 RDATE:19280610T010000 RDATE:19400602T010000 RDATE:19410601T010000 RDATE:19420607T010000 RDATE:19450603T010000 RDATE:19460602T010000 RDATE:19650601T010000 RDATE:19660529T010000 RDATE:19670408T010000 RDATE:19680414T010000 RDATE:19690427T010000 RDATE:19700426T000000 RDATE:19710425T000000 RDATE:19720430T000000 RDATE:19730429T000000 RDATE:19740428T000000 RDATE:19750427T000000 RDATE:19760425T000000 RDATE:19770424T000000 RDATE:19780507T000000 RDATE:19790318T000000 RDATE:19800316T000000 RDATE:19810510T000000 RDATE:19820509T000000 RDATE:19830508T000000 RDATE:19840506T000000 RDATE:19850505T000000 RDATE:19860316T000000 RDATE:19870315T000000 RDATE:19880320T000000 RDATE:19890319T000000 RDATE:19900401T000000 RDATE:19910407T000000 RDATE:19920405T000000 RDATE:19930404T000000 RDATE:19940403T000000 RDATE:19950402T000000 RDATE:19960407T000000 RDATE:19970406T000000 RDATE:19980329T000000 RDATE:19990328T000000 RDATE:20000402T000000 RDATE:20010401T000000 RDATE:20020407T000000 RDATE:20030406T000000 RDATE:20040328T000000 RDATE:20070311T000000 RDATE:20080316T000000 RDATE:20090308T000000 RDATE:20100314T000000 RDATE:20110320T000000 RDATE:20120401T000000 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:CST DTSTART:19281010T000000 RDATE:19281010T000000 RDATE:19400901T000000 RDATE:19410907T000000 RDATE:19420906T000000 RDATE:19450902T000000 RDATE:19460901T000000 RDATE:19650930T000000 RDATE:19661002T000000 RDATE:19670910T000000 RDATE:19680908T000000 RDATE:19691026T000000 RDATE:19701025T000000 RDATE:19711031T000000 RDATE:19721008T000000 RDATE:19731008T000000 RDATE:19741008T000000 RDATE:19751026T000000 RDATE:19761031T000000 RDATE:19771030T000000 RDATE:19781008T000000 RDATE:19791014T000000 RDATE:19801012T000000 RDATE:19811011T000000 RDATE:19821010T000000 RDATE:19831009T000000 RDATE:19841014T000000 RDATE:19851013T000000 RDATE:19861012T000000 RDATE:19871011T000000 RDATE:19881009T000000 RDATE:19891008T000000 RDATE:19901014T000000 RDATE:19911013T010000 RDATE:19921011T010000 RDATE:19931010T010000 RDATE:19941009T010000 RDATE:19951008T010000 RDATE:19961006T010000 RDATE:19971012T010000 RDATE:19981025T010000 RDATE:19991031T010000 RDATE:20001029T010000 RDATE:20011028T010000 RDATE:20021027T010000 RDATE:20031026T010000 RDATE:20061029T010000 RDATE:20071028T010000 RDATE:20081026T010000 RDATE:20091025T010000 RDATE:20101031T010000 RDATE:20111113T010000 END:STANDARD END:VTIMEZONE END:VCALENDAR "; var vCal = VCalendar.Parse(vCalString); var stringFromVCal = vCal.ToString(); Assert.NotNull(stringFromVCal); }