diff --git a/QRCoder/PayloadGenerator.cs b/QRCoder/PayloadGenerator.cs index 56949682..f0e75378 100644 --- a/QRCoder/PayloadGenerator.cs +++ b/QRCoder/PayloadGenerator.cs @@ -1877,6 +1877,20 @@ public class CalendarEvent : Payload private readonly string subject, description, location, start, end; private readonly EventEncoding encoding; + /// + /// Generates a calender entry/event payload. + /// + /// Subject/title of the calender event + /// Description of the event + /// Location (lat:long or address) of the event + /// Start time (incl. UTC offset) of the event + /// End time (incl. UTC offset) of the event + /// Is it a full day event? + /// Type of encoding (universal or iCal) + public CalendarEvent(string subject, string description, string location, DateTimeOffset start, DateTimeOffset end, bool allDayEvent, EventEncoding encoding = EventEncoding.Universal) : this(subject, description, location, start.UtcDateTime, end.UtcDateTime, allDayEvent, encoding) + { + } + /// /// Generates a calender entry/event payload. /// @@ -1893,9 +1907,17 @@ public CalendarEvent(string subject, string description, string location, DateTi this.description = description; this.location = location; this.encoding = encoding; - string dtFormat = allDayEvent ? "yyyyMMdd" : "yyyyMMddTHHmmss"; - this.start = start.ToString(dtFormat); - this.end = end.ToString(dtFormat); + string dtFormatStart = "yyyyMMdd", dtFormatEnd = "yyyyMMdd"; + if (!allDayEvent) + { + dtFormatStart = dtFormatEnd = "yyyyMMddTHHmmss"; + if (start.Kind == DateTimeKind.Utc) + dtFormatStart = "yyyyMMddTHHmmssZ"; + if (end.Kind == DateTimeKind.Utc) + dtFormatEnd = "yyyyMMddTHHmmssZ"; + } + this.start = start.ToString(dtFormatStart); + this.end = end.ToString(dtFormatEnd); } public override string ToString() diff --git a/QRCoderTests/PayloadGeneratorTests.cs b/QRCoderTests/PayloadGeneratorTests.cs index 717516e8..878a4115 100644 --- a/QRCoderTests/PayloadGeneratorTests.cs +++ b/QRCoderTests/PayloadGeneratorTests.cs @@ -816,7 +816,7 @@ public void calendarevent_should_build_universal() var location = "Programmer's paradise, Beachtown, Paradise"; var alldayEvent = false; var begin = new DateTime(2016, 01, 03, 12, 00, 00); - var end = new DateTime(2016, 01, 03, 14, 30, 0); + var end = new DateTime(2016, 01, 03, 14, 30, 00); var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal; var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding); @@ -843,6 +843,42 @@ public void calendarevent_should_build_ical() } + [Fact] + [Category("PayloadGenerator/CalendarEvent")] + public void calendarevent_should_build_with_utc_datetime() + { + var subject = "Release party"; + var description = "A small party for the new QRCoder. Bring some beer!"; + var location = "Programmer's paradise, Beachtown, Paradise"; + var alldayEvent = false; + var begin = new DateTime(2016, 01, 03, 12, 00, 00, DateTimeKind.Utc); + var end = new DateTime(2016, 01, 03, 14, 30, 00, DateTimeKind.Utc); + var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal; + + var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding); + + generator.ToString().ShouldBe($"BEGIN:VEVENT{Environment.NewLine}SUMMARY:Release party{Environment.NewLine}DESCRIPTION:A small party for the new QRCoder. Bring some beer!{Environment.NewLine}LOCATION:Programmer's paradise, Beachtown, Paradise{Environment.NewLine}DTSTART:20160103T120000Z{Environment.NewLine}DTEND:20160103T143000Z{Environment.NewLine}END:VEVENT"); + } + + + [Fact] + [Category("PayloadGenerator/CalendarEvent")] + public void calendarevent_should_build_with_utc_offset() + { + var subject = "Release party"; + var description = "A small party for the new QRCoder. Bring some beer!"; + var location = "Programmer's paradise, Beachtown, Paradise"; + var alldayEvent = false; + var begin = new DateTimeOffset(2016, 01, 03, 12, 00, 00, new TimeSpan(3, 0, 0)); + var end = new DateTimeOffset(2016, 01, 03, 14, 30, 00, new TimeSpan(3, 0, 0)); + var encoding = PayloadGenerator.CalendarEvent.EventEncoding.Universal; + + var generator = new PayloadGenerator.CalendarEvent(subject, description, location, begin, end, alldayEvent, encoding); + + generator.ToString().ShouldBe($"BEGIN:VEVENT{Environment.NewLine}SUMMARY:Release party{Environment.NewLine}DESCRIPTION:A small party for the new QRCoder. Bring some beer!{Environment.NewLine}LOCATION:Programmer's paradise, Beachtown, Paradise{Environment.NewLine}DTSTART:20160103T090000Z{Environment.NewLine}DTEND:20160103T113000Z{Environment.NewLine}END:VEVENT"); + } + + [Fact] [Category("PayloadGenerator/CalendarEvent")] public void calendarevent_should_build_allday()