Example #1
0
        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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
 public void CalendarFromSolCalendar()
 {
     using (var reader = File.OpenText("sol.ics"))
     {
         var calString = reader.ReadToEnd();
         var cal       = VCalendar.Parse(calString);
         Assert.NotNull(cal);
     }
 }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        /// <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);
        }
Example #10
0
        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));
        }
Example #11
0
        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));
            }
        }
Example #12
0
        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);
        }