From 13e199db743c729f8ea3367d0d21a3be9f6f8ca4 Mon Sep 17 00:00:00 2001 From: Ramon Smits Date: Mon, 15 Sep 2025 17:36:46 +0200 Subject: [PATCH 1/5] Test for v4 --- Ical.Net.Tests/OccurrenceIssue.cs | 76 +++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Ical.Net.Tests/OccurrenceIssue.cs diff --git a/Ical.Net.Tests/OccurrenceIssue.cs b/Ical.Net.Tests/OccurrenceIssue.cs new file mode 100644 index 000000000..8a3a1dbd1 --- /dev/null +++ b/Ical.Net.Tests/OccurrenceIssue.cs @@ -0,0 +1,76 @@ +using System; +using System.Linq; +using Ical.Net.CalendarComponents; +using Ical.Net.DataTypes; +using NUnit.Framework; + +namespace Ical.Net.Tests; + +[TestFixture] +public class OccurrenceIssue +{ + [Test, Explicit] + public void MissingOccurrences() + { + var cal = Calendar.Load(""" + BEGIN:VCALENDAR + PRODID:-//Google Inc//Google Calendar 70.9054//EN + VERSION:2.0 + CALSCALE:GREGORIAN + METHOD:PUBLISH + X-WR-CALNAME:Non-Critical Support Roster + X-WR-TIMEZONE:UTC + BEGIN:VEVENT + DTSTART;VALUE=DATE:20251103 + DTEND;VALUE=DATE:20251124 + RRULE:FREQ=WEEKLY;WKST=MO;INTERVAL=48;BYDAY=MO + DTSTAMP:20250912T100327Z + UID:00p0ja7t2446ja22sl02ah2uun@google.com + CREATED:20250214T230308Z + LAST-MODIFIED:20250409T173619Z + SEQUENCE:1 + STATUS:CONFIRMED + SUMMARY:QWERTY + TRANSP:TRANSPARENT + END:VEVENT + BEGIN:VEVENT + DTSTART;VALUE=DATE:20251103 + DTEND;VALUE=DATE:20251124 + DTSTAMP:20250912T100327Z + UID:00p0ja7t2446ja22sl02ah2uun@google.com + RECURRENCE-ID;VALUE=DATE:20251103 + CREATED:20250214T230308Z + LAST-MODIFIED:20250428T170953Z + SEQUENCE:1 + STATUS:CONFIRMED + SUMMARY:QWERTY + TRANSP:TRANSPARENT + END:VEVENT + END:VCALENDAR + """)!; + + Console.WriteLine("Events:"); + foreach (var e in cal.Events.OrderBy(x=>x.Start)) + { + Console.WriteLine($"\t{e.Uid.Substring(0,7)} {e.Start.Value} {e.End.Value} {e.Summary}"); + } + + var dt = new CalDateTime(new DateTime(2026,1,1)); + + var occurrences = cal + .GetOccurrences( + new DateTime(2025, 1, 1), + new DateTime(2026, 1, 1) + ); + //.TakeWhile(p => p.Period.StartTime <= dt); + + Console.WriteLine("Occurrences:"); + foreach (var o in occurrences) + { + var e = (CalendarEvent)o.Source; + Console.WriteLine($"\t{e.Uid.Substring(0,7)} {o.Period.StartTime.Value} {o.Period.EndTime.Value} {e.Summary}"); + } + + Assert.That(occurrences, Is.Not.Empty); + } +} From 7610c8e45a235af42874117f5bac1b22b31282b7 Mon Sep 17 00:00:00 2001 From: Ramon Smits Date: Wed, 17 Sep 2025 16:39:53 +0200 Subject: [PATCH 2/5] Minimize ical data for test --- Ical.Net.Tests/OccurrenceIssue.cs | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/Ical.Net.Tests/OccurrenceIssue.cs b/Ical.Net.Tests/OccurrenceIssue.cs index 8a3a1dbd1..0a438d989 100644 --- a/Ical.Net.Tests/OccurrenceIssue.cs +++ b/Ical.Net.Tests/OccurrenceIssue.cs @@ -14,37 +14,22 @@ public void MissingOccurrences() { var cal = Calendar.Load(""" BEGIN:VCALENDAR - PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 - CALSCALE:GREGORIAN - METHOD:PUBLISH - X-WR-CALNAME:Non-Critical Support Roster - X-WR-TIMEZONE:UTC + PRODID:-//Test//EN BEGIN:VEVENT DTSTART;VALUE=DATE:20251103 DTEND;VALUE=DATE:20251124 RRULE:FREQ=WEEKLY;WKST=MO;INTERVAL=48;BYDAY=MO - DTSTAMP:20250912T100327Z - UID:00p0ja7t2446ja22sl02ah2uun@google.com - CREATED:20250214T230308Z - LAST-MODIFIED:20250409T173619Z - SEQUENCE:1 - STATUS:CONFIRMED - SUMMARY:QWERTY - TRANSP:TRANSPARENT + UID:test-uid@example.com + SUMMARY:Master Event END:VEVENT BEGIN:VEVENT DTSTART;VALUE=DATE:20251103 DTEND;VALUE=DATE:20251124 - DTSTAMP:20250912T100327Z - UID:00p0ja7t2446ja22sl02ah2uun@google.com + UID:test-uid@example.com RECURRENCE-ID;VALUE=DATE:20251103 - CREATED:20250214T230308Z - LAST-MODIFIED:20250428T170953Z SEQUENCE:1 - STATUS:CONFIRMED - SUMMARY:QWERTY - TRANSP:TRANSPARENT + SUMMARY:Override Event END:VEVENT END:VCALENDAR """)!; From aa509d857315b6d751265ea8cdcca03054004e5e Mon Sep 17 00:00:00 2001 From: Ramon Smits Date: Wed, 17 Sep 2025 16:41:46 +0200 Subject: [PATCH 3/5] Cleanup --- Ical.Net.Tests/OccurrenceIssue.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Ical.Net.Tests/OccurrenceIssue.cs b/Ical.Net.Tests/OccurrenceIssue.cs index 0a438d989..7d58e0005 100644 --- a/Ical.Net.Tests/OccurrenceIssue.cs +++ b/Ical.Net.Tests/OccurrenceIssue.cs @@ -40,8 +40,6 @@ public void MissingOccurrences() Console.WriteLine($"\t{e.Uid.Substring(0,7)} {e.Start.Value} {e.End.Value} {e.Summary}"); } - var dt = new CalDateTime(new DateTime(2026,1,1)); - var occurrences = cal .GetOccurrences( new DateTime(2025, 1, 1), From 7baac011e909d4054029d3676203d1772fbb5386 Mon Sep 17 00:00:00 2001 From: Ramon Smits Date: Wed, 17 Sep 2025 16:42:01 +0200 Subject: [PATCH 4/5] Added more asserts and using values are currently returned by v4 --- Ical.Net.Tests/OccurrenceIssue.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Ical.Net.Tests/OccurrenceIssue.cs b/Ical.Net.Tests/OccurrenceIssue.cs index 7d58e0005..fb83f4f65 100644 --- a/Ical.Net.Tests/OccurrenceIssue.cs +++ b/Ical.Net.Tests/OccurrenceIssue.cs @@ -43,9 +43,11 @@ public void MissingOccurrences() var occurrences = cal .GetOccurrences( new DateTime(2025, 1, 1), - new DateTime(2026, 1, 1) - ); - //.TakeWhile(p => p.Period.StartTime <= dt); + new DateTime(2027, 1, 1) + ) + .OrderBy(e => e.Period.StartTime) + .ToList(); + Console.WriteLine("Occurrences:"); foreach (var o in occurrences) @@ -54,6 +56,16 @@ public void MissingOccurrences() Console.WriteLine($"\t{e.Uid.Substring(0,7)} {o.Period.StartTime.Value} {o.Period.EndTime.Value} {e.Summary}"); } - Assert.That(occurrences, Is.Not.Empty); + using (Assert.EnterMultipleScope()) + { + Assert.That(occurrences, Has.Count.EqualTo(2)); + // The first occurrence should be the overridden one + Assert.That(occurrences[0].Period.StartTime, Is.EqualTo(new CalDateTime(2025, 11,3))); + Assert.That(occurrences[0].Source.RecurrenceId, Is.EqualTo(new CalDateTime(2025, 11, 3))); + Assert.That(occurrences[1].Period.StartTime, Is.EqualTo(new CalDateTime(2026, 10, 5))); + // Not sure why the following is null, in v5 it is not null + Assert.That(occurrences[1].Source.RecurrenceId, Is.Null); + Assert.That(((CalendarEvent) occurrences[0].Source).Summary, Is.EqualTo("Override Event")); + } } } From 560ccea1104c1ac3f1c549e9ae404e43d99a729a Mon Sep 17 00:00:00 2001 From: Ramon Smits Date: Wed, 17 Sep 2025 16:46:41 +0200 Subject: [PATCH 5/5] Include current dump in test --- Ical.Net.Tests/OccurrenceIssue.cs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Ical.Net.Tests/OccurrenceIssue.cs b/Ical.Net.Tests/OccurrenceIssue.cs index fb83f4f65..28cca3557 100644 --- a/Ical.Net.Tests/OccurrenceIssue.cs +++ b/Ical.Net.Tests/OccurrenceIssue.cs @@ -34,12 +34,6 @@ public void MissingOccurrences() END:VCALENDAR """)!; - Console.WriteLine("Events:"); - foreach (var e in cal.Events.OrderBy(x=>x.Start)) - { - Console.WriteLine($"\t{e.Uid.Substring(0,7)} {e.Start.Value} {e.End.Value} {e.Summary}"); - } - var occurrences = cal .GetOccurrences( new DateTime(2025, 1, 1), @@ -49,17 +43,30 @@ public void MissingOccurrences() .ToList(); + Console.WriteLine("Events:"); + foreach (var e in cal.Events.OrderBy(x=>x.Start)) + { + Console.WriteLine($"\t{e.Uid} {e.Start.Value} {e.End.Value} {e.Summary}"); + } Console.WriteLine("Occurrences:"); foreach (var o in occurrences) { var e = (CalendarEvent)o.Source; - Console.WriteLine($"\t{e.Uid.Substring(0,7)} {o.Period.StartTime.Value} {o.Period.EndTime.Value} {e.Summary}"); + Console.WriteLine($"\t{e.Uid} {o.Period.StartTime.Value} {o.Period.EndTime.Value} {e.Summary}"); } + /* + Events: + test-uid@example.com 11/3/2025 12:00:00 AM 11/24/2025 12:00:00 AM Master Event + test-uid@example.com 11/3/2025 12:00:00 AM 11/24/2025 12:00:00 AM Override Event + Occurrences: + test-uid@example.com 11/3/2025 12:00:00 AM 11/24/2025 12:00:00 AM Override Event + test-uid@example.com 10/5/2026 12:00:00 AM 10/26/2026 12:00:00 AM Master Event + */ + using (Assert.EnterMultipleScope()) { Assert.That(occurrences, Has.Count.EqualTo(2)); - // The first occurrence should be the overridden one Assert.That(occurrences[0].Period.StartTime, Is.EqualTo(new CalDateTime(2025, 11,3))); Assert.That(occurrences[0].Source.RecurrenceId, Is.EqualTo(new CalDateTime(2025, 11, 3))); Assert.That(occurrences[1].Period.StartTime, Is.EqualTo(new CalDateTime(2026, 10, 5)));